프로젝트를 진행하다 보면 DEV, QA, PROD마다 설정 해줘야하는 값이 다른 경우가 많을 것이다. 환경에 바뀔 때 마다 설정값들을 다 수정해주는 것 만큼 힘들고 귀찮은 것은 없을 것이다.
스프링 프레임 워크 개발자도 이를 잘 알고 있기 때문에 properties를 이용하여 상황에 맞게 설정값들을 설정해주는 방법을 제공해 주고 있다.
한국어로는 속성들, 속성을 정의한다.
속성이 정의되는 파일명은 application-{이름}.properties으로 구성되어야 하며 src/main/resources 폴더에 정의 되어 있어야 한다. application.properties은 기본으로 정의 되어 있어야 한다.
properties에는 다른 라이브러리의 설정값을 정의할 수 있고 또는 유저가 사용할 설정값들이 정의되어 있어도 된다.
다음은 스프링에서 사용될 설정값이 정의된 application.properties이다
//application.properties에 정의된 내용
spring.datasource.url= jdbc:mysql://localhost/data_1
spring.datasource.username= admin
spring.datasource.password= password
이렇게 설정 해주면 Spring에서 알아서 datasource정보를 가져간다.
커스텀 한 설정값도 위 Spring처럼 정의하면 된다.
//application.properties에 정의된 내용
spring.datasource.url= jdbc:mysql://localhost/data_1
spring.datasource.username= admin
spring.datasource.password= password
person.name = HyunKyu
person.addr = Seoul
이때 스프링은 해당 위치에 있는 application.properties를 읽어온다.
1. 클래스패스 루트
2. 클래스패스 / config
3. 현재 디렉토리
4. 현재 디렉터리 / config
5. /config 디렉토리 하위 디렉터리들
Spring boot에서 환경 설정에 사용되는 정보 말고도 다른 정보를 저장해야할 필요가 있을 때가 있다. 그럴때는 application.properties처럼 작성하면 된다. 다음은 예시 properties이다.
//dbConfig.properties에 정의된 내용
dbType = mySql
userId = root
passWord = password
해당 값은 class에 맵핑이 가능하며 @PropertySource를 통해 읽어올 properties를 지정하고 @Value를 이용하여 맵핑할 값을 설정하면된다.
@Component
@PropertySource("classPath:dbConfig.properties")//classPath는 프로젝트에 정의되어 있는 경로이다. PropertySource는 여러개 사용 가능
public class dbConfig{
@Value("${dbType}")
private String dbType;
@Value("${userId}")
private String userId;
@Value("${passWord}")
private String passWord;
// 기타 코드들....
그럼 알아서 스프링이 dbConfig클래스를 생성할 때 각 필드멤버에 값을 주입해 준다.
일반적으로 application.properties를 먼저 읽고 설정에 따라 application-dev.properties, application-qa.properties, application-prod.properties 중 하나를 추가로 읽어 Spring에 사용될 설정을 불러온다. spring.profiles.active = "prod/qa/dev" 이다
application.properties에 정의된 값들도 @value 또는 Environment 객체에 @Autowired를 붙여서 맵핑하여 env.getProperty()를 이용하여 값을 가져올 수 있다. 하지만 @ConfigurationProperties를 통해 더 쉽게 맵핑해줄 수 있다.
예를 들어 application.properties에 다음과 같은 내용이 정의되어 있다고 하자
app.start.time = 20231128
app.start.deviceType = PC
app.start.user.userName = root
app.start.user.passWord = passWord
이걸 start라는 class에 맵핑시켜 사용하고자 한다면 다음과 같이 정의하면 된다.
@ConfigurationProperties("app.start")//app.start 는 pre-fix임을 알린다.
public class start{
//이름을 정확히 일치시켜야 한다.
private String time;
private String deviceType; //PC가 맵핑된다.
public static class user{ // app.start.user를 user class에 맵핑하여 사용한다.
private String userName;//이름 일치
private String PassWord;
}
// 기타 코드 작성
}
참 쉽게 맵핑이 가능하다~!