본문으로 바로가기

Spring MVC - home.jsp의 동작원리

category 코딩/Spring 2017. 5. 1. 17:17







스프링 MVC 프로젝트의 구조





스프링 MVC 프로젝트를 생성하면 위와 같은 구조로 되어있다.





프로젝트의 구조를 살펴보면 위와 같다. 여기에서 중요한 것에 WEB-INF 밑에 있는 spring 폴더이다. 여기에는 스프링과 관련된 폴더이므로 주의해야 한다.



WEB-INF에 대해


WEB-INF 폴더는 위에서처럼 중요한 설정 파일들이 들어있는 곳이다. 그래서 외부에서 직접 접근이 불가능하게 되어있다. 실제로 프로젝트에 있는 home.jsp를 실행시키면 404에러가 발생한다.


주소창을 보면 http://localhost:8080/WEB-INF/views/home.jsp 이렇게 되어있는데, 바로 WEB-INF로 접근하려 했기 때문에 에러가 발생하는 것이다. 스프링에서는 view를 WEB-INF 아래에 둠으로써 직접 접근하지 못하게 하는 대신 다른 방법으로 view에 접근하도록 한다.





home.jsp의 동작원리



그러면은 home.jsp가 어떻게 동작하는지 알아보자. 일단은 전체적인 흐름을 보면 아래와 같다.






1. web.xml





브라우저의 요청을 가장 먼저 처리하는 곳이 web.xml이다. 현재 여기에는 필터가 없는데, 필터가 있다면 가장 먼저 반응을 하여 특정 작업을 처리하게 된다. 보통 필터에서 하는 대표적인 처리가 인코딩 처리이다.


web.xml 중간을 보면 DispatcherServlet이라고 되어있는 것을 볼 수 있다. 브라우저의 요청이 오면 먼저 Controller로 요청이 넘어가기 전에 DispatcherServlet이 그 요청을 가로챈다. 가로챈 요청은 아래의 <init-param> 부분에 있는 servlet-context.xml로 전달된다.



■  web.xml 이란?


웹 애플리케이션의 실행 환경에 관련된 각종 설정 정보가 담겨있는 파일이다.


■ <servlet-mapping>


요청 URL 패턴을 지정하는 부분. 만약 xxxx.do 이렇게 요청하도록 지정하고 싶다면 url-pattern에 *.do 로 지정하면 된다.






2. servlet-context.xml





servlet-context는 브라우저의 요청으로부터 그 요청을 처리할 Controller를 이어주는 작업을 한다. 즉 servlet-context 에서 HandlerMapping, HandlerAdapter의 작업이 진행된다.



■ <context:component-scan base-package="com.spring.example" />


component-scan은 @Controller, @Repository, @Service, @Component 어노테이션이 사용된 클래스를 자동으로 스캔하여 빈으로 등록한다. 


여기에서는 패키지가 com.spring.example로 지정되어 있는데, 이는 해당 패키지 아래에서 어노테이션이 사용된 클래스를 찾아서 빈으로 등록하겠다는 것이다.



■ <annotation-driven /> 


이 설정을 통해 URL 매핑이 일어난다. annotation-driven에 의해 @RequestMapping을 사용할 수 있게 되고, @RequestMapping에 지정된 URL로 브라우저의 요청 URL이 매핑되게 된다. 만약 <annotation-driven />를 지우면 URL을 찾을 수 없다는 오류가 발생한다.


<annotation-driven />는 RequestMappingHandlerMapping 와 RequestMappingHandlerAdapter, ExceptionHandlerExceptionResolver로 구성되어 있다.





3. HomeController





servlet-context에 의해 브라우저의 요청은 HomeController로 넘어가게 된다. 여기에서 home( ) 를 보면 현재 날짜와 시간을 가져온 후  이것을 문자열을 만든다. 이 후 작업의 결과를 model에 담고 home 라는 뷰 이름을 반환한다.



■ model.addAttribute("이름", 객체)


Model 객체에 특정 이름을 지정하여 뷰에서 이름을 이용해 객체를 처리할 수 있게 한다. model.addAttribute(객체) 로도 사용 가능한데, 이럴 경우 객체 명의 맨 앞 글자를 소문자로 처리한 것을 이름으로 해서 사용 가능하다.


ex) 

MemberVO member = new MemberVO

model.addAttribute(member)


뷰에서 사용하려면 memberVO 라는 이름으로 객체를 사용할 수 있다.




4. 다시 servlet-context.xml





HomeController에서 넘겨진 home은 servlet-context로 전달된다. 여기에서는 InternalResourceViewResolver를 통해 뷰를 찾게 된다. 전달받은 home 에 앞에는 /WEB-INF/views/를 붙이고 뒤에는 .jsp를 붙인다.


결국 /WEB-INF/views/home.jsp , WEB-INF 아래에 views 폴더에 있는 home.jsp 파일의 경로를 뷰 이름으로 만들게 된다. 새롭게 만들어진 뷰 이름은 DispatcherServlet으로 전달된다.



5. web.xml


최종적으로 뷰 이름은 DispatcherServlet로 넘어가게 되고, 이것이 브라우저로 전달되어 유르는 home.jsp를 볼 수 있게 된다.







RSS구독 링크추가 트위터 이메일 구독