이 글은 공부목적으로 작성된 글 입니다. 왜곡된 정보가 포함되어 있을 수 있습니다
문제상황
yml에 작성된 환경변수를 사용하기 위한 properties 클래스 생성중 해당 값을 바인딩할 수 없다는 에러가 발생하였다.
기존에 문제가 없는 것을 확인하고 푸시까지한 코드여서 상당히 당황스러웠다,..
@ConfigurationProperties(prefix = "google")
@Getter
@RequiredArgsConstructor
public class GoogleOAuthProperties {
private final String clientId;
private final String clientSecret;
}
Properties클래스로 OAuth2 Client 정보를 가지고 있다.
Client 정보는 변경되지 않고, 변경되어선 안되기 때문에 final로 불변객체로 선언하였다.
@SpringBootApplication
@ConfigurationPropertiesScan("konkuk.travelmate.security")
public class TravelmateApplication {
public static void main(String[] args) {
SpringApplication.run(TravelmateApplication.class, args);
}
}
@ConfigurationPropertiesScan을 통해 @ConfigurationProperties가 선언된 객체를 찾아 주입한다.
접근1: @ConstructBinding
@ConfigurationProperties을 통해 properties를 주입 받는 경우 setter를 통해 해당 변수에 접근을 허용하거나 생성자를 통해 변수 초기화를 해야하는데 나는 생성자를 통해 불변 객체를 생성하고 이때 생성자를 통한 주입을 사용할경우 @ConstructBinding을 사용해야한다고 한다.
이전에도 이를 알고 있었는데 @ConstructBinding을 사용할 경우 컴파일 에러가 발생하여
찾아본 결과 Spring boot 3.2.x 부터 @ConstructBinding가 deprecated 되었다는 내용이 발견되었다.
직접 실습했을때 생성자에 @ConstructorBinding을 표기하는것은 아직은 허용되어 있는 것이 확인되었다.
@ConfigurationProperties(prefix = "spring.security.oauth2.client.registration.google")
@Getter
public class GoogleOAuthProperties {
private final String clientId;
private final String clientSecret;
@ConstructorBinding
public GoogleOAuthProperties(String clientId, String clientSecret) {
this.clientId = clientId;
this.clientSecret = clientSecret;
}
}
위와 같이 생성자 바인딩을 어느정도 명시할 수 있다.
해결: build gradle
Spring boot build가 Intellij IDEA로 설정되어 있어 gradle로 바꾸니 이전처럼 정상적으로 시행됬다...
두가지의 build tool의 차이점을 잘알지 못해 찾아본 바로는 Intellij IDEA 증분 빌드 방식을 채택해 변경된 부분만 빌드하기 때문에 변경되지 않은 부분은 기존의 빌드한 내용을 사용한다고 한다. 인터넷에 있었던 대부분의 오류는 삭제된 파일에 대해서는 추적이 되지 않아 해당 파일 빌드 내용이 삭제되지 않는 문제가 있다고 한다.
나도 비슷한 문제라고 생각하고 rebuild 해보았으나 Intellij IDEA로는 계속 실패되었다.
결론은 Spring boot build tool 두가지에는 차이가 있다. 만약 빌드 관련 에러가 발생하면 build tool을 바꿔보자
특히 이전에 정상적으로 실행되었다면 build tool 문제일 가능성이 높다.
setter를 사용한 properties 주입
여담으로 생성자 주입이 아닌 setter를 통한 properties 주입의 경우는 문제 없이 진행되었다....
'Java > 스프링 부트' 카테고리의 다른 글
[JMeter] JMeter를 통해 테스트 (0) | 2024.06.17 |
---|---|
[Webflux] Publisher, Subscriber (0) | 2024.06.05 |
[Webflux] Mono, Flux.Block() (0) | 2024.06.05 |
[Webflux] Reactor 시작하기 (0) | 2024.03.25 |
[Spring boot] @Transactional readOnly에 대한 고찰 -1 (0) | 2024.02.28 |