ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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를 복사합니다.

     

    [참고]

    https://ath3nd.wordpress.com/2018/12/13/spring-lombok-or-injection-just-became-a-bit-easier-part-2-of-2/

     

    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
Designed by Tistory.