티스토리 뷰
MVC 패턴에는 두가지 종류가 있다. MVC1과 MVC2인데 아래 그림과 같다.
[그림 1] MVC1
[그림 2] MVC2
MVC1은 JSP가 요청을 받아서 EJB의 JavaBean으로 DB와 통신하여 JSP에 적절한 값을 넣은 후 응답을 브라우저에 반환하는 형식이다.
MVC2는 이보다 발전하여 JSP가 요청을 받지 않고 Servlet이 대신 요청을 받아서 DB와 통신하여 JSP에 값을 넣고 그것을 반환한다.
Servlet은 서버에 매칭되는 URL마다 하나 씩 존재하며 init -> service(요청 마다 반복) -> destory의 생명주기를 가진다. Servlet은 WAS의 Servlet Container에 존재하며 사용자가 요청하면 해당되는 URL(web.xml 등으로 설정)에 매핑되는 Servlet의 함수(service -> doGet, doPost)를 호출한다.
Spring MVC는 MVC2를 발전시켜 아래 그림 3과 같은 구조를 가진다.
[그림 3] Spring MVC
Servlet 대신 Dispatcher Servlet이라는 Servlet이 사용자의 모든 요청을 받는 것을 볼 수 있다. Dispatcher Servlet은 모든 요청을 받아서 여러 작업을 거친 후 Controller에게 역할을 위임한다. 기존 MVC2 모델에서 URL마다 Servlet이 따로 존재하는 것에 비하면 특이한 구조이다.
Spring에서 이런 구조를 채택한 이유는 유연하고 다양한 설계를 할 수 있기 때문이다. Spring을 사용하는 개발자는 Dispatcher Servlet에 붙어있는 Handler Mapping, Handler Adapter 등을 각각 설정하여, 요청을 받았을 때 어떻게 동작할 지 프로그램 시작시에 정해줄 수 있다. (web.xml 또는 WebApplicationInitializer 인터페이스를 구현)
요청을 받았을 때 거치는 순서대로 위의 요소를 각각 알아보자.
1. Handler Mapping
Dispatcher Servlet이 요청을 받으면 가장 먼저 거치는 곳이다. 여기서 요청받은 URL에 해당하는 Controller를 찾는다. Handler Mapping을 따로 설정하지 않으면 RequestMappingHandler(@RequestMapping 지원)와 SimpleUrlHandlerMapping(URI 경로 패턴 지원)이 기본 구현으로 정해진다. Handler Mapping의 구현체를 바꿈으로써 메서드 이름으로 URL을 매핑하는 등의 설정을 할 수 있다.
또한 Handler Mapping은 해당되는 interceptor가 있으면 전처리, 후처리에 붙여주는 역할도 한다.
2. Handler Adapter
Handler Mapping으로 결정된 Controller의 메서드를 호출하는 역할을 한다. 주 목적은 Dispatcher Servlet이 Handler가 어떤 방식으로 구현되어 있는지 신경쓰지 않게 하기 위함이다. 예를 들어서 @RequestMapping으로 HTTP 요청을 받는 함수를 호출해야 한다던가, Servlet interface를 구현한 Controller의 함수를 호출해야 한다던가 등의 방법을 결정할 수 있다.
만약 Handler Adapter가 여러개 설정 돼있으면, HandlerMapping을 통해 나온 첫번째 handler 오브젝트를 선택한다.
3. Controller, Service, Repository
1, 2 단계를 통해 결정된 메서드가 비즈니스 로직과 DB에 Data Access를 통해 나온 데이터를 Model에 저장하고 사용자에게 보여줄 view의 이름을 결정하여 View Resolver에게 전달한다.
4. View Resolver
어떤 종류의 view(jsp, html 등)를 사용할 것인지 선택하고 문자열을 기반으로 사용할 view를 선택하는 역할을 한다. 선택된 view는 3단계에서 저장된 Model의 데이터를 이용해 페이지를 완성하고 사용자에게 응답한다.
위와 같은 단계를 거쳐서 사용자에게 응답한다. 중요한 것은 각각의 단계를 설정할 수 있기 때문에 필요에 따라 유연하게 방법을 바꿔서 프로그램을 설계할 수 있다는 것이다.
* 참고
https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html
'프로그래밍 > Web' 카테고리의 다른 글
Spring REST API 이미지 또는 파일을 리턴하기 (4) | 2018.08.09 |
---|---|
Spring controller에서 webapp 폴더 경로 찾기 (0) | 2018.08.02 |
Spring JDBC (0) | 2018.07.19 |
Spring Bean 생성 및 사용 (0) | 2018.07.19 |
java properties 파일 사용하기 (0) | 2018.07.18 |
- Total
- Today
- Yesterday
- @Bean
- Check point within polygon
- npm
- spring batch
- 클로저
- mybatis
- @Component
- @Qualifier
- Express
- nodejs
- MySQL
- spring
- Linux
- Closure
- JavaScript
- Barycentric coordinates
- Bin
- Tasklet
- @Autowired
- unity
- thymeleaf 변수 인식
- Bean
- thymeleaf cannot resolve
- chunk
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |