먹고 사는 이야기/프로그래밍
[toby의스프링] 12장 - 스프링 웹 기술과 스프링 MVC
Kunner
2011. 11. 15. 23:14
이번 장에서는 스프링을 웹 프레젠테이션 계층에서 어떻게 사용하는가에 대해 이야기하고 있다.
예전에 얘기했던 바와 같이 웹 기술이라는 것은 결국 무엇을 어떻게 보여줄 것인가에 관한 이야기라 할 수 있다.
그러므로 스프링 웹기술이라는 것 또한 그 범주에 있는 일 들이다.
스프링에서 사용하는, 또는 스프링과 함께 사용할 수 있는 웹 기술, 프레임워크는 여러가지가 있다.
Struts니 SWF니 하는 것들이 그것이다.
책에서는 스프링에서 직접 제공하는 스프링 MVC를 소개하고 있는데, 실제로 실무에서 많이 쓰인다.
MVC는 구성요소Model, 화면출력View, 제어로직Controller 으로 이루어진다.
스프링 MVC도 마찬가지여서 이 세가지 요소가 서로 주거니 받거니 하며 요청을 처리하고 응답한다.
MVC는 보통 프론트 컨트롤러front controller와 함께 사용되는데 스프링 MVC에서는 DispatcherServlet이 그 역할을 담당한다. 1
아래 도식은 DispatcherServlet이 프론트 컨트롤러로 MVC 컴포넌트들과 어떻게 동작하는지를 보여주고 있다.
스프링의 DispatcherServlet과 MVC. (p.1022)
그림에서 보다시피 (1)HTTP 요청 및 (7)응답과 같은 클라이언트와의 상호작용 뿐 아니라 컨트롤러, 뷰의 동작 제어 모두 DispatcherServlet이 도맡아 처리하고 있다. 사실 상 스프링 MVC의 처음이자 마지막이다. 각 단계에 대한 세세한 설명은 책을 참고하자.
또 다음과 같이 DI를 통해 DispatcherServlet을 확장할 수 있다.
Dispatcher의 DI 가능한 7가지 전략
- HandlerMapping
요청에 따라 어떤 컨트롤러에 연결할 것인지 제어할 수 있다.
- HandlerAdapter
핸들러 매핑으로 선택한 컨트롤로러를 DispatcherServlet이 호출할 때 사용한다.
- HandlerExceptionResolver
예외가 발생했을 때 처리 방법을 정의한다.
- ViewResolver
컨트롤러가 반환한 뷰 이름을 참고해 적절한 뷰 오브젝트를 찾아 준다. 또는 연결될 뷰 오브젝트를 정의할 수 있다.
- LocaleResolver
지역 정보를 결정한다. HTTP 헤더 뿐 아니라 세션, URL 파라미터, 쿠키 등 다양한 방식으로 결정 가능하다.
- ThemeResolver
사이트에 테마를 선택 적용하는 경우 테마 적용에 관한 정의를 할 수 있다.
- RequestToViewNameTranslator
컨트롤러에서 뷰 이름이나 뷰 오브젝트를 지정해 주지 않은 경우 자동으로 뷰 이름을 생성한다.
처음 스프링으로 작업된 소스를 봤을 때 혼란스러웠던 기억이 난다.
ModelAndView 라는 리턴타입이 뭘 의미하는지 몰랐기 때문이다.
그리고 그 동작방식을 알게 됐을 때 얼마나 놀랐던지...
세상이 많이 달라졌구나, 하고 느꼈던 기억이 난다. ㅎㅎ
스프링의 강력함은 DispatcherServlet과 컨트롤러를 이용해 얼마든 새로운 프레임워크를 만들어 낼 수 있는 유연함으로 설명할 수 있다. 따라서 그저 스프링 MVC에서 제공하는 기능들을 갖다 쓰는 것만이 아니라 작업환경과 업무 내용에 맞게 커스터마이징하고 더 나은 퍼포먼스를 낼 수 있도록 발전시켜 나가는 것이 필요하다.
아무튼 이번 장에서 다룬 중요한 내용은 DispatcherServlet의 동작방식과 순서, 사용법과 확장 전략에 대한 이야기들이다.
지난 몇몇 프로젝트에서 개발한 소스를 가져다 놓고 설명하면 더 좋겠지만, 그러다간 책 한 권 쓰게 될지도 모르므로.. 두리뭉실하지만 이 정도로 마치자.
다음 장은 스프링 MVC의 본격적인 개발법을 다룰 예정이니, 그때 좀 더 자세히 얘기할 수 있을 것이다.
- 프론트 컨트롤러란 프레젠테이션 계층의 제일 앞에서 서버로 들어오는 모든 요청을 받고, 공통적인 작업을 수행하고, 요청의 성격에 따라 처리 대상 컨트롤러로 분배하고, 다시 취합하여 화면에 출력하는 중앙집중형 컨트롤러를 말한다. 또한 작업도중 예외가 발생하면 예외의 처리 방법까지도 프론트 컨트롤러를 통해 제어할 수 있다. (본문 p.1021) [본문으로]