상세 컨텐츠

본문 제목

[스프링2] 9장. 스프링 MVC 시작하기

22-23/22-23 Spring 2

by YUZ 유즈 2022. 11. 24. 10:00

본문

728x90

 

9장의 키워드

# MVC
# 스프링 MVC

# DispatcherServlet

# JSP

# HTTP 요청 파라미터


 

# MVC

Model - View - Controller의 구조를 갖는 아키텍처 패턴

https://corner-ds.tistory.com/94

# 스프링 MVC

개발자들이 스프링을 사용하는 이유로, 스프링이 지원하는 웹 MVC 프레임워크를 사용할 수 있다는 이점을 꼽는다.

# 스프링 MVC 사용법

STEP 1. 프로젝트 생성 및 의존성 설정

pom.xml

  • <packaging> 태그의 값을 war(web application archive)로 설정
  • 의존 추가
    • 서블릿 3.1
    • JSP 2.3
    • JSTL 1.2
    • spring-webmvc
// sp5-chap09/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 
		http://maven.apache.org/xsd/maven-4.0.0.xsd">
	...
	<artifactId>sp5-chap09</artifactId>
	<packaging>war</packaging> <!--packaging 태그의 기본값은 jar-->
    	<!--서블릿/JSP 웹 어플리케이션을 개발할 경우 war(web application archive)로 설정-->
    
    	<!--스프링으로 웹 어플리케이션 개발에 필요한 의존 설정-->
	<dependencies>
		<dependency> <!--서블릿 3.1-->
			<groupId>javax.servlet</groupId>
			<artifactId>javax.servlet-api</artifactId> 
			<version>3.1.0</version>
			<scope>provided</scope>
		</dependency>

		<dependency> <!--JSP 2.3-->
			<groupId>javax.servlet.jsp</groupId> 
			<artifactId>javax.servlet.jsp-api</artifactId>
			<version>2.3.2-b02</version>
			<scope>provided</scope>
		</dependency>

		<dependency> <!--JSTL 1.2-->
			<groupId>javax.servlet</groupId>
			<artifactId>jstl</artifactId>
			<version>1.2</version>
		</dependency>

		<dependency> <!--spring-webmvc-->
			<groupId>org.springframework</groupId>
			<artifactId>spring-webmvc</artifactId>
			<version>5.0.2.RELEASE</version>
		</dependency>
	</dependencies>

	<build>
		...
	</build>

</project>


build.gradle 설정

  • 'war' 플러그인: 자바 웹 어플리케이션을 위한 플러그인
  • 서블릿 3.1
  • JSP 2.3
  • JSTL 1.2
  • spring-webmvc 모듈 의존 추가
// sp5-chap09/build.gradle 

apply plugin: 'java'
apply plugin: 'war'

sourceCompatibility = 1.8
targetCompatibility = 1.8
compileJava.options.encoding = "UTF-*"

repositories {
	mavenCentral()
}

dependencies {
	providedCompile 'javax.servlet:javax.servlet-api:3.1.0'
    prividedRuntime 'javax.servlet.jsp:javax.servlet.jsp-api:2.3.2-b02'
    compile 'javax.servlet:jstl:1.2'
    compile 'org.springframework:spring-webmvc:5.0.2.RELEASE'
}

task wrapper(type: Wrapper) {
	gradleVersion = '4.4'
}

 

STEP 2. 이클립스 톰캣 설정

톰캣 설치 ▶ https://tomcat.apache.org/

 

Apache Tomcat® - Welcome!

The Apache Tomcat® software is an open source implementation of the Jakarta Servlet, Jakarta Server Pages, Jakarta Expression Language, Jakarta WebSocket, Jakarta Annotations and Jakarta Authentication specifications. These specifications are part of the

tomcat.apache.org

책 235p 참고

 

STEP 3. 스프링MVC 설정

스프링 MVC를 실행하는 데 필요한 최소 설정 2가지

  • 스프링 MVC의 주요 설정
  • 스프링의 DispatcherServlet 설정

스프링 설정 파일 - 주요 설정 코드 작성

// sp5-chap09/src/main/java/config/MvcConfig.java

package config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.DefaultServletHandlerConfigurer;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
@EnableWebMvc // 스프링 MVC 설정을 활성화하는 애노테이션. 스프링 MVC를 사용하는데 필요한 다양한 설정을 생성
public class MvcConfig implements WebMvcConfigurer {

	// DispatcherServlet의 매핑 경로를 '/'로 주었을때, JSP/HTML/CSS 등을 올바르게 처리하기 위한 설정 추가
	@Override
	public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
		configurer.enable();
	}
	
    	// JSP를 이용해 컨트롤러의 실행 결과를 보여주기 위한 설정 추가
	@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		registry.jsp("/WEB-INF/view/", ".jsp");
	}

}

 

디스패처 서블릿(Dispatcher Servlet)이란?

HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러(Front Controller)

https://mangkyu.tistory.com/18

 

[Spring] Dispatcher-Servlet(디스패처 서블릿)이란? 디스패처 서블릿의 개념과 동작 과정

이번에는 servlet의 심화 또는 대표주자인 dispatcher-servlet에 대해서 알아보도록 하겠습니다. 1. Dispatcher-Servlet(디스패처 서블릿)의 개념 [ Dispatcher-Servlet(디스패처 서블릿) 이란? ] 디스패처 서블릿의

mangkyu.tistory.com

서블릿 컨테이너(Servlet Container) 란?

서블릿을 관리해주는 컨테이너. 예) 톰캣

https://velog.io/@han_been/%EC%84%9C%EB%B8%94%EB%A6%BF-%EC%BB%A8%ED%85%8C%EC%9D%B4%EB%84%88Servlet-Container-%EB%9E%80

 

서블릿 컨테이너(Servlet Container) 란?

서블릿들을 위한 상자(Container) 입니다.

velog.io

서블릿(Servelt)이란?

클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술

https://mangkyu.tistory.com/14

 

[JSP] 서블릿(Servlet)이란?

1. Servlet(서블릿) 서블릿을 한 줄로 정의하자면 아래와 같습니다. 클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술 간단히 말해서,

mangkyu.tistory.com

 

web.xml - 디스패처 서블릿 등록

// sp5-chap09/src/main/webapp/WEB-INF/web.xml

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
             http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
	version="3.1">

	<servlet>
    
    		<!--DispatcherServlet을 dispatcher라는 이름으로 등록-->
		<servlet-name>dispatcher</servlet-name> 
		<servlet-class>
			org.springframework.web.servlet.DispatcherServlet
		</servlet-class>
        
        	<!--contextClass 초기화 파라미터 설정.-->
        	<!--자바 설정을 이용한다면, 웹 어플리케이션용 스프링 컨테이너 클래스인 AnnotationConfigWebApplicationContext 클래스를 사용-->
		<init-param>
			<param-name>contextClass</param-name>
			<param-value>
				org.springframework.web.context.support.AnnotationConfigWebApplicationContext
			</param-value>
		</init-param>
        
        	<!--contextConfiguration 초기화 파라미터 값 지정. 파라미터로는 스프링 설정 클래스 목록을 지정-->
		<init-param> 
			<param-name>contextConfigLocation</param-name>
			<param-value>
				config.MvcConfig
				config.ControllerConfig
			</param-value>
		</init-param>
		<load-on-startup>1</load-on-startup> <!--톰캣과 같은 컨테이너가 웹 어플리케이션을 구동할 때 이 서블릿을 함께 실행하도록 설정-->
	</servlet>
    
    	<!--모든 요청을 DispatcherServlet이 처리하도록 서블릿 매핑 설정-->
	<servlet-mapping> 
		<servlet-name>dispatcher</servlet-name>
		<url-pattern>/</url-pattern>
	</servlet-mapping>

		<!--HTTP 요청 파라미터의 인코딩 처리를 위한 서블릿 필터 등록. 사용할 인코딩 지정-->
	<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>
	</filter>
	<filter-mapping>
		<filter-name>encodingFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

</web-app>

 

STEP 4. 코드 구현

  • 클라이언트의 요청을 알맞게 처리할 컨트롤러
  • 처리 결과를 보여줄 JSP

4-1. 컨트롤러 구현

컨트롤러를 스프링 빈으로 등록

// sp4-chap09/src/main/java/config/ControllerConfig.java

package config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import chap09.HelloController;

@Configuration
public class ControllerConfig {

	@Bean
	public HelloController helloController() {
		return new HelloController();
	}

}

컨트롤러 구현

// sp5-chap09/src/main/java/chap09/HelloController.java

@Controller // (1) 스프링 MVC에서 컨트롤러로 사용
public class HelloController {

	@GetMapping("/hello") // (2) 메서드가 처리할 요청 경로 지정. "/hello" 경로로 들어온 GET 요청을 hello() 메서드로 처리
	public String hello(Model model, // (4) Model 파라미터는 컨트롤러의 처리 결과를 뷰에 전달할 때 사용
	    // (3) @RequestParam: HTTP 요청 파라미터의 값을 메서드의 파라미터로 전달
            @RequestParam(value = "name", required = false) String name) {
		model.addAttribute("greeting", "안녕하세요, " + name); // (4) greeting 이라는 모델 속성에 두번째 인자를 값으로 설정
		return "hello"; // (5) 컨트롤러의 처리 결과를 보여줄 뷰 이름으로 hello 사용
	}
}

(1) Controller: 웹 요청을 처리하고 그 결과를 뷰에 전달하는 스프링 빈 객체

(2) 매핑 애노테이션(@GetMapping, @PostMapping 등)으로 요청을 처리할 경로를 지정
매핑 애노테이션의 인자서블릿 컨텍스트 경로(또는 웹 어플리케이션 경로)를 기준으로 한다.
톰캣의 경우) webapps/sp5-chap09 폴더는 웹 브라우저에서 http://host/sp5-chap09 경로에 해당한다. (컨텍스트 경로)

@GetMapping("/main/list") 경로 매핑을 설정할 경우,
http://host/sp5-chap09/main/list 로 들어오는 요청을 처리한다.

(3) @RequestParam(value="파라미터 이름", required="필수 여부")
HTTP 요청 파라미터를 메서드의 파라미터로 전달한다.


(4) Model 객체.addAttribute("속성이름", "값");
위 코드) model.addAttribute("greeting", "안녕하세요, " + name);
컨트롤러에서 지정한 속성 이름으로 뷰에서 접근

(5) 반환값: 뷰 이름
여기서 지정하는 뷰 이름은 논리적인 이름이며,
뷰 이름에 해당하는 뷰 구현을 찾아주는 것은 ViewResolver가 처리한다. (10장에서 다룸)

4-2. JSP 구현

* JSP(Java Server Pages) : Java 언어를 기반으로 하는 서버사이드 스크립트 언어.
HTML에 <% %> 태그가 삽입된 형태이다.

컨트롤러가 생성한 결과를 보여줄 뷰 코드를 JSP를 이용해 구현한다.

// src/main/webapp/WEB-INF/view/hello.jsp

<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
  <head>
    <title>Hello</title>
  </head>
  <body>
    인사말: ${greeting}   <!--컨트롤러에서 추가한 모델의 속성(greeting)을 사용함-->
  </body>
</html>

스프링 MVC 프레임워크가 Model에 추가한 속성을 JSP에서 접근할 수 있도록 HttpServletRequest에 옮겨준다.

뷰 이름과 JSP 파일과의 연결MvcConfig 클래스의 설정을 통해 이루어진다.

@Override
	public void configureViewResolvers(ViewResolverRegistry registry) {
		registry.jsp("/WEB-INF/view/", ".jsp");
	}

registry.jsp(JSP 파일 경로, 접미사)

STEP 5. 실행

책 245p 참고

 


Quiz.

1. MVC는 (Model), (View), (Controller)의 구조를 갖는 아키텍처 패턴이다.
2. 스프링 MVC를 실행하는 데 필요한 최소 설정: (1)스프링 MVC의 주요 설정, (2)스프링의 DispatcherServlet 설정

3. 매핑 애노테이션에는 (@GetMapping), (@PostMapping) 등이 있다.

4. 다음 애노테이션의 이름을 쓰시오. @RequestParam(value="이름", required="여부")

5. model.addAttribute("속성", "값")을 해서 추가한 속성은 (JSP 파일)에서 사용할 수 있다.

6. (DispatcherServlet)은 HTTP 프로토콜로 들어오는 모든 요청을 가장 먼저 받아 적합한 컨트롤러에 위임하는 (프론트 컨트롤러)이다. 
7. 프로젝트 루트 URL(예) http://localhost:8080/sp5-chap09/)에 접근할 경우 톰캣은 (index.jsp) 또는 (index.html) 파일을 찾아서 실행한다.


코드 문제

1. JSP 파일 내용이 다음과 같을 때, 웹페이지에 다음과 같이 출력하기 위한 컨트롤러의 코드를 작성하세요.

요청 주소 http://localhost:8080/프로젝트/search?q=Corner
출력 내용 검색: Corner에 대한 검색결과입니다.
<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
  <head>
    <title>Search</title>
  </head>
  <body>
    검색: ${searchResult}
  </body>
</html>
@Controller
public class SearchController {
	@GetMapping("(1)") 
	public String search(Model model, 
            @RequestParam(value = "keyword", required = false) String keyword) {
		model.addAttribute(/* (2) 이곳에 작성 */ ); 
		return "(3)"; 
	}
}

(1) /search

(2) "searchResult", keyword+"에 대한 검색결과입니다."

(3) search

 


Corner Spring #2

Editor : 유즈

728x90

관련글 더보기