1.스프링 MVC 개요
스프링 프레임워크는 MVC 패턴을 준수한다.그럼 MVC란 무엇인가?
MVC는 Model-View-Controller 약자로 소프트웨어공학에서 사용되는 아키텍쳐 패턴으로 MVC 패턴의 주 목적은 Business logic과 Presentation logic을 분리하기 위함이다.
모델, 뷰, 컨트롤러는 각각의 인터페이스가 정의되어 있어 서로 구현에 의존적이지 않아 약한 결합도로 구성되어 유연하고 확장하기 쉽다는 이점이 있다.
MVC패턴은 크게 Model1패턴과 스프링이 채택한 Model 2패턴으로 나눌 수 있다.
Model 1
Model 1 패턴의 경우 View와 Controller를 모두 JSP가 담당하는 형태를 가진다. 즉 JSP 하나로 유저의 요청을 받고 응답을 처리하므로 구현 난이도는 쉽다.
단순한 프로젝트에는 괜찮겠지만 내용이 복잡하고 거대해질수록 이 패턴은 힘을 잃는다.
JSP 하나에서 MVC가 모두 이뤄지다보니 재사용성도 매우 떨어지고, 읽기도 힘들어진다. 즉 유지보수에 있어 문제가 발생한다.
Model2
Model2패턴은 널리 표준으로 사용되는 패턴으로 요청을 하나의 컨트롤러(servlet)가 먼저 받는다.즉 Cotroller와 View가 분리 되어있다.
역할이 분리되어 있기에 Model1패턴의 단점을 보완할 수 있다. M,V,C 중에 수정사항이 있다면, 해당 부분만 수정하면 된다. 따라서 유지보수에도 큰 이점을 갖는다.
Front Controller 패턴(스프링 MVC)
프론트 컨트롤러 패턴은 클라이언트 요청을 별도의 프론트 컨트롤러에 집중하는 패턴이다.
모든 요청의 공통 부분을 별도(프론트 컨트롤러)로 처리한다.
프론트 컨트롤러 패턴 실행 프로세스는 다음과 같다.
- DispatcherServlet이 HTTP 요청을 받는다.
- DispatcherServlet은 서브 Controller로 HTTP 요청을 위임한다.
- 서브 Controller는 클라이언트 요청 처리를 위해 DAO 객체를 호출한다.
- DAO 객체는 리소스를 액세스하여 Model 객체를 생성 후 요청 결과를 리턴한다.
- DispatcherServlet은 처리 결과에 적합한 뷰에 화면 처리 요청한다.
- 선택된 뷰는 화면에 모델 객체를 가져와 화면 처리를 한다.
- HTTP 응답
그럼 각각의 구성요소는 무슨 역할을 하는가에 대해서 설명하겠다.
구성 요소 | 설명 |
DispatcherServlet | 프론트 컨트롤러를 담당한다. 클라이언트의 요청을 받아서 Controller에게 클라이언트의 요청을 전달하고, 리턴 결과값을 View에게 전달하여 알맞은 응답을 생성한다. |
HandlerMapping | URL과 요청 정보를 기준으로 어떤 컨트롤러를 실행할 지 결정하는 객체이다. DispatcherServlet은 하나 이상의 핸들러 매핑을 가질 수 있다. 어노테이션을 이용할 때에는 mvn:annotation-driven 태그를 설정해야 한다. |
Controller | 클라이언트의 요청을 처리한 뒤 그 결과를 DispatcherServlet에게 알려준다. |
Model | 컨트롤러가 뷰에게 넘겨줄 데이터를 저장하기 위한 객체이다. |
ViewResolver | Controller가 리턴한 뷰 이름을 기반으로 Controller 처리 결과를 생성할 뷰를 결정한다. |
View | Controller의 처리 결과 화면을 생성한다. |
어노테이션을 이용해 쉽게 패턴을 구현할 수 있는데, @Component, @Service, @Controller, @Repository는 스프링이 관리하는 컴포넌트를 나타내는 일반적인 스테레오 타입이다.
MVC 아키텍처 기반에서 Service, Presentation, Persistence 계층의 컴포넌트는 @Service, @Controller, @Repository 스테레오 타입을 사용하여 구체화하며, 이들은 @Component의 전문화된 타입이다.
2.스프링 MVC 환경 설정
웹 어플리케이션 컨텍스트 등록 설정
웹 어플리케이션에 사용할 2가지 어플리케이션 컨텍스트를 등록해야 한다.
- ContextLoadListner 클래스
- 서블릭 컨테이너(Tomcat)에 ContextLoadListner 클래스를 web.xml에 등록한다.
- 서비스 계층 이하의 빈(@Service, @Repository 등)을 등록하기 위한 클래스이다.
- root-context.xml에서 @Service 지정된 클래스를 빈으로 등록해야한다.
- DispatcherServlet 클래스
- 서블리 컨테이너(Tomcat)에 프론트 컨트롤러인 DispatcherServlet 클래스를 web.xml에 등록해야한다.
- 컨트롤러(@Controller 또는 @Component) 빈을 등록하기 위한 클래스이다.
- DispatcherServle 클래스 설정
- <annotation-driven/>
- 스프링 MVC를 이용하는데 필요한 컴포넌트 빈(HandlerMapping) 등록을 자동으로 수행한다.
- 패키지 내부에서 찾은 빈(컨트롤러)과 URL를 맵핑
- <context:component-scan base-package="package"/>
- base-package 내부의 클래스에서 @Controller 지정된 컨트롤러를 검색하여 빈으로 등록한다.
- <annotation-driven/>
컨트롤러
모든 컨트롤 클래스에는 @Controller 어노테이션을 설정한다. 또 매서드 별로는 @RequestMapping 어노테이션을 사용하여 URL 매핑을 설정한다.
컨트롤러 등록은 DispatcherServlet 클래스의 설정 파일인 servlet-context.xml에서 컨르롤러를 등록한다.
4.urlController
@RequestMapping은 URL과 컨트롤러 메서드의 매핑을 설정하는 어노테이션으로 속성 값을 사용해 URL을 설정한다.
속성 | 내용 |
value | URL(요청 경로) |
method | HTTP 메서드 |
params | 요청 파라미터 유무나 파라미터 값 |
컨트롤러 메서드 매개변수
매개변수 | 내용 |
Model 오브젝트 | |
@ModelAttribute | 메서드에도 작성할 수 있고 파라미터에도 작성할 수 있는데. 파라미터로 받는다면 도메인 모델이나 DTO 같은 모델을 받는 타입이다. |
@PathVariable | 파라미터를 URL 경로에 포함시키는 방법이다. /sample/ |
@RequestParam | 요청 파라미터를 넣어주는 어노테이션이다. /sample?name=tukorea |
@MatrixVariable | |
@RequestBody | http 본문자체를 읽는 부분을 모델로 변환시켜주는 어노테이션이다. |
'Spring' 카테고리의 다른 글
Spring_Chapter07_A.O.P (0) | 2022.05.02 |
---|---|
Spring_Chapter06_스프링+MyBatis (0) | 2022.04.29 |
Spring_chapter04_스프링 JDBC (0) | 2022.03.28 |
Spring프레임워크_chapter03_Dependency Injection (0) | 2022.03.17 |
Spring 프레임워크_Chapter02_Maven (0) | 2022.03.12 |