출처 :
https://hello-walnuty.tistory.com/16
Spring Project의 Home.jsp 실행 시, 404 Error가 발생하는 이유
(부제) Spring Framework의 동작원리 얼마 전 나는 학생 때 진행했던 개발 프로젝트를 리팩토링 하기 위해 Spring을 재설치했다. Spring 설치가 제대로 되었는지 확인하기 위해, Project를 생성하여 그 안에
hello-walnuty.tistory.com
Spring MVC 프로젝트의 기본 구조와 실행 순서
Spring MVC 프로젝트의 기본 구조 Spring의 전체적인 실행 순서 요청 -> DispatcherServlet -> HandlerMapping -> 요청 처리하기 (Controller Service DAO DB) -> DispatcherServlet -> ViewResolver -> View -> DispatcherServlet -> 응답 예
devpad.tistory.com
home.jsp 파일이 위치한 WEB-INF 폴더는 설정파일 등이 들어있는 중요한 폴더이므로 외부에서의 접근을 막고 있다.
따라서 home.jsp에 포커스를 두고 실행시키면 404 error가 발생하게 되고, 프로젝트 자체에 포커스를 두고 run하면 정상적으로 실행됨을 확인할 수 있다.
이를 이해하기 위해 spring framework의 작동 방식에 대해 이해해보자.
Spring의 전체적인 실행 순서
요청
-> DispatcherServlet -> HandlerMapping
-> 요청 처리하기 (Controller <-> Service <-> DAO <-> DB)
-> DispatcherServlet -> ViewResolver -> View
-> DispatcherServlet -> 응답
예시 1. 일반적인 기본 동작 순서

예시 2. 위 예시에서 Controller 뒷부분의 과정을 생략함

먼저, 클라이언트로부터 request가 들어오면 web.xml이 실행되어 요청에 대해 가장 먼저 처리를 시작한다.
이때 DispatcherServlet이 <url-pattern>의 형태로 들어오는 요청을 가로채 servlet-context.xml로 넘겨준다.
(초기 web.xml에서는 <url-pattern>이 '/'으로 해당 애플리케이션의 모든 url로 등록되어 있어서 모든 요청을 가로챈다)

servlet-context.xml에서
<context:component-scan ... />은 해당 위치의 어노테이션을 읽어들여서 bean으로 등록한다.
<annotation-deriven />은 HandlerMapping & HandlerAdapter의 역할을 하여, component-scan을 통해 스캔된 bean 중에서 해당 요청과 알맞은 Contoller를 찾아 연결시켜준다.
HandlerMapping은 실제 클라이언트의 조회 요청을 수행할 Handler를 찾아주는 역할을 한다. 클래스에 @Controller 어노테이션을 붙이면 servlet-context.xml에서 이를 인식하여 컨트롤러로 등록한다. 그리고 컨트롤러에서 @RequestMapping 어노테이션을 사용해 /post/view 값을 설정하면 해당 컨트롤러의 해당 메서드를 인식하고 찾아가게 된다. 스프링 4.3부터는 @RequestMapping 문장을 좀 더 간추려서 @GetMapping("/post/view") 로 선언할 수 있다.

HandlerMapping을 통해 요청에 맞는 컨트롤러인 HomeController로 이동한다.
servlet-context.xml의 component-scan에 의해 HomeController의 @Controller가 읽혀 bean으로 등록되었고, annotation-driven은 @RequestMapping을 읽어들이면서 해당 요청(/)을 처리할 수 있는 Controller를 찾아냈다.
따라서 HomeController가 요청을 받을 수 있었고, 요청을 받은 Controller는 적당히 처리해 Model.addAttribue()를 통해 처리완료된 데이터를 Model에 다시 담고, "home"이라는 이름(사진에서는 "main")으로 다시 return한다. return 문자열은 나중에 servlet-context.xml에 설정된 prefix와 suffix 정보를 참조하여 /WEB-INF/views/home.jsp 파일을 찾는 정보를 제공한다.
컨트롤러에서 비즈니스 로직을 거쳐 기능을 수행한다.
즉, Controller > Service > DAO > DB > DAO > Service > Controller의 순서로 진행된다. 컨트롤러에서 출발하여 DB에서 값을 가져온 후 다시 컨트롤러로 돌아오는 구조이다.

Model과 Controller를 거친 후에는 View를 거칠 차례다.
이제 DB에서 조회한 data를 실제 화면으로 보여줘야 한다.
ViewResolver는 컨트롤러에서 보내온 view이름(여기선 main)을 토대로 view 화면(home.jsp)을 찾게 된다.
다시 servlet-context.xml에서는 Controller에서 반환된 "home"을 가지고 View로 접근할 수 있는 경로를 만든다.
이 과정을 거치면 /WEB-INF/views/home.jsp 라는 경로가 최종적으로 만들어지게 되고, InternalResourceViewResolver를 통해 이에 맞는 View를 찾는다.
찾은 view 화면(home.jsp)에서는 $를 이용하여 컨트롤러에서 Model 객체를 이용해 설정한 파라미터 값들을 설정하면 된다. 이 View가 다시 web.xml의 DispatcherServlet으로 넘어가게 되어 home.jsp를 브라우저 상에서 우리가 home.jsp를 브라우저 상에서 볼 수 있게 된다.
'Spring' 카테고리의 다른 글
[tiles] 타일즈 파일 이름에 언더바 사용 시 매핑 안됨 (0) | 2023.10.15 |
---|---|
[Spring] pom.xml 태그 (0) | 2022.06.13 |
[Spring] 의존성 주입 테스트(Chef, Restaurant)_5/10 (0) | 2022.05.26 |
[Spring] 환경설정 중 에러 발생 (0) | 2022.05.23 |