Springboot에서 @Value, @ConfigurationProperties annotation을 이용하여,
여러개의 프로퍼티를 관리하는 방법에 대해 정리해 보겠습니다.
.properties 파일은 뭔가요? (feat. yml)
우선, 어떻게 설정하는지에 앞서, properties가 무엇인지 언제 쓰이는지에 대해 먼저 간략히 알아봅시다.
properties파일은 Application 구동에 필요한 파라미터들을 저장하기 위해, 자바관련 기술을 주로 사용하는 파일들을 위한 확장자입니다.
제가 느끼기 properties 파일은,
환경변수들을 관리하는 파일 + 여러가지 예약된 프로퍼티 키를 이용해 설정 편리화(docker-compose.yml과 흡사)하는 파일이라고 생각됐습니다.
그럼 항상 properties 파일과 함께 언급되는 yml 파일은 무엇일까요?
yml 파일은, 계층구조를 이용하여 가독성을 높인 형식이라고 생각하면 됩니다. 말로 하면 어려울 수 있으니,
바로 그림을 통해 직접 확인해봅시다.(왼쪽이 properties, 오른쪽이 yml)
사용법
본격적으로, 어떻게 사용하는지 알아보도록 하겠습니다.
1. yml파일 작성
우리가 하고자 하는 것은 결국 yml에 여러 설정값들, 환경변수값들을 작성 해 놓고, 코드내에서 그 값들을 불러와 사용하는 것 입니다.
그럼 가장 먼저, yml파일을 작성해 봅시다.
//test.yml
yml-test:
name: "test"
favorite: "sushi"
2. 코드 내에서 불러오기
우린, 위에서 작성한 값을 불러오기 위해서 @Value, @ConfigurationProperties 데코레이터를 사용해 볼 것입니다.
먼저, @ConfigurationProperites의 prefix에 yml파일명(test)을 넣어주고,
우리가 값을 들고와 저장하고 싶은 field위에 @Value를 이용해, 아래처럼 작성하면 됩니다.
//Test.java
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.beans.factory.annotation.Value;
@ConfigurationProperties(prefix = "test")
public class Test{
@Value("${yml-test.name}")
public String name;
@Value("${yml-test.favorite}")
public String favorite
}
3. yml 파일 등록해주기.
만약 위처럼만 작성해주게 되면, 아래와 같은 에러 메시지를 볼 수 있을 것 입니다. 이건, 우리가 작성한 test.yml파일을 Application에서 인식하지 못해서 생기는 문제로, 경로를 설정 해 줄 필요가 있습니다.
Caused by: java.lang.IllegalArgumentException: Could not resolve placeholder
참고로, spring-boot는 default로 application.yml 파일은 따로 등록이 없어도 인식을 하게 됩니다.
하지만, 우리처럼 복수의 yml파일을 이용하고자 한다면, 아래처럼 경로를 설정 해주어야 합니다.
// TestApplication.java
public class TestApplication{
static{
System.setProperty("spring.config.location", "classpath:/policy-info.yml, classpath:/application.yml")
}
}
이렇게 경로까지 등록해주게 되면 정상적으로 값들이 불러와지는 것을 확인할 수 있습니다.
'java,springboot' 카테고리의 다른 글
vscode에서 gradle로 springboot 개발환경 설정 (0) | 2023.03.01 |
---|---|
parameter 1 of constructor in required a bean of type that could not be found (0) | 2023.02.27 |
Ljava.lang.Object 읽을 수 있게 만들기(List 타입 콘솔 찍기) (0) | 2023.02.17 |
Maven vs Gradle? (0) | 2023.01.26 |
Java - Objects, Classes, Interfaces, Packages and Inheritance (0) | 2023.01.17 |