# 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/
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 참고
스프링 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
[Spring] Dispatcher-Servlet(디스패처 서블릿)이란? 디스패처 서블릿의 개념과 동작 과정
이번에는 servlet의 심화 또는 대표주자인 dispatcher-servlet에 대해서 알아보도록 하겠습니다. 1. Dispatcher-Servlet(디스패처 서블릿)의 개념 [ Dispatcher-Servlet(디스패처 서블릿) 이란? ] 디스패처 서블릿의
mangkyu.tistory.com
서블릿 컨테이너(Servlet Container) 란?
서블릿을 관리해주는 컨테이너. 예) 톰캣
서블릿 컨테이너(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>
컨트롤러를 스프링 빈으로 등록
// 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 |