[꼼꼼한 개발자] 꼼코더

17. 코드로 배우는 스프링 웹 프로젝트 -[스프링 MVC 설정] - 스프링 MVC의 기본 구조와 내부 구조(코드 실습) 본문

Spring/코드로 배우는 스프링 웹 프로젝트

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 버전으로 변경한다.

pom.xml에서 스프링 버전을 5.0.7로 변경하는 화면

또한 Lombok 기능을 이용해서 간단한 코드를 작성하고, 테스트 할 것이므로 pom.xml에 추가한다.

pom.xml에 Lombok 의존성을 추가한 화면

 

Spring Legacy Project로 생성된 프로젝트는 서블릿 버전이 2.5 버전을 사용하지만

Java 설정 등을 이용하려면 서블릿 3.0 이상을 사용하는 것이 좋다.

pom.xml 파일을 수정한다. (기존 > 주석 처리 or 삭제)

pom.xml에서 서블릿 버전을 3.0 이상으로 수정한 화면

Maven의 컴파일 옵션은 1.8버전으로 변경하고 프로젝트 우클릭 → ‘Maven’ → ‘update project’ 실행

Maven 컴파일 옵션을 1.8로 변경하고 update project 실행하는 화면

 

웹 프로젝트는 가능하면 절대 경로를 이요하는 구조로 사용하는 것이 바람직하다.

따라서 TomCat → Modules 메뉴 → ‘/’ 경로로 프로젝트가 실행될 수 있도록 처리한다.

Tomcat Modules 설정에서 절대 경로(/)로 실행되도록 처리한 화면

💁🏻‍♂️ 결과

프로젝트 실행 결과 확인 화면 (XML 설정 기반)

👨🏻‍💻 코드 예제(Java 설정)

위와 같이 동일한 방법으로 프로젝트 ‘jex01’ 생성 (설정들 포함)

java 설정 방식이므로 web.xml 파일과 spring 폴더(servlet-context, root-context)는 삭제한다.

web.xml, spring 폴더(servlet-context, root-context)를 삭제한 화면 (Java 설정 기반)

java 설정 이용시 pom.xml에 web.xml이 없다는 설정을 추가한다.

 

pom.xml에 web.xml이 없다는 설정을 추가한 화면

 

👨🏻‍💻 RootConfig 클래스 작성

Servlet-context.xml이 없는 상태에서 프로젝트를 시작하게 되므로

org.zerock.config 패키지 생성 → WebConfig 클래스, RootConfig 클래스를 작성한다.

 

WebConfig 클래스를 작성하는 화면
RootConfig 클래스를 작성하는 화면

👨🏻‍💻 ServletConfig, WebConfig 작성

Spring MVC를 이용하는 경우 servlet-context.xml을 대신하는 별도의 ServletConfig 클래스를 작성한다.

ServleConfig 클래스는 기존의 servlet-context.xml에 설정된 모든 내용 아래와 같은 방식으로 담아야 한다.

 

  • @EnableWebMvc 어노테이션 + WebMvcConfigurer 인터페이스를 구현하는 방식
  • @Configuration 어노테이션 + WebMvcConfigurationSupport 클래스를 상속 하는 방식

 

예제는 @EnableWebMvc 어노테이션을 이용해서 제작하겠다.

기존 servlet-context.xml(그림 좌)의 내용을 아래 코드(그림 우)를 통해서 설정한다.

ServletConfig 클래스를 작성 화면 (1)servlet-context.xml 재설정 화면
 

 

WebMvcConfigurer는 스프링 MVC와 관련된 설정을 메서드로

오버라이드 하는 형태를 이용할 때 사용한다.

 

ServletConfig 클래스 역시 @ComponentScan을 이용해서

다른 패키지에 작성된 스프링의 객체(Bean)를 인식할 수 있다.

 

 

작성된 ServletConfig 클래스를 실행하기 전 WebConfig 설정은 아래와 같이

ServletConfig를 이용하고, 스프링 MVC의 기본 경로도 ‘/’로 변경되어야 한다.

WebConfig에서 ServletConfig를 등록하고 경로를 '/'로 변경한 설정 화면

 

💁🏻‍♂️ 결과

프로젝트 실행 결과 확인 화면 (Java 설정 기반)

🚜 예제 프로젝트의 로딩 구조

 

프로젝트가 정상적으로 실행되었다면 서버 구동 시 약간의 로그가 기록되는 것을 볼 수 있다.

이 로그를 이용해서 ‘어떤 과정’을 통해서 프로젝트가 실행되는지를 엿볼 수 있다.

 

프로젝트 구동 시 관여하는 XML은 web.xml, rootcontext.xml, servlet-context.xml 파일이다.

  • 스프링과 관련된 설정 : rootcontext.xml, servlet-context.xml
  • Tomcat 구동과 관련된 설정 : web.xml

 

프로젝트 구동은 web.xml에서 시작한다.

web.xml 상단에는 가장 먼저 구동되는 Context Listenter가 등록되어 있다.

 

web.xml에서 ContextLoaderListener와 root-context.xml 경로가 설정된 부분
  • <context-param> : root-context.xml의 경로가 설정.
  • <listener> : 스프링 MVC의 ContextLoaderListener가 등록.

 

ContextLoaderListener는 해당 웹 애플리케이션 구동 시 같이 동작하므로 프로젝트 실행 후 가장 먼저 로그를 출력하면서 기록하는 것을 확인할 수 있다.

ContextLoaderListener 실행 후 root-context.xml 로딩 로그 화면

root-context.xml이 처리되면 파일에 있는 빈(Bean) 설정들이 동작하게 된다.

이를 그림으로 표현하면 다음과 같다.

 

root-context.xml에서 정의된 Bean들이 스프링 컨텍스트에 생성되는 구조도

root-context.xml에 정의된 객체(Bean)들은 스프링의 영역(context) 안에 생성되고

객체들 간의 의존성이 처리된다.

 

root-context.xml이 처리된 후에는 스프링 MVC에서 사용하는 DispatcherServlet이라는

서블릿과 관련된 설정이 동작한다.

DispatcherServlet이 로딩되는 web.xml 설정 부분

 

org.springframework.web.servlet.DispatcherServlet 클래스는

스프링 MVC의 구조에서 가장 핵심적인 역할을 하는 클래스이다.

 

내부적으로 웹 관련 처리의 준비작업을 진행한다

이때 servlet-context.xml 파일을 사용한다.

 

DispatcherServlet이 servlet-context.xml을 로딩하는 로그 화면

로그를 보면 DispatcherServlet에서 XMLWebApplicationContext를 이용해서

servlet-context.xml을 로딩하고 해석하기 시작한다.

 

이 과정에서 등록된 객체(Bean)들은 기존에 만들어진 객체(Bean)들과 같이 연동되게 된다.

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)들과 같이 연동.

 

 

 

위 내용은 코드로 배우는 스프링 웹 프로젝트 교재를 참고하여 작성되었습니다.

 

코드로 배우는 스프링 웹 프로젝트 - YES24

이 책은 Spring Framework(이하 스프링)를 사용해서 말 그대로 ‘웹 프로젝트’를 어떻게 진행하는지를 설명하는 책이다. 웹 프로젝트라고 거창하게 표현하지만, 좀 더 구체적으로는 스프링으로 웹

www.yes24.com