# MVC
# 스프링 MVC
# DispatcherServlet
# JSP
# HTTP 요청 파라미터
Model - View - Controller의 구조를 갖는 아키텍처 패턴
개발자들이 스프링을 사용하는 이유로, 스프링이 지원하는 웹 MVC 프레임워크를 사용할 수 있다는 이점을 꼽는다.
pom.xml
// 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 설정
// 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'
}
톰캣 설치 ▶ https://tomcat.apache.org/
책 235p 참고
스프링 MVC를 실행하는 데 필요한 최소 설정 2가지
스프링 설정 파일 - 주요 설정 코드 작성
// 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
서블릿 컨테이너(Servlet Container) 란?
서블릿을 관리해주는 컨테이너. 예) 톰캣
서블릿(Servelt)이란?
클라이언트의 요청을 처리하고, 그 결과를 반환하는 Servlet 클래스의 구현 규칙을 지킨 자바 웹 프로그래밍 기술
https://mangkyu.tistory.com/14
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>
컨트롤러를 스프링 빈으로 등록
// 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장에서 다룸)
* 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 파일 경로, 접미사)
책 245p 참고
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 : 유즈
[스프링2] 11장. MVC 1: 요청 매핑, 커맨드 객체, 리다이렉트, 폼 태그, 모델 (1) (0) | 2022.12.22 |
---|---|
[스프링2] 10장. 스프링 MVC 프레임워크 동작 방식 (0) | 2022.12.01 |
[스프링2] 8장. DB연동 (2) (0) | 2022.11.17 |
[스프링2] 8장. DB 연동 (1) (0) | 2022.11.17 |
[스프링2] 7장. AOP 프로그래밍 (0) | 2022.11.10 |