스프링을 처음부터 다시 복습하는 도중 시작부터 생긴 일, 스프링이 처음이라면 겪을 수 있는 일을 정리해보았다.
스프링을 처음부터 복습하기 위해 스프링을 재설치를 하였다.
Spring의 설치가 제대로 되었는지 확인하기 위해서는 프로젝트 생성 후 home.jsp를 Run을 시켜 실행창을 통해 확인한다.
나 또한 home.jsp를 실행시켰는데 실행창을 확인해보면 404 Error 페이지가 뜬걸 보았다.
분명 제대로 실행시킨 것 같은데 아무리 다시 실행을 해봐도 계속 똑같은 404 Error 페이지가 뜨길래 무엇이 문제인지 몰라서 잠깐 헤맸었는데, 곰곰히 생각해보니 스프링에서 프로젝트 실행하는 방법이 잘못됐다는 걸 알았다.
home.jsp를 실행시킬려면 프로젝트를 기준으로 Run하면 정상 동작이 된 실행창을 볼 수 있다.
-> Run as home.jsp (X) Run as ex00 ( O )
두 개의 실행창을 자세히 보면 주소가 다른 걸 확인할 수 있다.
결론적으로 home.jsp로 접근하여 Run 시켰을 때, 404 에러가 났던 이유는 home.jsp가 위치한 WEB-INF 폴더는 설정 파일을 담고 있는 중요한 폴더이기 때문에 외부에서의 직접적인 접근을 막고 있기 때문이다.
home.jsp를 실행시키는 과정을 알기 위해서는 Spring Framework의 동작원리를 알아야한다.
Spring Framework의 동작원리
먼저, 클라이언트로부터 요청(Request)가 들어오면, 제일 먼저 web.xml이 실행된다.
web.xml에서는 요청에 대해 가장 먼저 처리를 시작한다.
여기서 DispatcherServlet은 web.xml에서 다른 처리로 넘어가기 전에 <url-pattern>의 형태로
들어오는 요청을 가로채어 servlet-context.xml로 넘겨버린다.
Dispatcher-Servlet
- 서클릿 컨테이너의 가장 앞단에서 HTTP 프로토콜로 들어오는 모든 요청을 먼저 받아 적합한 컨트롤러에 위임해주는 프론트 컨트롤러
1. 처음 클라이언트에서 요청이 오면 디스패처 서블릿이 해당 요청을 받는다.
2. Handler Mapping을 통해 요청에 알맞은 컨트롤러를 찾아낸다.
3. 찾아낸 컨트롤러를 Handler Adapter를 통해 해당 컨트롤러의 메서드를 실행시킨다.
4. 컨트롤러는 요청을 처리한 뒤 처리한 결과와 해당 뷰 정보(ModelAndView)를 다시 디스패처 서블릿에게 전달한다.
5. 받은 정보로 디스패처 서블릿은 View Resolver를 통해 View 파일을 찾는다.
servlet-context.xml에서 <context:component-scan.../>이 해당 위치의 어노테이션을 읽어들여서 bean으로 등록한다.
<annotation-driven/>은 HandlerMapping & HandlerAdapter의 역할로써, component-scan을 통해서 스캔된 bean 중에서 해당 요청과 알맞은 Controller를 찾아 연결시켜준다.
annotation-driven
- Spring MVC 컴포넌트들을 디폴트 설정을 통해 활성화한다.
- Spring MVC @Controller에 요청을 보내기 위해 필요한 HandlerMapping과 HandlerAdapter를 Bean으로 등록한다.
- HandlerMapping : HTTP 요청정보를 이용해서 컨트롤러를 찾아주는 기능
- HandlerAdapter : HandlerMapping을 통해 찾은 컨트롤러를 직접 실행하는 기능을 수행
- Bean을 생성하기 위해 xml 파일에 context:component-scan을 명시하면 이 태그를 포함하지 않아도 MVC 어플리케이션을 작동한다.
context:component-scan
- 특정 패키지 내의 클래스를 스캔하고 Annotation(@Component @Controller @Service @Repository)을 확인한 후 Bean 인스턴스로 생성한다.
- 이를 이용하면 @Autowired와 @Qualifier Annotation을 인식할 수 있다.
- context:component-scan을 선언했다면 context:annotation-config를 선언할 필요가 없다.
다음으로 요청을 처리할 곳은 HomeController이다.
servlet-context.xml의 component-scan에 의해서 HomeController의 @Controller이 읽혀 bean으로 등록되었고,
annotation-driven은 @RequestMapping을 읽어들이면서 해당 요청(/)을 처리할 수 있는 Controller를 찾아냈다.
이렇게 해서 HomeController가 요청을 받을 수 있게 되었고, 요청을 받은 Controller는 적당한 처리를 취한 뒤 Model.addAttribute()를 통하여 처리완료된 데이터를 Model에 다시 담고, "Home"는 이름으로 return 한다.
다시 돌아온 servlet-context.xml에서는 Controller에서 반환된 "Home"을 가지고 View로 접근할 수 있는 경로를 만든다.
이 과정을 거치면 /WEB-INT/views/Home.jsp 라는 경로가 최종적으로 만들어지게 되고
InternalResourceViewResolver를 통하여 이에 맞는 View를 찾는다.
이것이 다시 web.xml의 DispatcherServlet으로 넘어가게 되면서
우리가 Home.jsp를 브라우저 상에서 볼 수 있게 된다.
'Back-end > Spring' 카테고리의 다른 글
[Spring] @RequiredArgsConstructor란? (0) | 2023.12.02 |
---|