Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Tags more
Archives
Today
Total
관리 메뉴

Formoat's Open Blog

Spring MVC (Model View Controller) - 스프링 MVC 패턴 본문

Java/Spring

Spring MVC (Model View Controller) - 스프링 MVC 패턴

snd-snd 2019. 10. 10. 19:40

# 스프링 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
Comments