ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Spring Project의 Home.jsp 실행 시, 404 Error가 발생하는 이유
    Programming/Issue 2019. 9. 22. 18:37

    (부제)  Spring Framework의 동작원리

     

    얼마 전 나는 학생 때 진행했던 개발 프로젝트를 리팩토링 하기 위해 Spring을 재설치했다.

     

    아무 생각 없이 home.jsp에 focus를 두고 Run 시켰다.

    Spring 설치가  제대로 되었는지 확인하기 위해, Project를 생성하여 그 안에 기본적으로 내장되어있는 home.jsp를 실행시켜봤다.

    늘 그랬듯 실행시키고자 하는 jsp 파일를 focus로 두고 실행시켰다. ( 이것의 문제의 시작 )

     

     

    ?! 왜 ?! 왜 ?!

    당연히 Hello World를 볼 수 있겠거니 싶어, 대수롭지 않았는데 404 에러가 떨어져서 매우 당황스러웠다.

    환경 설정이 잘못되었는지, 서버에 문제가 생겼는지 이것저것 찾아보았는데,

    한 블로그에서 정리된 내용을 보고 그 원인을 파악할 수 있었다.

     

    결론부터 말하자면

     

    home.jsp에서 프로젝트를 실행한 것이 문제가 되었다.

    프로젝트(SampleProject)를 기준으로 Run하면 정상 동작한다.

     

     

    home.jsp가 WEB-INF 폴더에 속해있다.

    home.jsp로 접근하여 Run 시켰을 때, 404 에러가 났던 이유는

    home.jsp가 위치한 WEB-INF 폴더는 설정 파일을 담고 있는 중요한 폴더이기 때문에

    외부에서의 직접적인 접근을 막고 있기 때문이다.

     

    그렇다면 어떤 방식으로 home.jsp을 실행 시킬 수 있을까?

     

    .

    .

     

     

    이를 이해하기 위해서는 Spring FrameWork의 동작원리를 알아야한다.

     

    home.jsp의 동작순서

    먼저 클라이언트로부터 요청(Request)가 들어오면, 제일 먼저 web.xml이 실행된다.

     

    DispatcherServlet이 요청을 가로채고 servlet-context.xml을 실행시킨다.

    web.xml에서는 요청에 대해 가장 먼저 처리를 시작한다.

    여기서는 DispatcherServlet을 주목해야하는데, web.xml에서 다른 처리로 넘어가기전에 

    이 DispatcherServlet이 <url-pattern>의 형태로 들어오는 요청을 가로채어 servlet-context.xml로 넘겨버린다.

     

     

    해당 위치의 어노데이션을 읽어와서 bean으로 만든다.

    servlet-context.xml에서는 <annotation-drive /> <context:component-scan ... />에 주목하여야 한다.

     

    먼저 <context:component-scan .../>에서는 해당 위치의 어노테이션을 읽어들여서 bean으로 등록한다.

    <annotation-driven />HandlerMapping & HandlerAdapter의 역할로써,

    component-scan을 통해서 스캔된 bean 중에서 해당 요청과 알맞은 Controller를 찾아 연결시켜준다.

     

     

    HandlerMapping을 통하여 요청에 맞는 컨트롤러인 HomeController로 이동하였다.

    다음으로 요청을 처리할 곳은 HomeController이다.

    servlet-context.xml의 component-scan에 의해서 HomeController의 @Controller이 읽혀 bean으로 등록되었고,

    annotation-driven은 @RequestMapping을 읽어들이면서 해당 요청(/)을 처리할 수 있는 Controller를 찾아냈다.

     

    그렇게 해서 HomeController가 요청을 받을 수 있게 된 것!

     

    요청을 받 Controller는 적당한 처리를 취한뒤,

    Model.addAttribute()를 통하여 처리완료된 데이터를 Model에 다시 담고, "Home"이라는 이름으로 return 한다.

     

    다시 servlet-context.xml로 돌아왔다!

    Model과 Controller 거쳤으니, 이제 View를 거칠 차례이다.

    다시 돌아온 servlet-context.xml에서는 Controller에서 반환된 "Home"을 가지고 View로 접근할 수 있는 경로를 만든다.

     

    이 과정을 거치면 /WEB-INT/views/Home.jsp 라는 경로가 최종적으로 만들어지게 되고

    InternalResourceViewResolver를 통하여 이에 맞는 View를 찾는다.

     

     

     

    이따 UTF-8 설정도 해줘야겠다...ㅜ

    이것이 다시 web.xml의 DispatcherServlet으로 넘어가게 되면서

    우리가 Home.jsp를 브라우저 상에서 볼 수 있게 된다.

     

     

     

     

     

Designed by Tistory.