스프링 부트에서는application의 환경 설정을 위해서src/main/resources 아래에 application.properties 또는application.yml 파일을 사용할 수 있다. 이 둘은 동일한 내용을 약간 다른 방법으로 작성하는데 properties는 간단하지만 장황하고 yml은 상대적으로 복잡하지만 효율적이다.
.properties 작성 방법
key=value의 맵 구조
properties 파일은key=value의 구조로 설정들을 작성한다. 여기서 많이 하는 실수 중 하나가가독성을 높인다는 이유로 = 주변에 공백을 넣는 것이다. 그러면공백까지 key 또는 value의 일부가 되버린다.
!key는 'key' 속성의 값을 'value'이다.key=value
!key는 'key ' 속성의 값은 ' value'이다.key = value
한 줄 주석을 작성할 때는# 또는 !를 사용한다. 이전에는 #을 주로 사용했는데#--- 가 multi profile 표현으로 사용되면서일반 주석은 !만 사용하는 편이 좋다.
key 값은 당연히 동일 문서에서 유일해야 하며 Map 구조의 객체를 표현할 때에는 .을 이용해서 계층을 표현할 수 있다.
! key=value 구조
ip=192.168.0.1
server.url=http://${ip}
server.user.id=hong
server.user.pass=1234
server.domain.name=com.doding
목록을 표현할 때는 한 줄에 여러 목록을 표시하거나 index를 이용해서 표현할 수 있다.
! String [] 또는 List<String>으로 처리
members.names=hong, jang, lim
! index 기반으로 하나씩 처리
members.skils[0]=java
members.skils[1]=spring
members.skils[2]=web
members.ages[0]=20
members.ages[1]=40
다중 문서 모드
하나의 문서에서 다중 profile을 처리하기 위해 다중 문서 모드를 사용할 수 있는데 이를 표현하기 위해 줄의 맨 앞에 #---을 사용한다. 이 경우 새로운 문서로 인식이 되고 동일한 key로 기존 속성을 재정의 할 수 있다.
server.user.pass=1234#---
! 이제 새로운 파일의 개념: 현재는 단순히 재정의
server.user.pass=5678
따라서 위의 설정이 있을 때 server.user.pass의 값은 1234가 아니라 5678이 된다.
단위테스트 작성
다음은 위 설정에 대한 테스트 코드이다.
SpringBoot와 JUnit을 쉽게 연동하기 위해서는@SprintBootTest애너테이션을 클래스 레벨에 사용한다. properties에 선언된 속성을 사용할 때에는@Value에 사용할속성의 정보를 ${속성_key} 형태로 작성해 준다.
! key=value 구조
ip=192.168.0.1
server.url=http://${ip}
server.user.id=hong
server.user.pass=1234
server.domain.name=com.doding
properties 버전과 비교해 보면 계층적으로 표현하다 보니 코드의 중복이 감소하는 것을 볼 수 있다.
목록의 표현
목록을 나타낼 때는','를 이용해서 여러 개를 나열하며 프로그램에서 사용할 때는배열 또는 List로 처리된다. 또는[ ]를 이용해 묶어서 표현하거나매 줄마다 - 를 이용해 요소를 나열하기도 하는데 이를 프로그램에서 사용할 때는 목록으로 받아서 사용하지 않고인덱스를 이용해 개별 요소에 접근해야 한다.
members:#String [] 또는 List<String>으로 처리names:hong,jang,lim#index 기반으로 하나씩 처리 skils: [java, spring, web]
ages:-20-40
! String [] 또는 List<String>으로 처리
members.names=hong, jang, lim
! index 기반으로 하나씩 처리
members.skils[0]=java
members.skils[1]=spring
members.skils[2]=web
members.ages[0]=20
members.ages[1]=40
다중 문서 모드
---를 통해서다중 문서 모드로 사용할 수 있는데 이 경우새로운 문서로 인식이 되고 동일한 key로 기존 속성을 재정의 할 수 있다. 이 속성을 이용해 나중에다중 profile을 구성할 수 있다.
다음 예에서는 server.user.pass 속성을 처음에 1234라고 했다가 5678로 변경한 예이다.
server:user:pass:1234---# 이제 새로운 파일의 개념: 현재는 단순히 재정의server:user:pass:5678
server.user.pass=1234#---
! 이제 새로운 파일의 개념: 현재는 단순히 재정의
server.user.pass=5678
단위테스트 작성
설정 작성 방식이 단순히 properties에서 yml로 변경된 것이기 때문에 테스트 내용을 변경할 필요는 없다.
built in 속성의 활용
SpringBoot의 built in 속성들
위에서 선언했던 사용자 정의 속성들 외에도 SpringBoot에서는 기본적으로 제공되는 다양한 속성들이 있고 필요시 그 값을 재정의 해서 사용할 수 있다.
logging.level.* : logging.level은 Map 형태로 여러 개의 key: value를 받을 수 있다. key로는 log level을 설정할 package 이름이 들어오고 value에는 log의 level을 써주면 된다. 이 설정은 하위 package에까지 영향을 준다.
추가해야할 설정들이 많아지면 하나의 설정 파일에 모든 내용을 담으면 복잡도가 올라간다. 이런 경우 별도의 설정 파일을 추가하고 @PropertySource에 등록해주면 된다. (application.properties 또는 application.yml 파일은 기본으로 등록된다.)
@Configuration@PropertySource("classpath:customProperties.yml")
public class MyAppConfig {
// 설정 내용
}
@TestPropertySource
application.properties와 application.yml 파일이 동시에 존재한다면 SpringBoot는 먼저 yml을 읽고 properties의 내용으로 덮어쓰게 된다. (물론 이런 것을 이용해서 프로그래밍하지는 않는다. 우선순위가 그렇다는 것)
SpringBoot에서는 테스트 과정에서 사용할 설정을 지정할 수 있는데 이때 사용되는 annotation으로 @TestPropertySource가 있다.
@SpringBootTest@Slf4j// 사용 대상(.yml or .properties)를 지정할 수 있다.@TestPropertySource(properties = {"spring.config.location=classpath:application.yml" })
class QuickstartApplicationTests {
// 테스트 코드 작성
}