실제 프로젝트를 진행하다보면 dev, stg, prod 등 운영환경에 따라 서버 설정이나, 데이터베이스 설정 등을 다르게 설정한다. 이렇게 스프링부트 외적인 시스템과 연동할때 필요한 profile들을 정의하거나 프로그램이 실행되는데 필요한 속성들을 정의할때 application.yml이나 application.properties를 사용하게된다. 스프링 initializr를 통해 프로젝트를 생성하면 application.properties가 생성되지만, 종종 yml파일로 변경해서 사용하는 경우가 있다.
# DB Setting
spring:
datasource:
driver-class-name: oracle.jdbc.driver.OracleDriver
url: jdbc:oracle:thin:@localhost:1521:orcl
username: username
password: password
※ yml 파일과 properties 파일을 함께 사용하면 properties 파일이 우선순위가 높아 yml 파일의 설정이 이를 덮어 쓰게 된다. 즉, application.yml 파일만 오버라이드 되어 적용됩니다.
그 외 리스트 구조에서도 차이가 있다.
application.servers[0].ip=127.0.0.1
application.servers[0].path=/path1
application.servers[1].ip=127.0.0.2
application.servers[1].path=/path2
application:
servers:
- ip: '127.0.0.1'
path: '/path1'
- ip: '127.0.0.2'
path: '/path2'
기존의 Spring에서는 모든 설정을 XML 파일로 사용했다면, Spring boot에서는 Embedded Tomcat, Application 설정 관련 및 기타 정적인 값을 키 값 형식으로 관리합니다.
application.properties, yml 파일이 설정을 해주는 파일입니다.
어떻게 이런 것이 저렇게 단순한 값을 설정하는 것만으로도 가능한 것일까요? 그것은 바로 여러분들이 만드신 Spring boot 프로젝트의 메인 코드에 그 답이 있습니다.
package xyz.neonkid.blogexample
import org.springframework.boot.autoconfigure.SpringBootApplication
import org.springframework.boot.runApplication
@SpringBootApplication
class BlogexampleApplication
fun main(args: Array<String>) {
runApplication<BlogexampleApplication>(*args)
}
이 메인코드에는 SpringBootApplication 어노테이션이 있습니다. 이 어노테이션의 코드를 조금 살펴 보자면..
이렇게 @EnableAutoConfiguration 자동 환경 설정이라는 어노테이션이 달려져 있습니다. 이는 Spring boot에서 크게 개선된 점이자 아주 큰 장점입니다. 왜냐하면, 이 어노테이션 하나로, Web, H2, JDBC를 비롯한 약 100여 개의 자동 설정을 제공하기 때문이죠.
더욱이, 해당 애플리케이션에서 새로이 추가되는 라이브러리 (JAR)는 Spring boot 자동 환경 설정에 의거, 설정이 자동 적용되는데, 만약 H2 의존성이 클래스 경로에 존재한다면, 자동으로 In-memory DB에 접근하는 것이죠. 이 말은 구체적으로 우리가 application.properties에서 H2 설정 파일을 입력하는 것만으로도 별도의 구현 코드 작성 없이 자동으로 해당 애플리케이션이 In-memory DB에 접근한다는 것입니다. (와우, 엄청 좋죠.. )
좀 더 구체적으로 어떻게 동작하는지 한 번 보도록 하자면... META-INF/spring.factories에 정의된 자동 설정할 클래스들을 먼저 불러오는데, 여기에 H2, Web 등 100 여개의 설정이 미리 정의 되어 있고, 그 클래스들을 로드하여 자동 설정을 만들어내는 것입니다. 단, 이렇게 하게 되면, 중복되는 빈이 설정될 경우가 생길텐데, 이를 대비하여 처리한 로직이 눈에 띄는 게 있습니다.
바로 Set을 이용해서 제외할 설정들을 저장하는데, 여기서 제외할 설정들은 중복된 설정 removeDuplicates 메소드를 이용해 이미 추려진 것이죠. 마지막으로 이 중에서 프로젝트에 사용되는 Bean만 Import할 자동 설정 대상으로 선택됩니다.
그렇다면, 이들 클래스의 등록과 자동 설정에 사용되는 파일들은 어떤 것일까요?
그렇다면 우리가 바꾼 Embedded Tomcat의 LISTEN PORT 설정값도 있겠죠? 네, 맞습니다. 여기에 있습니다.
실제로 이 곳에는 Spring REST 뿐 아니라 Spring Security 등 다양한 모듈에 대한 자동 설정 값이 담겨져 있습니다. 다른 모듈에 대해서는 차후 포스트에서 다룰 것이지만, 왜 Spring boot에서 이런 Key-value 형태의 값 만으로 서버 애플리케이션 설정이 바뀔 수 있는지 이해가 될 것이라고 생각합니다.
http://blog.neonkid.xyz/216
https://velog.io/@lily_younk/application.yml-.properties-%EC%B0%A8%EC%9D%B4