DispatcherServlet이 컨트롤러를 가져오는 방법


안녕하세요.
고코더 입니다.


오늘은 스프링에 핵심이자 특별한 존재인 DispatcherServlet을 좀 더 자세히 알아보겠습니다.
이전 스프링 구조도에서 중앙에서 모든걸 처리하는 역할을 했습니다.
-> Spring - 스프링 MVC 구조도 / 이해하기 쉬운



DispatcherServlet은 기존에 Web.xml이 담당했던 servlet 맵핑을 대신합니다. 그 덕에
복잡한 XML작성에서 해방 되었습니다. MVC를 가능하게 해준 이 서블릿에 대해
소스를 위주로 알아보겠습니다.
이전에 함께 만든 프로젝트 파일 기준으로 살펴봅니다. 

 1. web.xml 


 1-1. 패키지에서 src->main->webapp->WEB-INF->web.xml을 열어봅니다.


 1-2. 그 다음 XML에서 정의된 내용들을 함께 살펴 봅니다. 

20번 라인
- DispatcherServlet 기능을 참조하여
19번 라인
- appServlet 으로 네임을 지정 합니다.
29번 라인
- appServlet은 URL 패턴을 맵핑 합니다.
30번 라인
- 모든 URL에 대한 맵핑을 담당 합니다. 즉 모든 프론트 접속을 담당 합니다.

결론은 web.xml에 서블릿 맵핑을 DispatcherServlet 위임한 내용을 확인 가능합니다.



 2. 디스패처서블릿 소스 / spring-webmvc-3.1.1.RELEASE.jar


DispatcherServlet은 스프링 프레임워크에 기능입니다. 

 2-1. 해당 디스패처서블릿 기능은 스프링 spring-webmvc-3.1.1.RELEASE.jar 존재합니다.
해당 jar를 열어보세요.


 2-1. 해당 jar안에 DispatcherServlet.calss 로 정의 되어 있고 오픈 소스라 공개는 되어 있지만 해석하기 어렵지만 해당 jar에 class로 만들어져 있다는걸 눈으로 확인해보는 것도 도움이 됩니다.



 3. 컨트롤러에 어노테이션 / Controller


 3-1. 스프링에서 컨트롤러 파일을 열어보겠습니다.
기본으로 만들어져 있는 HomeController.java를 소스를 열어보세요.


 3-2. 보시면 컨트롤러가 어노테이션으로 선언되어 있습니다. 
이 어노테이션으로 해당 소스가 컨트롤러라고 선언하고 
서블릿 프로젝트 처럼 web.xml에 컨트롤러를 매번 선언하지 않고도 자동으로
스프링이 스캔하여 컨트롤러 기능을 실행하게 합니다. 




 4. 컨트롤러 스캔 / context:component-scan


해당 컨트롤러에 어노테이션들이 자동으로
스프링에 컨트롤러 역할을 만들어주는건 해당 컨트롤러를
찾는 스캔을 하기 때문입니다.

 4-1. servlet-context.xml 을 열어봅니다.


 4-2. 해당 라인에서 context:component-scan에서 hello 팩키지가 설정되어 있습니다.
이 명령어를 통해서 패키지안에 java소스들을 풀스캔합니다.
그리고 어노테이션을 발견하면 해당 컨트롤러들을 참조하여 사용하게 만들어 줍니다. 



마무리


스프링 DispatcherServlet가 컨트롤러를 찾는 방법을 소개했습니다. 원리를 모르고 개발할수도 있지만 한번 눈으로 직접 원리를 알아보고 이해하며 개발하는건 큰 차이가 있습니다. 



댓글을 달아 주세요



MVC 전체 구조를 살펴봅니다. 


안녕하세요.
고코더 입니다.


오늘은 스프링에 MVC 구조를 한눈에 함께 파악해보는 시간을 가지려고 합니다.
개발 시작전에 구조도를 직접 그려봤습니다.
처음은 복잡해 보이지만 저랑 하나씩 뜯어보면 정말 간단하고
이해하기 쉬운 구조 입니다. 



전체 MVC 구조


깊이 들어가면 더 많은 구조가 있지만 이해가 필요한 만큼
작성해보았습니다. 



 1. DispatcherServlet 역할



Front 가 URL로 호출을 합니다. 그러면 DispatcherServlet이 클라이언트 요청을 최초로 받습니다. 
중앙집중식 프론트 컨트롤러입니다. MVC의 핵심 요소입니다. 



 2. Handler Mapping 역할




Handler Mapping은 DispatcherServlet에게 해당 requet가 어떤 컨트롤러를 사용하는지 응답합니다. 


 3. Controller



DispatcherServlet은 로직을 처리할 컨트롤러를 응답 받았으니 해당 
Controller로 처리 요청을 넘깁니다. 해당 컨트롤러는 로직을 수행하고 서비스를 요청하며
Model을 만듭니다. 그리고 ModerAndview 객체에 담아 다시 DispatcherServlet으로 넘겨줍니다. 




 4. ViewResolver 




DispatcherServlet는 ViewResolver로 해당 ModelAndView에 맞는 view를 찾아달라고 요청 합니다.
그럼 ViewResolver는 해당 view를 응답합니다. 



 5. View 



ViewResolver으로 부터 받은 view 정보로 DispatcherServlet 필요한 view를 찾아 Model 값을 넘겨
view을 출력하게 해줍니다. 



마무리

  
개발이 처음이거나 자바가 처음이라면 해당 구조도는 이해가 안되는게 정상입니다. 
하지만 눈에 익혀두면 스프링을 개발하다 보면 하나씩 이해가 됩니다.
추천하는 방법은 프린터로 출력해놓고 한쪽에 붙혀놓아 보세요.
그리고 오랫동안 생각해보면서 구조도를 뜯어보세요.



댓글을 달아 주세요