MVC
설정컨트롤러
구현뷰
코드 구현이어지는
확장
은 다음과 같다.
- 컨트롤러에서
서비스
나DAO
를 사용해 클라이언트의 요청 처리- 컨트롤러에서
요청 파라미터
의 값을 하나의 객체로 받고 값 검증- 스프링이 제공하는 JSP 커스텀 태그를 이용해서
폼
처리- 컨트롤러에서
세션
이나쿠키
를 사용인터셉터
로 컨트롤러에 대한 접근 처리JSON
응답처리
MVC
는 디자인 패턴중 하나로, Model
, View
, Controller
의 약자하나의 애플리케이션이나 프로젝트를 구성할 때 그 구성요소를 세가지
의 역할로 구분한 패턴
controller
는 model
을 통해서 데이터를 가져오고, 그 정보를 바탕으로 시각적인 표현을 담당하는 view
를 제어해서 사용자에게 전달특징
은 다음과 같다.
모든
데이터를 가지고 있어야 한다.알 수 없다
.변경 통지
에 대한 처리방법을 구현해야만 한다.안된다
.알 수 없다
.변경통지
에 대한 처리방법을 구현해야만 한다.알고
있어야 한다.모니터링
해야 한다.유지보수성
, 확장성
, 유연성
이 증가하고 중복코딩
은 사라지게 됨Dispatcher
: 클라이언트의 요청
을 전달받아 요청에 맞는 컨트롤러가 리턴한 결과값
을 View에 전달하여 알맞은 응답을 생성HandlerMapping
: 클라이언트의 요청 URL을 어떤 컨트롤러
가 처리할지 결정Controller
: 클라이언트의 요청을 처리
한 뒤, 결과를 DispatcherServlet에게 리턴ModelAndView
: 컨트롤러가 처리한 결과 정보 및 뷰 선택에 필요한 정보
를 담음ViewResolver
: 컨트롤러의 처리 결과를 생성할 뷰를 결정
View
: 컨트롤러의 처리 결과 화면을 생성
, JSP 또는 Velocity 템플릿 파일 등을 뷰로 사용웹 어플리케이션 개발을 위한 메이븐 프로젝트의 디렉토리 구조
는 다음과 같다.
기존 pom.xml 파일에 다음과 같은 dependency
를 추가
<packaging>war</packaging>
<!-- 아래부터 dependency -->
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
Tomcat 8.5.43
버전을 기준으로 수행스프링 MVC 실행을 위해 필요한 최소한의 설정은 다음과 같다.
스프링 MVC의 주요 설정 - HandlerMapping
, ViewResolver
스프링의 DispatcherServlet 설정
// MvcConfig.java
@Configuration
@EnableWebMvc // 스프링 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");
}
}
@EnableWebMvc
어노테이션을 이용시, 내부적
으로 다양한 빈 설정을 추가해줌WebMvcConfigurer
인터페이스는 스프링 MVC 개별 설정
을 조절할 때 사용스프링 MVC가 웹 요청
을 처리하려면 DispatcherServlet
을 통해 웹 요청을 받아야 함
이를 위해 web.xml 파일에 DispatcherServlet을 등록
web.xml 파일은 src/main/webapp/WEB_INF/ 에 위치
다음 두 가지 코드를 구현
컨트롤러
JSP
// HelloController.java
@Controller // 컨트롤러로 지정
public class HelloController {
@GetMapping("/hello") // 메서드가 처리할 요청 경로를 지정, 이 경우 /hello 경로
public String hello(Model model,
// name 요청 파라미터 값을 name 파라미터에 전달
@RequestParam(value = "name", required = false) String name) {
model.addAttribute("greeting", "안녕하세요, " + name);
return "hello"; // 컨트롤러의 처리 결과를 보여줄 뷰 이름으로 "hello"를 사용
}
}
컨트롤러
란 웹 용청을 처리하고 그 결과를 뷰에 전당하는 스프링 Bean 객체@Controller
어노테이션을 붙임@GetMapping
어노테이션이나 @PostMapping
어노테이션과 같은 요청 매핑 어노테이션을 이용해 경로 지정@RequestParam
어노테이션은 HTTP 요청 파라미터를 매서드의 파라미터로 전달
http://localhost:8080/sp5-chap09/hello?name=bk
여기서 name의 파라미터에 해당하는 값을 전달
addAttribute()
매서드는 뷰에 전달할 데이터를 지정하기 위해 사용
// ControllerConfig
@Configuration
public class ControllerConfig {
@Bean
public HelloController helloController() {
return new HelloController();
}
}
Bean
객체로 등록컨트롤러가 생성한 결과를 보여줄 뷰 코드는JSP
로 구현
<%-- hello.jsp --%>
<%@ page contentType="text/html; charset=utf-8" %>
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
</head>
<body>
인사말: ${greeting}
</body>
</html>
동일한
파일명뷰 이름과 JSP 파일과의 연결
은 MvcConfig 설정 클래스의 다음 설정을 통해 이루어짐
// MvcConfig.java
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
registry.jsp("/WEB-INF/view/", ".jsp");
}
다음과 같이 사용된 JSP EL(Expression Language)는 컨트롤러의 구현에서 Model에 추가한 속성의 이름과 동일
인사말: ${greeting}
실행결과
주소창에 http://localhost:8080/sp5-chap09/hello?name=bk 를 입력하였을 경우 다음과 같은 화면이 출력
인사말: 안녕하세요, bk