본문 바로가기

Programing/OpenSource

[Lombok] @RequiredArgsConstructor 의 득과 실?

백기선 님이 YouTube에 올린 영상 중에 @RequiredArgsConstructor 관한 것이 있다.

https://youtu.be/qmI7uJapocw

장점

  1. 생성자 주입을 사용하는 경우에는 중복해서 작성해야 하는 슈가 코드를 줄일 수 있다.
  2. 역으로 리팩터링하여 주입이 더 이상 안필요할 때 세 군데를 수정해야 할 것을 하나의 수정으로 해결 할 수 있다.

@Service
public class NamopayService {

    private final NamopayUrls namopayUrls;
    private final StoreCache storeCache;
    private final NamopayApi namopayApi;
    private final PaymentRepository paymentRepository; // 미사용필드
    private final StoreProvider storeProvider;
    private final PaymentObjectMapper paymentObjectMapper;

    @Autowired
    public NamopayService(NamopayUrls namopayUrls,
                           StoreCache storeCache,
                           NamopayApi namopayApi,
                           PaymentRepository paymentRepository, // 추가 삭제1
                           StoreProvider storeProvider,
                           PaymentObjectMapper paymentObjectMapper) {
        this.NamopayUrls = NamopayUrls;
        this.storeCache = storeCache;
        this.namopayApi = namopayApi;
        this.paymentRepository = paymentRepository; // 추가 삭제2
        this.storeProvider = storeProvider;
        this.paymentObjectMapper = paymentObjectMapper;
    }

 

단점

  1. 처음 보는 사람이라면 잘 이해가 안갈 수 있다.
  2. 상속 받은 클래스에서는 적용이 안된다.
    1. 인터페이스를 구현(implements)하는 경우에는 가능하다.
  3. @Value 값으로 사용하려고 하는 경우 실수로 Bean으로 주입을 받으려는 현상을 겪을 수 있다.
    1. 예) https://namocom.tistory.com/590 참고

 

@Component
@RequiredArgsConstructor
public class PayloadCache {

    @Value("${membership.redis.expire}")
    private final Duration expireTimeout; // private Duration expireTimeout; 가 되어야 한다.
    private final RedisHelper redisHelper;
    private final Cryptography cryptography;

에러 메시지

*************************** APPLICATION FAILED TO START *************************** Description: Parameter 0 of constructor in com.yanolja.payment.dao.cache.repository.MembershipPayloadCache required a bean of type 'java.time.Duration' that could not be found. Action: Consider defining a bean of type 'java.time.Duration' in your configuration.