Formoat's Open Blog
Spring MVC (Model View Controller) - 스프링 MVC 패턴 본문
# 스프링 MVC 구조의 흐름
1) DispatcherServlet
- 가장 앞서 요청을 받아들여 FrontController라고 불림
- 스프링 프레임워크의 중심이 되는 서블릿으로 클라이언트의 모든 요청을 받아 흐름을 제어
- 각 컨트롤러에 요청을 전달하고 컨트롤러가 반환한 결과값을 View에 전달해 응답
- web.xml에 정의되어 있으며, 보통 servlet-context.xml 설정 파일을 읽어 컨테이너를 구동
2) HandlerMapping
- 클라이언트의 요청 URL을 처리할 컨트롤러를 결정해 DispatcherServlet에 반환
- @Controller 어노테이션이 적용된 객체의 @RequestMapping 값을 이용해 요청을 처리할 컨트롤러 탐색
3) HandlerAdapter
- DispatcherServlet의 처리 요청을 변환해서 컨트롤러에게 전달
- 컨트롤러의 응답 결과를 DispatcherServlet이 요구하는 형식으로 변환
4) Contoller
- 실제 클라이언트의 요청을 처리한 뒤, 처리 결과를 void, String, ModelAndView 형태로 반환
- GET, POST 방식 등 전송 방식에 대한 처리를 어노테이션으로 처리
5) ViewResolver
- 컨트롤러의 처리 결과를 보여줄 뷰를 결정
※ 스프링 MVC가 처리해주는 작업
- URI를 분석해서 적절한 컨트롤러를 결정
- 컨트롤러에 필요한 메소드를 호출
- 컨트롤러의 결과 데이터를 뷰로 전달
- 처리 결과를 보여줄 적절한 뷰를 결정
※ 개발자가 직접 해야 하는 작업
- 특정 URI에 동작하는 컨트롤러를 설계
- 컨트롤러 내에 원하는 결과를 메서드로 설계
- 서비스 객체의 생성
- DAO 객체의 생성 (MyBatis 사용시 X)
- 뷰에서 전달받은 데이터의 출력
# 스프링 MVC 설정
Spring MVC Proejct 템플릿 구조
DispatcherServlet 등 환경 설정
Maven Dependency
- 스프링 MVC 사용시 JSP / Servlet 버전을 상향시킬 필요가 있음 (Maven Repository 참조)
- Jsp → 2.3~ version
- Servlet → 3.x version
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
# 스프링 MVC 구현 방법
1) 컨트롤러 설계/구현
- @Controller 어노테이션을 클래스에 적용
- @RequestMapping 애노테이션을 이용해서 처리할 요청 경로 지정
- 클라이언트의 요청을 처리할 메서드를 구현하고, 뷰 이름 리턴
- 리턴시 Redirect 형식으로 리턴한다면 다시 컨트롤러로 요청
2) 컨트롤러 - @RequestMapping 어노테이션
(1) 리턴 타입에 따른 경로 변경
(2) RequestMapping 요청 방식 (GET, POST)
# 컨트롤러 데이터 처리 방법
1) Model & ModelAndView, RedirectAttribute를 이용한 데이터 전달
(1) Model : 뷰가 응답 화면을 구성하는데 필요한 데이터를 생성해 전달할 때 사용
(2) ModelAndView : Model 이전의 사용 방법으로 모델과 하는일은 동일
(3) RedirectAttribute : Redirect 형식으로 반환시 데이터를 전달할 때 사용
2) 요청 파라미터와 폼 데이터 처리
(1) HttpServletRequest 이용 : 기존의 JSP/Servlet에서 사용하는 방식과 동일
(2) 파라미터 형식 : 폼데이터의 이름과 전달된 컨트롤러의 파라미터 이름이 일치해야 함.
(3) DTO/VO 객체를 이용 : 폼데이터의 이름과 동일한 필드명을 가진 DTO/VO 객체를 이용해 데이터 처리 가능
- 알아서 Getter / Setter 메서드를 이용해 데이터를 처리하기 때문에 가장 많이 사용되는 방법이다.
- DTO/VO를 이용할 경우 컨트롤러 뿐 아니라 이후 보내지는 jsp 페이지까지 데이터가 유효하다.
※ DTO/VO 객체를 이용하여 데이터를 처리할 때 주의할 점이 있다.
컨트롤러 이후 jsp페이지로 객체가 보내질 때 객체의 이름은 클래스 이름의 맨 앞 대문자만 소문자로 대치된
이름으로 객체가 넘어가게 된다. 예를 들면 'FormVO' → 'formVO' 이러한 형식으로 넘어가게 되는데
이후 페이지에서 객체를 사용할 때 클래스의 이름이 길다면 불편할 수 있기 때문에 이를 방지하기 위해
사용되는 어노테이션이 있다. '@ModelAttribute'라는 어노테이션으로 보내지는 객체의 이름을 변경할 수 있다.
@PostMapping("/formA")
public void formAPost(@ModelAttribute("vo") FormVO vo) {
log.info("formA.jsp에서 보낸 폼데이터 처리");
log.info("id: " + vo.getId());
log.info("password: " + vo.getPassword());
log.info("name: " + vo.getName());
}
3) 세션 데이터 처리
(1) HttpSession : JSP/Servlet과 동일한 방법
(2) @SessionAttributes : 어노테이션을 이용하는 방법
(3) SessionStatus와 컨트롤러 단에서 세션데이터 처리
# Spring MVC에서 자주 사용되는 어노테이션
Annotation | Description | Remarks |
@Controller | 스프링 MVC의 컨트롤러 객체임을 명시하는 어노테이션 | 클래스 |
@RequestMapping | 특정 URI에 매칭되는 클래스나 메소드임을 명시하는 어노테이션 | 클래스, 메서드 |
@RequestParam | 요청(request)에서 특정한 파라미터의 값을 찾아낼 때 사용하는 어노테이션 | 파라미터 |
@RequestHeader | 요청(request)에서 특정 HTTP 헤더 정보를 추출할 때 사용 | 파라미터 |
@PathVariable | 현재의 URI에서 원하는 정보를 추출할 때 사용하는 어노테이션 | 파라미터 |
@CookieValue | 현재 사용자의 쿠키가 존재하는 경우 쿠키의 이름을 이용해서 쿠키의 값을 추출 | 파라미터 |
@ModelAttribute | 자동으로 해당 객체를 뷰까지 전달하도록 만드는 어노테이션 | 메서드, 파라미터 |
@SessionAttribute | 세션상에서 모델의 정보를 유지하고 싶은 경우에 사용 | 클래스 |
@InitBinder | 파라미터를 수집해서 객체로 만들 경우에 커스터마이징 | 메서드 |
@ResponseBody | 리턴 타입이 HTTP 응답 메시지로 전송 | 메서드, 리턴타입 |
@RequestBody | 요청(request) 문자열이 그대로 파라미터로 전달 | 파라미터 |
@Repository | DAO 객체 | 클래스 |
@Service | 서비스 객체 | 클래스 |
# 그 밖에...
1) 구현내용이 없는 컨트롤러 처리 (root-context.xml)
- 구현 내용이 없이 단순히 페이지만을 매핑시키는 용도일 때 사용
- mvc 네임스페이스를 이용
- root-context.xml 파일안에 작성
2) 스프링 프레임워크 한글 처리 방법 (web.xml)
<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>
'Java > Spring' 카테고리의 다른 글
REST (Representational State Transfer) (0) | 2019.10.22 |
---|---|
Interceptor - 인터셉터 (0) | 2019.10.16 |
Logback SLF4J - 로그 남기기 (0) | 2019.10.08 |
Transaction - 트랜잭션 (0) | 2019.10.08 |
MyBatis - 마이바티스 (0) | 2019.10.07 |