yoncho`s blog

[Spring Configuration] 설정 파일 변화 ( .xml -> .java -> .yml ) 본문

기술, 나의 공부를 공유합니다./[Web][BE] JAVA

[Spring Configuration] 설정 파일 변화 ( .xml -> .java -> .yml )

욘초 2023. 10. 14. 14:53

목차 : 
1) xml configuration에서 java configuration으로 변환 (*war)

2) java configuration (*war)에서 yaml configuration (*jar)로 변환 (*jar로 프로젝트 생성 후 packaging만 war로 수정)

 

drawio url : https://drive.google.com/file/d/16hNdDqlQmDRqtJXNcSwqEN9kkDIFxiQX/view?usp=sharing 


1. xml configuration에서 java configuration으로 변환

그림 (1)

*pom.xml :  maven의 빌드 정보를 담은 파일로, POM(Project Object Model)을 설정하는 부분이다. 프로젝트 내 빌드 옵션을 설정한다.
*maven : 자바 프로젝트를 관리하는 툴로 미리 작성된 xml 파일을 이용해 라이브러리 자동 다운 및 프로젝트를 빌드한다. 
즉, 자바 소스를 컴파일, 패키징, deploy 까지 자동화 해준다.

기본적으로 pom.xml은 maven에 필수 요소이며 pom에 프로젝트 빌드에 필요한 라이브러리 정보를 담는다.

 


[1] xml configuration

설정 파일 

1. web.xml : 
2. application-context.xml :  (root-context.xml)
3. spring-servlet.xml : (servlet-context.xml) 

 

web.xml 

web application deployment descriptor라고 불리는 web.xml은 JAVA EE기반의 web application 에서 사용되는 배포
  기술자다. spring framework가 web application을 구성할 때 필요한 내용을 정의하는 파일이다.
  서블릿 매핑, 리스너, 필터, 세션 설정, 오류 페이지 처리 와 같이 web application 구성을 정의한다.

**pom.xml과 web.xml의 차이는??

   pom.xml은 maven 빌드 및 라이브러리 관리와 관련이 있으며 spring framework에 더 간접적 관련이 있고,
   web.xml은 spring web application의 구성과 웹 요청 처리와 관련 있다.
   spring 3.1ver 이후 부터는 web.xml을 java configure class와 annotation을 사용해 spring web application configuration
   을 설정할 수 있다.   

 

application-context.xml  (root-context.xml)

spring bean, data source, 서비스 및 비즈니스 로직, 보안 및 인증을 설정 하는 파일이다.

Root Spring Container를 설정한다.

 

spring-servlet.xml  (servlet-context.xml)

컨트롤러와 뷰, resource , view resolver, 포맷터, 다국어, 세션 관리 등을 설정하는 파일이다.
servlet context의 설정을 담당한다.

*servlet이란 :
java web application에서 dynamic web page 생성 및 web request 처리를 위한 class이다.
JAVA EE 표준의 일부로 Spring Framework는 servlet을 기반으로 구축된 web application에서 사용할 수 있는 다양한 기능을 제공한다. 

 

 


[2] java configuration 

설정 파일 :

1. webApplicationInitializer.java : 
2. appConfig.java :  (root-context.xml)
3. webConfig.java : (servlet-context.xml) 

 

 

webApplicationInitializer.java 

* spring 3.1ver 이후 부터는 web.xml을 java configure class와 annotation을 사용해  java 파일로 변경할 수 있다.

위 그림(1)에서 web.xml 이 webApplicationInitializer.java로 변경된 것을 확인할 수 있다.
이때 상속받는 class는 "AbstractAnnotationConfigDispatcherServletInitializer" 이다. 

 

AbstractAnnotationConfigDispatcherServletInitializer

spring web application을 구성하고 초기화 하는데 사용되는 class이다. 

web.xml파일을 사용하지 않고도 java 구성을 기반으로 web application을 설정할 수 있다.
spring 3.1ver 이후 부터 가능하며, sprin web application을 더 모듈화 하고 더 간편하게 설정할 수 있다.

*java 기반 설정 클래스 등록 (getRootConfigClasses(), getServletConfigClasses()) 함수를 사용해
기본 application-context.xml  (context load listener)과 spring-servlet.xml (dispatcher servlet config)을 java class로 구성한 뒤 호출할 수 있다.
*dispatcher servlet 설정 (getServletMapping()) 함수를 사용해 DispatcherServlet의 URL 매핑을 할 수 있다.
즉 ' /* ' 와 같이 모든 URL을 라우팅할 수 있게 설정할 수 있다.

 

appConfig.java & webConfig.java

application-context.xml / spring-servlet.xml 의 구성들을 모듈화 하여 각각 java class로 분리한 뒤,

분리된 구성들을 app/web Config.java에 @Import하고  필요한 경우 특정 annotation을 사용해 직접 기능을 추가해 web application을 구성한다.

 

 

 

 

3줄 요약:

web.xml -> AbstractAnnotationConfigDispatcherServletInitializer를 상속받은 java 파일로 변경 가능하다.
application-context.xml 또한 appConfig.java로 변경될 수 있다.
spring-servlet.xml 또한 webConfig.java로 변결될 수 있다.

 

 


2. java configuration 에서  yaml configuration으로 변환 (Spring Boot 권장)

그림 (2)

*configuration.yaml : 

Spring Framework에서 Spring Boot로 넘어오게되면 기존 .xml/ .java configuration 파일이 .yaml/ .properties configuration 파일로 대체된다. Spring Boot에서 주로 사용하며, web application의 구성을 정의한다.
Spring Boot 속성, data source, server 등 주요 설정들을 명시해놓을 수 있으며 이 파일은 Spring Boot로 넘어올 때 외부 참조 파일 중 하나이다.

이전 Spring Framework에서 명시적(explicit) 설정을 했으면 Spring Boot로 넘어오면서 SpringBoot의 auto configuration과 외부 파일 참조로 설정을 한다. 

 

[3] yaml configuration 

 

Configuration.yaml

classpath( src/main/resources )에 위치해야한다. SpringBoot는 자동으로 classpath안에 있는 설정 파일을 찾게되어있다.

추가로, classpath 하위 어떤 디렉터리에 있든 .yml , .yaml, .properties 순으로 찾아 읽는다.
configuration.yaml에는 
application name 부터 시작해서 spring 설정, mybatis 설정, security 설정, server 설정, resource mapping 등 많은 설정을 할 수 있다. 

 

Application.java

@SpringBootApplication 을 사용하면 아래 어노테이션들이 적용된다.
 1) @Configuration : 구성 파일 역할
 2) @ComponentScan : @Controller, Service, Repository, Component 를 탐색함.
 3) @EnableAutoConfiguration : Spring Boot의 핵심 기능으로, class 경로 상의 의존성 기반으로 (class 현재 디렉토리 및 하위 탐색) 자동 구성 한다.
 즉, SpringBootApplication을 빠르게 구축할 수 있다.

 

BootInitializer.java  (*spring boot를 war파일로 배포할 경우 필요!!)

SpringBootServletInitializer 를 상속 받는다. 
SpringBootServletInitalizer를 설명하기 전 Spring Boot web application은 주로 embedded tomcat이 내장된 jar 파일을 이용해 배포한다. 하지만 특별한 경우 전통 배포 방식인 war 파일로 배포를 진행해야하는 경우가 있는데.
이럴 때 SpringBootServletInitalizer를 상속받으면 된다. (즉, war 파일 빌드 및 배포가 아닌경우 해당 class는 필요 없다.)

 

**Spring Boot war 배포할 때 왜 SpringBootServletInitializer가 필요한건가???

spring web application은 외부 tomcat에서 동작하도록 하기 위해 web.xml에 application-context를 등록해야한다. 
이는 apache tomcat(servlet container)이 구동될 때 /WEB-INF 디렉토리에 존재하는 web.xml을 읽어 web application을 구성하기 때문이다. 
하지만 servlet 3.0 spec update 되면서 web.xml 없이 동작이 가능해졌다. 이는 web.xml을 WebApplicationInitializer interface를 구현하여 대신할 수 있게 됐고, 프로그래밍적으로 servlet-context에 Spring IoC

(AnnotationConfigWebApplicationContext)를 생성 및 추가할 수 있게 변경했기 때문이다. 

( *위 그림(1)을 보면 web.xml을 AbstractAnnotationConfigDispatcherServletInitializer을 상속받았는데.
이는 WebApplicationInitializer를 상속한 것과 동일한 역할을 수행한다. )

이와 비슷한 맥락으로 web.xml이 없는

springboot web application은 war 파일로 구성해 외부 tomcat에서 동작하도록 하기 위해서는 
WebApplicationInitializer interface를 구현한 SpringBootServletInitializer를 상속 받는게 필요했다.

 

 

Comments