티스토리 뷰

 

일일이 했던 설정들을

작업환경을 자동으로 설정해주는 Legacy Project

 

1. Spring MVC

(1) Spring MVC Process

[ 사용자 요청 ] [ 디스패쳐(Dispatcher) ]
[ 컨트롤러(Controller) ]

    [ 뷰(View) ]    

① HandlerMapping : 디스패쳐가 사용자 요청에 따른 컨트롤러를 선택(실행)하도록 하는 것. <url.mapping>

② ViewResolver : 컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체를 구한다.

-컨트롤러(Controlloer) : 뷰(View), 모델(Model)에 데이터를 실어서 디스패쳐에게 돌려줌.

-디스패쳐(Dispatcher) : 모델에 실어진 데이터를 뷰에 담아서 사용자에게 보여줌.

 


2. Spring Legacy Project

(1) STS4 Legacy Project 생성을 위한 준비

① Exlipse Marketplace : Spring Tools 3 Add-One for Wpring Tools4 3.9.21. RELEASE

② Exception initialize 오류 수정

SpringToolSuit4.ini : (JDK 폴더) 경로\javaw.exe 추가 후 저장

③ Convert 오류 수정

STS4 실행 아이콘 우클릭 :  -clean 입력 후 저장

(* 자세한 설명은 [03_1] 참고)

 

(2) Spring Legacy Project 기본 구조 살펴보기

(2-1) 생성

-그룹패키지명 : 3단계 작성(com.이름.프로젝트 주제) ex) com.wsy.web_board

 └실제 사용하는 패키지는 3단계 사용  ex) com.wsy.controller, com.wsy.service …

 └패키지 이름은 소문자와 언더바 조합

 

(2-2) web_board pom.xml

-필요에 따라 Java, Spring, Servlet, Junit 등 버전 변경

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.wsy</groupId>
	<artifactId>web_board</artifactId>
	<name>web_board</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<!-- ★ 자바, 스프링 버전 -->
		<java-version>1.6</java-version>
		<org.springframework-version>3.1.1.RELEASE</org.springframework-version>
		<!-- ↑ maven repository에서 코드 가져올 필요 없이 해당하는 버전만 입력하면 됨. -->
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version>
		<!-- 아직 안 쓰는 거라 수정하지 않음. -->
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				 </exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
				
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet --><!-- ★ 버전 변경? No 안 고침 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	
		<!-- Test --><!-- ★ 버전 변경? 4.7 → 4.12 변경 -->
		<!--  junit :  java 단위 테스트 도구. 함수가 제대로 작동하는지 등의 확인 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.7</version>
			<scope>test</scope>
		</dependency>        
	</dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
            	<!-- ★ 메이븐 컴파일러  source, target 버전 변경-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>1.6</source>
                    <target>1.6</target>
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

(2-3) web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name><!-- 디스패쳐 서블릿 -->
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
</web-app>

 

(2-4) servlet-context.xml

src/main/webapp/WEB-INF/spring/appServlet

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:beans="http://www.springframework.org/schema/beans"
	xmlns:context="http://www.springframework.org/schema/context"
	xsi:schemaLocation="http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd
		http://www.springframework.org/schema/beans https://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

	<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
	
	<!-- Enables the Spring MVC @Controller programming model -->
	<annotation-driven /> <!-- ★ 리퀘스트 매핑(@RequestMapping) -->

	<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
	<resources mapping="/resources/**" location="/resources/" />
	<!-- ★ resources 폴더 이름으로 접근. -->

	<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
	<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
		<beans:property name="prefix" value="/WEB-INF/views/" />
		<beans:property name="suffix" value=".jsp" />
	</beans:bean>
	
	<context:component-scan base-package="com.wsy.web_board" />
	<!-- ★베이스 패키지 밑에 패키지를 만들어나가면, 하위 패키지는 자동으로 스캔(뒤짐) -->
</beans:beans>

 

(2-5) HomeController

src/main/java - com.wsy.web_board - HomeController

package com.wsy.web_board;

import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

/**
 * Handles requests for the application home page.
 */
@Controller
public class HomeController {
	
	//Logger : 함수의 값이 제대로 넘어왔나 확인. System.out 같은 역할인데 보다 편한 것. 만들어 놓고 필요할 때마다 가져다 쓰면 됨.
	private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
	
	
/* Simply selects the home view to render by returning its name. */
	
	//디스패쳐 서블릿 : 사용자 요청 받음 → HomeController가 url 매핑 찾음 
	@RequestMapping(value = "/", method = RequestMethod.GET)
	public String home(Locale locale, Model model) { //스프링은 매개변수를 받는 폭이 넓음. 객체 생성하지 않아도 그냥 적어주면 됨. Model model
		logger.info("Welcome home! The client locale is {}.", locale);
		// 콘솔에 찍는 것
		
		Date date = new Date(); //실행되는 시간
		DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
		//Long 형태로 받겠다, Locale 지역 날짜, 시간 반영
		
		String formattedDate = dateFormat.format(date);
		
		model.addAttribute("serverTime", formattedDate );
		
		return "home"; //prefix, suffix를 가진 home.jsp 있어야 함.
		//거기로 데이터 전송한다는 뜻.
		// >> view - home.jsp 이동
	}
	
}

(*method를 명시적으로 적지 않으면 get이 기본)

 

(2-6) home.jsp

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ page session="false" %>
<html>
<head>
	<title>Home</title>
</head>
<body>
<h1>
	Hello world!  
</h1>

<P>  The time on the server is ${serverTime}. </P>
</body>
</html>

 

(2-7) 한글 깨짐 처리

기본으로 만들어진 index 화면에 현재 날짜가 출력되는데, 한글이 깨진 상태. >> 구글링해서 코드 web.xml에 붙여넣기

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">

	<!-- The definition of the Root Spring Container shared by all Servlets and Filters -->
	<context-param>
		<param-name>contextConfigLocation</param-name>
		<param-value>/WEB-INF/spring/root-context.xml</param-value>
	</context-param>
	
	<!-- Creates the Spring Container shared by all Servlets and Filters -->
	<listener>
		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
	</listener>

	<!-- Processes application requests -->
	<servlet>
		<servlet-name>appServlet</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<init-param>
			<param-name>contextConfigLocation</param-name> <!-- 디스패쳐 서블릿 -->
			<param-value>/WEB-INF/spring/appServlet/servlet-context.xml</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup>
	</servlet>
		
	<servlet-mapping>
		<servlet-name>appServlet</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>
	<!--★ 한글 깨짐 방지 처리 ★-->
	<filter>
		<filter-name>encodingFilter</filter-name> <!--필터 이름 -->
		<filter-class>org.springframework.web.filter.CharacterEncodingFilter
		</filter-class>
		<init-param>
			<param-name>encoding</param-name>
			<param-value>UTF-8</param-value> <!--인코딩방법 -->
		</init-param>
		<init-param>
			<param-name>forceEncoding</param-name> <!--강제로 해라 -->
			<param-value>true</param-value>
		</init-param>
	</filter>

	<filter-mapping> <!--한글 필터 어디까지 적용할 것인가? -->
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>  <!--루트 아래 전부 -->
	</filter-mapping>
</web-app>

└이렇게 한번만 해주면 한글 깨짐 방지 처리 완료. JSP 할 때는 필요할 때마다 setCharacterEndcoding 해줘야 했는데...간편.

 


3. Spring MVC Project

-웹 게시판 만들기

(1) Spring Legacy Project 생성

-Project name : web_board // Srping MVC Project 선택

-그룹 패키지명 : com.wsy.web_board

 

(2) 필요한 환경 설정 - pom.xml

버전 변경

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/maven-v4_0_0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>com.wsy</groupId>
	<artifactId>web_board</artifactId>
	<name>web_board</name>
	<packaging>war</packaging>
	<version>1.0.0-BUILD-SNAPSHOT</version>
	<properties>
		<!-- ★ 자바, 스프링 버전 -->
		<java-version>11</java-version><!-- ★ -->
		<org.springframework-version>5.2.19.RELEASE</org.springframework-version>
		<org.aspectj-version>1.6.10</org.aspectj-version>
		<org.slf4j-version>1.6.6</org.slf4j-version><!-- 아직 안 쓰는 거라 수정하지 않음. -->
	</properties>
	<dependencies>
		<!-- Spring -->
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-context</artifactId>
			<version>${org.springframework-version}</version>
			<exclusions>
				<!-- Exclude Commons Logging in favor of SLF4j -->
				<exclusion>
					<groupId>commons-logging</groupId>
					<artifactId>commons-logging</artifactId>
				 </exclusion>
			</exclusions>
		</dependency>
		<dependency>
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>${org.springframework-version}</version>
		</dependency>
				
		<!-- AspectJ -->
		<dependency>
			<groupId>org.aspectj</groupId>
			<artifactId>aspectjrt</artifactId>
			<version>${org.aspectj-version}</version>
		</dependency>	
		
		<!-- Logging -->
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-api</artifactId>
			<version>${org.slf4j-version}</version>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>jcl-over-slf4j</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.slf4j</groupId>
			<artifactId>slf4j-log4j12</artifactId>
			<version>${org.slf4j-version}</version>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>log4j</groupId>
			<artifactId>log4j</artifactId>
			<version>1.2.15</version>
			<exclusions>
				<exclusion>
					<groupId>javax.mail</groupId>
					<artifactId>mail</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.jms</groupId>
					<artifactId>jms</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jdmk</groupId>
					<artifactId>jmxtools</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.sun.jmx</groupId>
					<artifactId>jmxri</artifactId>
				</exclusion>
			</exclusions>
			<scope>runtime</scope>
		</dependency>

		<!-- @Inject -->
		<dependency>
			<groupId>javax.inject</groupId>
			<artifactId>javax.inject</artifactId>
			<version>1</version>
		</dependency>
				
		<!-- Servlet --><!-- ★ 버전 변경? No 안 고침 -->
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>servlet-api</artifactId>
			<version>2.5</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet.jsp</groupId>
			<artifactId>jsp-api</artifactId>
			<version>2.1</version>
			<scope>provided</scope>
		</dependency>
		<dependency>
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>
	
		<!-- Test --><!-- ★ 버전 변경? 4.7 → 4.12 변경 -->
		<!--  junit :  java 단위 테스트 도구. 함수가 제대로 작동하는지 등의 확인 -->
		<dependency>
			<groupId>junit</groupId>
			<artifactId>junit</artifactId>
			<version>4.12</version><!-- ★ -->
			<scope>test</scope>
		</dependency>        
	</dependencies>
    <build>
        <plugins>
            <plugin>
                <artifactId>maven-eclipse-plugin</artifactId>
                <version>2.9</version>
                <configuration>
                    <additionalProjectnatures>
                        <projectnature>org.springframework.ide.eclipse.core.springnature</projectnature>
                    </additionalProjectnatures>
                    <additionalBuildcommands>
                        <buildcommand>org.springframework.ide.eclipse.core.springbuilder</buildcommand>
                    </additionalBuildcommands>
                    <downloadSources>true</downloadSources>
                    <downloadJavadocs>true</downloadJavadocs>
                </configuration>
            </plugin>
            <plugin>
            	<!-- ★ 메이븐 컴파일러  source, target 버전 변경-->
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>2.5.1</version>
                <configuration>
                    <source>11</source><!-- ★ -->
                    <target>11</target><!-- ★ -->
                    <compilerArgument>-Xlint:all</compilerArgument>
                    <showWarnings>true</showWarnings>
                    <showDeprecation>true</showDeprecation>
                </configuration>
            </plugin>
            <plugin>
                <groupId>org.codehaus.mojo</groupId>
                <artifactId>exec-maven-plugin</artifactId>
                <version>1.2.1</version>
                <configuration>
                    <mainClass>org.test.int1.Main</mainClass>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

 

 

>> 출력(프로젝트 Run As)

Hello world!

The time on the server is 2022년 3월 3일 오후 9시 6분 15초 KST.

 

(3) 클래스 생성 - MyController

-패키지 : com.wsy.web_board.controller

-클래스 : MyController

package com.wsy.web_board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller //controller임을 명시
public class MyController {
	
    //1.
//	@RequestMapping("list") //논리뷰 이름
//	public String List() {
//		return "list"; //view 찾음. list.jsp 파일이 있어야 한다.
//		//WEB-INF/views/list.jsp 있어야 함.
//	}
	
	// 2. view 이름이 없을 때, 리턴 x
	@RequestMapping("list")
	public void list() {
		
	}//view 이름을 주지 않으면, urlmapping으로 찾음.
}

(3-1) list.jsp 생성

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title> List Page</title>
</head>
<body>
	<h5>List Page</h5>
</body>
</html>

>> 결과 출력 : 프로젝트 실행(Run As)

1번이든 2번이든 http://localhost:8080/web_board/list 호출했을 때, 아래와 같이 뜸.

list page

 

(3-3) 매개변수

package com.wsy.web_board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;

@Controller //controller임을 명시
public class MyController {

	//3. 모델에 데이터 전달하고 싶을때, request 쓸 필요없이 Model model 쓰면 됨.
	@RequestMapping("list")
	public void list(String name, String pw, Model model) {
		model.addAttribute("name", name);
		model.addAttribute("pw", pw);
		System.out.println(name);
		System.out.println(pw); 
	}
	
	//4. 
	@RequestMapping("list")
	public String list1(@RequestParam("n") String name, @RequestParam("p") String pw, Model model) {
		model.addAttribute("name", name);
		model.addAttribute("pw", pw);
		return "list";
	}
    //@RequestParam은 값을 꼭 넣어줘야 함.
    //요청 : http://localhost:8080/web_board/list?a=admin&p=1234
    //name에 admin, pw에 1234 할당
	
	//5.
	@RequestMapping("list/{n}") // n을 받아서 name에 할당한다는 뜻.
	public String list2(@PathVariable("n") String name, Model model) {
		model.addAttribute("name", name);
		return "list";
	}
    //요청 : http://localhost:8080/web_board/list/aaa → name에 aaa 할당
}

>> 결과 출력 : 프로젝트 우클릭 실행(Run As)

http://localhost:8080/web_board/list를 실행했을 때,

3번 4번 - @RequestParam("") 5번 - @PathVariable("")
값을 넣든 넣지 않는 출력은 됨 값을 넣지 않으면 출력되지 않음. 데이터를 받아 할당한다는 뜻.
List Page
NAME :
P W :
400 Error  
List Page
NAME : admin
P W : 1234
   

└3번 : 쿼리스트링(값을 넣었을때) : http://localhost:8080/web_board/list?n=admin&&p=1234

└5번 : http://localhost:8080/web_board/list/admin

 

(4) method 설정

package com.wsy.web_board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언 가.
public class MyController {
	
	//메소드 설정 방법
//	@RequestMapping(value="list", method=RequestMethod.GET) //method 설정 1 - 초기방법
	@GetMapping("list") //method 설정 2 - get 방식
//	PostMapping("list") //method 설정 3 - post 방식
	public void List(String name, String pw, Model model) {
		model.addAttribute("name", name);
		model.addAttribute("pw", pw);
		System.out.println(name);
		System.out.println(pw);
	}
}

└@RequestMapping을 반드시 적어야 하는 경우, 맨위에서 공통적인 것을 표현할 때. 하위에서 get이나 post 사용 가능.

>> 결과 출력 : http://localhost:8080/web_board/list?name=admin&pw=123

웹 브라우저 콘솔
List Page
NAME : admin
P W : 123
admin
123

 

(5) 호출 url 간결화

-Servers >> 모듈즈 >> Path edit : 슬래시(/)만 남기고 삭제(프로젝트 이름 삭제)

 

(6) 데이터가 객체로 넘어올 때,

JSP에서는 객체의 데이터를 꺼내서 받았는데, 스프링은 그런 과정 생략

(6-1)

-MyController

package com.wsy.web_board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;

@Controller //controller임을 명시
@RequestMapping("/board/") //board 밑에 무언가
public class MyController {
	
	@GetMapping("input")
	public String inputForm() {
		return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
	}
	@GetMapping("list")
	public void list(String name, String pw, Model model) {
		model.addAttribute("name", name);
		model.addAttribute("pw", pw);
		System.out.println(name);
		System.out.println(pw);
	}
}

 

-input.jsp 생성

-폴더 생성 :  src / main / webapp / WEB-INF / views / board

-jsp 생성 : input

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<form action="insert" method="post">
		<table>
			<tr>
				<td>아이디</td>
				<td><input type="text" name="id" /></td>
			</tr>
			<tr>
				<td>비밀번호</td>
				<td><input type="text" name="pw" /></td>
			</tr>
			<tr>
				<td>전화번호</td>
				<td><input type="text" name="tel" /></td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="submit" /></td>
			</tr>
		</table>
	</form>
</body>
</html>

 

(6-2) 데이터 한 개씩 받는 법 - JSP에서 하듯이

-MyController

package com.wsy.web_board.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.wsy.web_board.Member;

@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {

	@GetMapping("input")
	public String inputForm() {
		return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
	}
    
	@PostMapping("insert")
	public String insert(HttpServletRequest request, Model model) {
		//값 가져오기
		String id = request.getParameter("id");
		String pw = request.getParameter("pw");
		String tel = request.getParameter("tel");
		//값 넣기
		model.addAttribute("id", id);
		model.addAttribute("pw", pw);
		model.addAttribute("tel", tel);
		return "board/content"; // board 폴더 안에 content.jsp 있어야 함
	}
}

-content.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
id : ${id }<br>
pw : ${pw }<br>
tel : ${tel }<br>
</body>
</html>

>> 결과 : http://localhost:8080/board/input → insert

id : admin
pw : 1234
tel : 01012345678

위의 방법은 옛날 방법.

요즘에는 회원가입할 때, 입력해야 할 것들이 많음. 그래서 '객체 단위'로 받는 방법.

 

(6-3) 객체 단위

-클래스 생성 : Member

 패키지 이름 : com.wsy.web_board

 클래스 이름 : Member

package com.wsy.web_board;

public class Member {
	private String id;
	private String pw;
	private String tel;
	
	//생성자
	public Member() {
		// default
	}
	
	public Member(String id, String pw, String tel) {
		super();
		this.id = id;
		this.pw = pw;
		this.tel = tel;
	}
	
	//getter/setter
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public String getPw() {
		return pw;
	}
	public void setPw(String pw) {
		this.pw = pw;
	}
	public String getTel() {
		return tel;
	}
	public void setTel(String tel) {
		this.tel = tel;
	}
	
	//toString
	@Override
	public String toString() {
		return "Member [id=" + id + ", pw=" + pw + ", tel=" + tel + "]";
	}
}

 

-MyController

package com.wsy.web_board.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.wsy.web_board.Member;

@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {
	//1.
	@PostMapping("insert")
	public String insert(Member member, Model model) { //데이터를 받는 것 model
		model.addAttribute("member", member);
		//클래스(Member)와 변수(member)가 대/소문자만 다르고 같을 때, 모델에 싣지 않아도 데이터가 감.
		//어디까지?
		//모델에 실을 경우, 이름을 원하는 대로 설정할 수 있음. 보통 긴 경우, 축약해서 쓸 때.
		return "board/content";
	}
	
	//2. 클래스와 변수가 다를 경우,
	@PostMapping("insert")
	public String insert(Member mem, Model model) { //데이터를 받는 것 model
		model.addAttribute("memberInfo", mem);
		//이때, view인 content.jsp에 memberInfo라는 데이터를 받을 것이 있어야 함.
		return "board/content";
	}
	
	@GetMapping("input")
	public String inputForm() {
		return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
	}

	//메소드 설정 방법
	@GetMapping("list") //method 설정 2 - get 방식
	public void List(String name, String pw, Model model) {
		model.addAttribute("name", name);
		model.addAttribute("pw", pw);
		System.out.println(name);
		System.out.println(pw);
	}

}

└1번과 2번 중 선택. 둘 다 활성화하면 오류.

 

-content.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
id : ${member.id }<br> <!-- member는 MyController에서 1번 Member member -->
pw : ${member.pw }<br> <!-- id는 getId -->
tel : ${member.tel }<br>

<!-- 2.번 memberInfo --> <!--사용할 땐, 둘 중 하나 -->
id : ${memberInfo.id }<br> 
pw : ${memberInfo.pw }<br> 
tel : ${memberInfo.tel }<br>
</body>
</html>

└set함수와 form의 name을 매칭해서 값을 넣음.

 

>> 출력 : http://localhost:8080/board/input

입력 폼에서 아이디, 비밀번호, 전화번호 입력하면 입력값이 출력됨. 

 

(6-4) 클래스 이름, 변수 이름 상관관계

//1.
@PostMapping("insert")
public String insert(Member member, Model model) { //데이터를 받는 것 model
	model.addAttribute("member", member);
    return "board/content";
}

//1-1. 클래스(Member)와 변수(member)가 대/소문자만 다르고 같을 때, 모델에 싣지 않아도 데이터 전송.
@PostMapping("insert")
public String insert(Member member, Model model) {
	
    return "board/content";
}

//2. 클래스와 변수가 다를 때,
@PostMapping("insert")
public String insert(Member mem, Model model) {
	model.addAttribute("memberInfo", mem);
	return "board/content";
    //이때, view인 content.jsp에 memberInfo라는 데이터를 받을 것이 있어야 함.
}

//2-1. 클래스와 변수가 다를 때, 모델에 싣는 거 생략하면
@PostMapping("insert")
public String insert(Member mem, Model model) {
	return "board/content";
}

└2-1번은 실행했을 때, 오류는 없지만 입력값이 전달되지 않음.

 

(7) redirect

보통 게시판에서 데이터 입력하고 나면, 리스트 페이지 호출

package com.wsy.web_board.controller;

import javax.servlet.http.HttpServletRequest;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import com.wsy.web_board.Member;

@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {
	
	@PostMapping("insert") //★
	public String insert(@ModelAttribute("mem") Member mem) {
		if(mem.getId().equals("aaa")&&mem.getPw().equals("1234")) {
			return "board/content";
		}
		return "redirect:input"; //다시 한번 controller 메소드를 부르는 것.
		//뷰 이름을 리턴(리턴은 리턴하고 벗어남) - input
		//redirect : 또 다른 컨트롤러 호출
		//만약에, 인서트 후 바로 return "board/list"; 하면 디비 내용이 안 나옴. 반영 안 됨.
	}
	
	@GetMapping("input")
	public String inputForm() {
		return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
	}

	//메소드 설정 방법
	@GetMapping("list") //method 설정 2 - get 방식
	public void List(String name, String pw, Model model) {
		model.addAttribute("name", name);
		model.addAttribute("pw", pw);
		System.out.println(name);
		System.out.println(pw);
	}
}

>> 결과

입력 폼 페이지에서 아이디 aaa, 비밀번호 1234를 입력하면 입력값이 출력되는 페이지로 넘어가지만,

그 외의 아이디, 비밀번호를 입력할 경우 input 화면

 

(7-1) redirect할 때, 데이터를 함께 보내고 싶으면 매개변수 추가 - RedirectAttributes

-MyController

package com.wsy.web_board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.wsy.web_board.Member;

@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {
	
	@PostMapping("insert")
	public String insert(@ModelAttribute("mem") Member mem, RedirectAttributes rttr) { //데이터 받는 것 Model
		if(mem.getId().equals("aaa")&&mem.getPw().equals("1234")) {
			return "board/content";
		} else {
        	//1. 그냥
        	rttr.addFlashAttribute("msg", "아이디 또는 비밀번호가 틀렸습니다.");
            //2. flash
			rttr.addFlashAttribute("msg", "아이디 또는 비밀번호가 틀렸습니다."); //input.jsp까지 감.
			return "redirect:input"; //다시 한번 controller 메소드를 부르는 것.
		}
		//입력 페이지에서 앞으로뒤로 왔다갔다할 때도 출력.
		//flash는 처음 한 번만 출력될 때 사용
		
		//다시 input 호출
		//만약에, 인서트 후 바로 return "board/list";하면 디비 내용이 안 나옴.
		//뷰 이름을 리턴
		//또다른 컨트롤러 호출 ; redirect
		//return은 리턴하고 벗어남.
		//redirect 할 때도 데이터를 보내고 싶을 때, 매개변수 추가 RedirectAttributes
	}
	
	@GetMapping("input")
	public String inputForm() {
		return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
	}
	
	//메소드 설정 방법
	@GetMapping("list") //method 설정 2 - get 방식
	public void List(String name, String pw, Model model) {
		model.addAttribute("name", name);
		model.addAttribute("pw", pw);
		System.out.println(name);
		System.out.println(pw);
	}

}

 

-input.jsp

msg를 띄울 위치는 설정

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p>${msg }</p> <!--★-->
	<form action="insert" method="post">
		<table>
			<tr>
				<td>아이디</td>
				<td><input type="text" name="id" /></td>
			</tr>
			<tr>
				<td>비밀번호</td>
				<td><input type="text" name="pw" /></td>
			</tr>
			<tr>
				<td>전화번호</td>
				<td><input type="text" name="tel" /></td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="submit" /></td>
			</tr>
		</table>
	</form>
</body>
</html>

 

>> 결과 : http://localhost:8080/board/input

아이디 aaa, 비밀번호 1234를 입력하면 페이지 넘어감.

잘못된 아이디 또는 비밀번호를 입력할 경우, 설정한 메시지 출력됨.

이때, 플래시(flash)는 앞/뒤로 왔다갔다해도 한 번만 출력되지만 그냥은 계속 출력됨.

 

(8) 리턴 타입

-return ModelAndView; 옛날 방식

-String

-void : 단순히 화면 열기만 할 때 사용

-json(데이터 표시하는 방법) : 객체 타입으로 리턴 가능

-@ResponseBody : 웹브라우저 바디에 리턴(그냥 웹 브라우저에 출력되는 것)

-⁠ResponseEntity : 객체와 http 헤더 정보를 추가적으로 보낼 때, 리턴할 때. Ajax랑 같이 쓰는 게 좋음.

 (*헤더 정보에 httpStatus.OK)

 (받는 쪽에서 정상적으로 접속이 완료됐다. 같은 거 할 때)

 

(8-1) json

-maven repository : jackson data코드 pom.xml  <dependencies> 태그 사이에 복붙

-MyController

package com.wsy.web_board.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import com.wsy.web_board.Member;

@Controller //controller임을 명시
@RequestMapping("/board/") //공통적인 것. board 밑에 무언가. //폴더 생성해줘야 함
public class MyController {
//	//리턴 타입
//	@GetMapping("res")
//	public @ResponseBody Member getMember(Member member) {
//		return member; //form에서 전달된 데이터 리턴
//	}
	
	//데이터를 직접 만들어서 사용
	//리턴 타입 //@ResponseBod 웹 브라우저 바디에 데이터 리턴
	@GetMapping("res")
	public @ResponseBody Member getMember() {
		//객체를 직접 만들어서 사용
		Member member = new Member("aaa", "1234", "010-0000-0000");
		return member;
	}
	
	@PostMapping("insert")
	public String insert(@ModelAttribute("mem") Member mem, RedirectAttributes rttr) { //데이터 받는 것 Model
		if(mem.getId().equals("aaa")&&mem.getPw().equals("1234")) {
			return "board/content";
		} else {
			rttr.addFlashAttribute("msg", "아이디 또는 비밀번호가 틀렸습니다."); //input.jsp까지 감.
			return "redirect:input"; //다시 한번 controller 메소드를 부르는 것.
		}
	}
	
	@GetMapping("input")
	public String inputForm() {
		return "board/input"; // 입력 폼 input.jsp가 열리도록 연결만 하고 있음.
	}
	
	//메소드 설정 방법
	@GetMapping("list") //method 설정 2 - get 방식
	public void List(String name, String pw, Model model) {
		model.addAttribute("name", name);
		model.addAttribute("pw", pw);
		System.out.println(name);
		System.out.println(pw);
	}
}

-input.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
	<p>${msg }</p><!-- ★ action="res" -->
	<form action="res" method="post">
		<table>
			<tr>
				<td>아이디</td>
				<td><input type="text" name="id" /></td>
			</tr>
			<tr>
				<td>비밀번호</td>
				<td><input type="text" name="pw" /></td>
			</tr>
			<tr>
				<td>전화번호</td>
				<td><input type="text" name="tel" /></td>
			</tr>
			<tr>
				<td colspan="2"><input type="submit" value="submit" /></td>
			</tr>
		</table>
	</form>
</body>
</html>

>> 결과 출력 : http://localhost:8080/board/res

{"id":"aaa","pw":"1234","tel":"010-0000-0000"}

 

(8-2) 리스트 형식 - 데이터 직접 입력(디비 미연결 상태라)

-MyController

@GetMapping("res2")
public @ResponseBody List<Member> getList(){
	//디비 연결되어 있으면, List는 보통 디비에서 가져오겠지. 지금은 연결 안 되어 있으니까.
	List<Member> memberList = new ArrayList<Member>();
	memberList.add(new Member("aaa","111","010-0000"));
	memberList.add(new Member("abc","222","010-0001"));
	memberList.add(new Member("acd","333","010-0002"));
	return memberList;
}

>> 결과 출력 : http://localhost:8080/board/res2

 

[{"id":"aaa","pw":"111","tel":"010-0000"},{"id":"abc","pw":"222","tel":"010-0001"},{"id":"acd","pw":"333","tel":"010-0002"}]

 

(8-3) ResponseEntity

-MyController

@GetMapping("res3")
public ResponseEntity<Member> getEntity(){
	Member member = new Member("aaa", "1234", "010-0000-0000");
	HttpHeaders header = new HttpHeaders();
	header.add("Content-Type", "application/json;charset=UTF-8");
	return new ResponseEntity<Member>(member, header, HttpStatus.OK);
}

>> 결과 출력 : http://localhost:8080/board/res3

{"id":"aaa","pw":"1234","tel":"010-0000-0000"}

>> 웹 브라우저 >> [F12] >> 네트워크 >> [F5] 새로고침하면 상태볼 수 있음.

 

 

 

- 2022.03.03 복습 코드 -

0303web_board.zip
0.03MB

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/01   »
1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30 31
글 보관함