반응형
문제
스프링 부트에서 Record 클래스로 application.yml 파일 값 가져오려다가 에러가 났다.
상황
// application.yml
fruit:
list:
- name: banana
color: yellow
- name: apple
color: red
yml 파일에 fruit.list 속에 과일 리스트가 있는 형태를 스프링에서 가져다 쓰려고 했다.
// Fruit.class
public record Fruit(
String name,
String color
) {
}
// FruitList.class
import org.springframework.boot.context.properties.ConfigurationProperties;
import java.util.List;
@ConfigurationProperties("fruit") // 여기 !!
public record FruitList(
List<Fruit> list
) {
}
외부에서 가져오는 프로퍼티인 만큼 레코드 타입으로 불변을 보장하려고 했는데 아래와 같은 에러가 났다.
해결
해결법은 스프링 부트 2.2 버전 이전과 이후로 나뉜다.
스프링 부트 2.2 이전 해결법
1. @Component 사용
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
@ConfigurationProperties("fruit")
public record FruitList(
List<Fruit> list
) {
}
이 방법으로는 현재는 에러가 난다.
2. @EnableConfigurationProperties 사용
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Configuration;
@Configuration
@EnableConfigurationProperties({FruitList.class}) // 사용할 클래스를 지정해주어야 함
public class ConfigurationPropertyConfig {
}
이렇게 하면 동작은 되지만 매 프로퍼티 클래스를 작성해주어야 하는 불편함이 있다.
스프링 부트 2.2 이후 해결법
3. @ConfigurationProperties 사용
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationPropertiesScan // 여기 !!
public class ConfigurationPropertyConfig {
}
그냥 @ConfigurationProperties 만 붙여주면 끝난다.
정리
마지막으로 전체 코드를 보여주면 아래와 같다.
// YmlApplication.class
@SpringBootApplication
public class YmlApplication {
public static void main(String[] args) {
SpringApplication.run(YmlApplication.class, args);
}
}
// ConfigurationPropertyConfig.class
import org.springframework.boot.context.properties.ConfigurationPropertiesScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ConfigurationPropertiesScan
public class ConfigurationPropertyConfig {
}
// Fruit.class
public record Fruit(
String name,
String color
) {
}
// Test.class
import jakarta.annotation.PostConstruct;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
@Slf4j
@Component
@RequiredArgsConstructor
public class Test {
private final FruitList fruitList;
@PostConstruct
void setup() {
for (Fruit fruit : fruitList.list()) {
log.info("fruit name : {}, color : {}", fruit.name(), fruit.color());
}
}
}
// console
fruit name : banana, color : yellow
fruit name : apple, color : red
로그 결과는 위와 같다.
잘 나오는 것을 볼 수 있다. 😁
참고 링크
반응형
'TIL ✍️' 카테고리의 다른 글
24/08/16(금) 100번째 TIL : CORS 커스텀 응답 헤더 가져오기 (0) | 2024.08.19 |
---|---|
24/08/14(수) 99번째 TIL : Spring Security 없이 CORS 설정하기 (0) | 2024.08.19 |
24/08/12(월) 97번째 TIL : Spring cloud gateway에서 최종 라우팅 서비스 URI 가져오기 (0) | 2024.08.12 |
24/08/09(금) 96번째 TIL : Spring Gateway 애플 실리콘 맥 에러 (0) | 2024.08.10 |
24/08/08(목) 95번째 TIL : Spring Data Redis 및 Redis-cli 문자열 인코딩 방식 (2) | 2024.08.09 |