[꼼꼼한 개발자] 꼼코더
17. 코드로 배우는 스프링 웹 프로젝트 -[스프링 MVC 설정] - 스프링 MVC의 기본 구조와 내부 구조(코드 실습) 본문
17. 코드로 배우는 스프링 웹 프로젝트 -[스프링 MVC 설정] - 스프링 MVC의 기본 구조와 내부 구조(코드 실습)
꼼코더 2023. 1. 5. 00:56👨🏻💻 코드 예제(XML 설정)
‘Spring Legacy Project’ → ‘Spring MVC Project’ → ‘org.zerock.controller’ → ‘ex01’ 프로젝트 생성
생성된 프로젝트는 스프링 버전이 3 버전이므로 pom.xml을 수정하여 5.0.7 버전으로 변경한다.
또한 Lombok 기능을 이용해서 간단한 코드를 작성하고, 테스트 할 것이므로 pom.xml에 추가한다.
Spring Legacy Project로 생성된 프로젝트는 서블릿 버전이 2.5 버전을 사용하지만
Java 설정 등을 이용하려면 서블릿 3.0 이상을 사용하는 것이 좋다.
pom.xml 파일을 수정한다. (기존 > 주석 처리 or 삭제)
Maven의 컴파일 옵션은 1.8버전으로 변경하고 프로젝트 우클릭 → ‘Maven’ → ‘update project’ 실행
웹 프로젝트는 가능하면 절대 경로를 이요하는 구조로 사용하는 것이 바람직하다.
따라서 TomCat → Modules 메뉴 → ‘/’ 경로로 프로젝트가 실행될 수 있도록 처리한다.
💁🏻♂️ 결과
👨🏻💻 코드 예제(Java 설정)
위와 같이 동일한 방법으로 프로젝트 ‘jex01’ 생성 (설정들 포함)
java 설정 방식이므로 web.xml 파일과 spring 폴더(servlet-context, root-context)는 삭제한다.
java 설정 이용시 pom.xml에 web.xml이 없다는 설정을 추가한다.
👨🏻💻 RootConfig 클래스 작성
Servlet-context.xml이 없는 상태에서 프로젝트를 시작하게 되므로
org.zerock.config 패키지 생성 → WebConfig 클래스, RootConfig 클래스를 작성한다.
👨🏻💻 ServletConfig, WebConfig 작성
Spring MVC를 이용하는 경우 servlet-context.xml을 대신하는 별도의 ServletConfig 클래스를 작성한다.
ServleConfig 클래스는 기존의 servlet-context.xml에 설정된 모든 내용 아래와 같은 방식으로 담아야 한다.
- @EnableWebMvc 어노테이션 + WebMvcConfigurer 인터페이스를 구현하는 방식
- @Configuration 어노테이션 + WebMvcConfigurationSupport 클래스를 상속 하는 방식
예제는 @EnableWebMvc 어노테이션을 이용해서 제작하겠다.
기존 servlet-context.xml(그림 좌)의 내용을 아래 코드(그림 우)를 통해서 설정한다.
WebMvcConfigurer는 스프링 MVC와 관련된 설정을 메서드로
오버라이드 하는 형태를 이용할 때 사용한다.
ServletConfig 클래스 역시 @ComponentScan을 이용해서
다른 패키지에 작성된 스프링의 객체(Bean)를 인식할 수 있다.
작성된 ServletConfig 클래스를 실행하기 전 WebConfig 설정은 아래와 같이
ServletConfig를 이용하고, 스프링 MVC의 기본 경로도 ‘/’로 변경되어야 한다.
💁🏻♂️ 결과
🚜 예제 프로젝트의 로딩 구조
프로젝트가 정상적으로 실행되었다면 서버 구동 시 약간의 로그가 기록되는 것을 볼 수 있다.
이 로그를 이용해서 ‘어떤 과정’을 통해서 프로젝트가 실행되는지를 엿볼 수 있다.
프로젝트 구동 시 관여하는 XML은 web.xml, rootcontext.xml, servlet-context.xml 파일이다.
- 스프링과 관련된 설정 : rootcontext.xml, servlet-context.xml
- Tomcat 구동과 관련된 설정 : web.xml
프로젝트 구동은 web.xml에서 시작한다.
web.xml 상단에는 가장 먼저 구동되는 Context Listenter가 등록되어 있다.
- <context-param> : root-context.xml의 경로가 설정.
- <listener> : 스프링 MVC의 ContextLoaderListener가 등록.
ContextLoaderListener는 해당 웹 애플리케이션 구동 시 같이 동작하므로 프로젝트 실행 후 가장 먼저 로그를 출력하면서 기록하는 것을 확인할 수 있다.
root-context.xml이 처리되면 파일에 있는 빈(Bean) 설정들이 동작하게 된다.
이를 그림으로 표현하면 다음과 같다.
root-context.xml에 정의된 객체(Bean)들은 스프링의 영역(context) 안에 생성되고
객체들 간의 의존성이 처리된다.
root-context.xml이 처리된 후에는 스프링 MVC에서 사용하는 DispatcherServlet이라는
서블릿과 관련된 설정이 동작한다.
org.springframework.web.servlet.DispatcherServlet 클래스는
스프링 MVC의 구조에서 가장 핵심적인 역할을 하는 클래스이다.
내부적으로 웹 관련 처리의 준비작업을 진행한다
이때 servlet-context.xml 파일을 사용한다.
로그를 보면 DispatcherServlet에서 XMLWebApplicationContext를 이용해서
servlet-context.xml을 로딩하고 해석하기 시작한다.
이 과정에서 등록된 객체(Bean)들은 기존에 만들어진 객체(Bean)들과 같이 연동되게 된다.
🧹 과정 간략 정리
- 프로젝트 구동시 web.xml을 시작.
- web.xml 상단에 ContextListenter가. root-context.xml를 읽는다.
- ContextLoaderListener는 프로젝트 실행 후 가장 먼저 로그를 출력(root-context.xml 실행 확인)
- root-context.xml에 정의된 빈(Bean)들 동작.
- 객체(Bean)들은 스프링의 영역(context) 안에 생성 후 객체들 간의 의존성이 처리.
- 이 후 web.xml에서 MVC의 구조에서 가장 핵심적인 DispatcherServlet이라는 서블릿 관련 설정 동작.
- servlet-context.xml 파일을 사용하여 내부적으로 웹 관련 처리의 준비작업을 진행
- 이 과정에서 등록된 객체(Bean)들은 기존에 만들어진 객체(Bean)들과 같이 연동.
위 내용은 코드로 배우는 스프링 웹 프로젝트 교재를 참고하여 작성되었습니다.