-
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를 브라우저 상에서 볼 수 있게 된다.
'Programming > Issue' 카테고리의 다른 글
백준 #4344 평균은 넘겠지. (0) 2020.03.26 Spring, MyBatis, MySQL을 연동하면서 발생했던 에러 (0) 2019.10.17