-
[Error 해결] Lombok과 @Qualifier 충돌Study/Spring Boot 2022. 6. 6. 23:44
Spring boot 에서 getter, setter, 생성자 생성을 위해 lombok을 사용했고
아래와 같이 datasourceConfig Class를 생성하고 두 개의 DataSource bean을 생성하였습니다.
@Configuration @EnableConfigurationProperties public class DataSourceConfig { @Bean(name = "dataSourceProperties") @ConfigurationProperties(prefix = "spring.datasource") @Primary public DataSourceProperties dataSourceProperties() { return new DataSourceProperties(); } @Bean(name = "dataSourcePropertiesSecond") @BatchDataSource @ConfigurationProperties(prefix = "spring.datasource.second") public DataSourceProperties dataSourcePropertiesSecond() { return new DataSourceProperties(); } @Bean(name = "dataSource") @Primary public DataSource dataSource( @Qualifier("dataSourceProperties") DataSourceProperties dataSourceProperties) { return DataSourceBuilder.create() .driverClassName(dataSourceProperties.getDriverClassName()) .url(dataSourceProperties.getUrl()) .username(dataSourceProperties.getUsername()) .password(dataSourceProperties.getPassword()) .build(); } @Bean(name = "dataSourceSecond") public DataSource dataSourceSecond( @Qualifier("dataSourcePropertiesSecond") DataSourceProperties dataSourcePropertiesSecond) { return DataSourceBuilder.create() .driverClassName(dataSourcePropertiesSecond.getDriverClassName()) .url(dataSourcePropertiesSecond.getUrl()) .username(dataSourcePropertiesSecond.getUsername()) .password(dataSourcePropertiesSecond.getPassword()) .build(); } }
DataSource를 사용하는 MappingTasklet Class에서
Lombok의 @RequiredArgsConstructor를 사용하여 생성자를 만들고,
DatabaseConfig 클래스에서 선언한 dataSourceSecond bean을 사용하기 위해 다음과 같이 @Qualifier 코드를 사용했습니다.
@Component @RequiredArgsConstructor public class MappingTasklet { @Qualifier("dataSourceSecond") private final DataSource dataSourceSecond; ... }
문제는 dataSourceSecond가 아니라 dataSource를 사용하는 문제가 생겼습니다.
알고보니, Lombok @RequiredArgsConstructor에서 @Qualifier를 인식하지 못하는 문제였습니다.
public MappingTasklet(@Qualifier("dataSourceSecond") DataSource dataSourceSecond){ this.dataSourceSecond = dataSourceSecond; }
이렇게 생성자가 만들어져야하지만
public MappingTasklet(DataSource dataSourceSecond){ this.dataSourceSecond = dataSourceSecond; }
이렇게 @Qualifier가 무시된채 만들어진 것입니다.
해결방법은 다음과 같습니다.
프로젝트의 루트 디렉토리에서 lombok.config 파일을 만들고 아래와 같이 작성합니다.
lombok.copyableAnnotations += org.springframework.beans.factory.annotation.Qualifier
이렇게 추가하면 lombok은 생성자를 생성하는데 사용할 필드에 선언된 @Qualifier를 복사합니다.
[참고]
Spring + Lombok + @Qualifier or injection just became a bit easier (Part 2 of 2)
How to make Lombok copy @Qualifier on generated constructors for a Spring Component/Service In the previous part of my blogpost I mentioned that it is now possible to actually add @Qualifier to a f…
ath3nd.wordpress.com
'Study > Spring Boot' 카테고리의 다른 글
[Spring Boot] Spring VS Spring Boot (0) 2021.01.20