yoncho`s blog
[Spring Configuration] 설정 파일 변화 ( .xml -> .java -> .yml ) 본문
[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으로 변환
*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 권장)
*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를 상속 받는게 필요했다.
'기술, 나의 공부를 공유합니다. > [Web][BE] JAVA' 카테고리의 다른 글
[JavaScript] Prototype (*JS에서 Class처럼 사용됨) (1) | 2023.10.18 |
---|---|
[JAR/ WAR] 설명, 그리고 ..[더보기] (0) | 2023.10.16 |
[Plugin Setting & Jenkins Build] 배포 준비 과정 (0) | 2023.10.11 |
[Spring MVC] Global Exception Handler (@ControllerAdvice, @ExceptionHandler) (1) | 2023.10.10 |
[Spring MVC] ApplicationContext에 Dynamic Bean Create (0) | 2023.10.10 |