Spring Boot Properties 클래스 사용하기
Spring Boot에서 Properties 설정값들을 클래스에 매핑하여 사용하는 방법에 대해 정리한 내용입니다.
1. Properties 클래스 사용하기
Spring Boot에서 설정값을 사용하기 위해서 application.properties 또는 application.yml 파일에 key value 형식의 데이터를 저장하고 다음과 같이 @Value 어노테이션으로 읽어와서 사용하는 경우가 있습니다.
public class ApplicationProperties {
@Value("${property.name}")
private String propertyName;
@Value("${property.age}")
private String propertyAge;
@Value("${property.gender}")
private String propertyGender;
...
}
이와 같이 사용하는 경우엔 클래스마다 필요한 설정값을 선언 해줘야하는 번거로움이 생기는데 클래스에 properties 값들을 매핑해주는 방법을 사용하면 하나의 클래스로 보다 편하게 사용할 수 있습니다.
1.1. dependency 추가하기 (gradle)
build.gradle 파일에 아래와 같이 @ConfigurationProperties 어노테이션을 사용하기 위한 spring-boot-configuration-processor 의존성을 추가해줍니다. @ConfigurationProperties 어노테이션은 .properties 또는 .yml 파일에서 사용하는 configuration의 자동 완성을 지원해주고 추가한 설정값들을 Bean에 등록해주는 역할을 합니다.
dependencies {
annotationProcessor "org.springframework.boot:spring-boot-configuration-processor"
...
}
1.2. yml 설정값 추가하기
application.yml 파일에 아래와 같이 설정값을 추가해줍니다.
application:
endpoint: https://freestrokes.tistory.com/
user:
name: freestrokes
age: 30
gender: male
property:
test:
list: a,b,c
1.3. properties 클래스 생성하기
application.yml 파일의 설정값을 매핑할 ApplicationProperties 클래스를 아래와 같이 생성해줍니다.
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
@Component
@ConfigurationProperties(prefix = "application")
public class ApplicationProperties {
private String endpoint;
private User user;
private Property property;
@Getter
@Setter
public static class User {
private String name;
private String age;
private String gender;
}
@Getter
@Setter
public static class Property {
private Test test;
}
@Getter
@Setter
public static class Test {
private List<String> list;
}
}
다른 클래스에서도 사용이 가능한 Bean 등록을 위해 @Component 어노테이션을 추가해주고, 설정값을 멤버변수에 할당하고 사용하기 위해 lombok의 @Getter, @Setter 어노테이션도 추가해줍니다.
설정값을 멤버변수에 바인딩하기 위해서 @ConfigurationProperties 어노테이션을 추가해줍니다. 함께 사용 가능한 속성값은 다음과 같습니다.
- prefix
접두사로 사용되는 key 값 - ignoreInvalidFields
데이터 타입이 일치하지 않아 유효하지 않은 필드에 대한 무시 여부 (기본값은 false) - ignoreUnknownFields
Bean 내부에 선언되지 않은 필드에 대한 무시 여부 (기본값은 false)
참고로 @ConfigurationProperties 어노테이션의 기능을 활성화하려면 @EnableConfigurationProperties 어노테이션을 추가로 설정해주어야 했습니다. 하지만 Spring Boot 2.2 버전 이후부터는 @ConfigurationProperties 어노테이션만 사용해도 필요한 클래스들을 모두 스캔하여 등록해주기 때문에 생략해주어도 됩니다.
1.4. Properties 클래스 테스트하기
테스트를 위해 아래와 같이 테스트 클래스를 작성해줍니다.
import com.freestrokes.config.ApplicationProperties;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest()
public class ApplicationPropertiesTests {
@Autowired
private ApplicationProperties applicationProperties;
@Test
public void contextLoads() {
System.out.println(applicationProperties.getEndpoint());
System.out.println(applicationProperties.getUser().getName());
System.out.println(applicationProperties.getUser().getAge());
System.out.println(applicationProperties.getUser().getGender());
System.out.println(applicationProperties.getProperty().getTest().getList().toString());
}
}
실행해보면 다음과 같이 설정값이 매핑되어 있는 것을 확인할 수 있습니다.
이상으로 Spring Boot에서 설정값들을 Properties 클래스에 매핑하여 사용하는 방법에 대해 알아봤습니다.
※ References
- kim-jong-hyun.tistory.com, [Spring] - Spring Boot Configuration Properties 클래스 만들기, https://kim-jong-hyun.tistory.com/56
- velog.io/@max9106, ,[Spring Boot] 외부설정2 - @ConfigurationProperties https://velog.io/@max9106/Spring-Boot-%EC%99%B8%EB%B6%80%EC%84%A4%EC%A0%95-4xk69h8o50
- www.amitph.com, Using @ConfigurationProperties in Spring Boot, https://www.amitph.com/spring-boot-configuration-properties/
- sgc109.github.io, Spring Boot 의 @ConfigurationProperties, https://sgc109.github.io/2020/07/07/spring-boot-configuration-properties/
- brush-up.github.io, [java]SpringBoot 의 @ConfigurationProperties 간략 정리, https://brush-up.github.io/java/java-ConfigurationProperties/
- inseok9068.tistory.com, [SpringBoot] properties값 클래스로 매핑하기, https://inseok9068.github.io/springboot/springboot-properties/