ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Lombok]@Builder과 생성자 애노테이션
    Java & Kotlin 2021. 8. 8. 16:16
    반응형

    서론

    Lombok에서는 @Builder, @AllArgsConstructor, @NoArgsConstructor, @RequiredArgsConstructor와 같이 빌더와 생성자를 쉽게 만들어 주는 애노테이션들이 있습니다.

     

    하지만 무작정 사용하게 되면 명확하지 않고, 에러를 발생시킬 수도 있습니다. 그래서 이 글에서는 해당 애노테이션들의 역할과 차이점에 대해서 작성하고, 발생할 수 있는 에러에 대해서 정리하려고 합니다.


    생성자 애노테이션

    1. @NoArgsConstructor

    • 파라미터가 없는 기본 생성자
    • final 필드 포함 X

     

    자바에서는 파라미터가 존재하는 생성자를 만들 경우 반드시 파라미터가 없는 기본 생성자를 작성해야 합니다. 이때 @NoArgsConstructor를 사용하여 편리하게 생성자를 작성할 수 있습니다.

     

    하지만 문제점은 final 필드를 포함하지 않습니다. DTO, Entity 등 필드를 생성할 때 은닉화를 위해 private 필드를 생성해야 합니다. @NoArgsConstructorfinal 필드를 포함하지 않기 때문에 컴파일 에러를 발생시킵니다.

     

    이러한 경우에는 @NoArgsConstructor(force = true)를 사용하여 강제로 초기화를 시킬 수 있습니다. 하지만 개인적으로는 좋지 않은 방법이라고 생각합니다. 어차피 final 필드가 존재한다면 @AllArgsConstructor, @RequiredArgsConstructor를 사용하는 것이 좀 더 명확한 방법이라고 생각합니다.

     

    2. @AllArgsConstructor

    • 모든 파라미터가 포함된 생성자
    • @NonNull 포함 / null check 코드 포함

     

    여기서 차이점은 @NonNull 포함입니다. @AllArgsConstructor의 경우 생성자를 생성할 때 null check 코드를 포함시킵니다. 하지만 @NoArgsConstructor의 경우에는 생성자를 직접 초기화하기 전까지 null check을 하지 않습니다.

     

    3. @RequiredArgsConstructor

    • final 필드, @NonNull 필드 대상
    • null check 코드 포함

     

    @RequiredArgsConstructor의 경우에는 각각의 필드에 대해서 1개의 파라미터를 가진 생성자를 만듭니다. 그리고 final, @NonNull 키워드에 대해서만 동작을 합니다.

     

    여기서 null check을 한다는 것은 파라미터로 null이 들어오는 경우에는 NPE 에러를 발생시킵니다.


    Builder

    Builder 패턴을 직접 작성하지 않고, Lombok이 만들어줍니다.

     

    이때 Iterable, List, Collection과 같은 객체를 빌더로서 입력받을 때는 @Singular를 필드에 붙여줄 수 있습니다. 이는 아래와 같이 Collection을 하나의 요소씩 받게 해 줍니다.

    List<String> blogs
    
    .builder().blogs("tistory").blogs("velog");

     


    @Builder, @NoArgsConstructor 함께 사용?

    다른 생성자 없이 @AllArgsConstructor 사용했을 때 @Builder는 이를 사용하게 됩니다. 왜냐하면 빌더 패턴은 파라미터를 1개씩 가지는 각각의 생성자가 필요합니다. 그렇기 때문에 당연히 @AllArgsConstructor이 필요할 것입니다.

     

    하지만 @NoArgsConstructor만 사용하게 된다면, @Builder사용할 매개변수가 없습니다. 그래서 에러를 발생시킵니다. 만약 @NoArgsConstructor가 필요하다면, @AllArgsConstructor 같이 사용해줘야 합니다.

     

    제 생각은 어차피 추가 생성자를 정의하게 되면, 기본 생성자는 컴파일러가 자동으로 바이트 코드에 추가시킵니다. 그렇기 때문에 다른 생성자가 있다면, 굳이 @NoArgsConstructor를 같이 사용해야 할 필요가 있을까 생각합니다.


    @RequiredArgsConstructor, @AllArgsConstructor 함께 사용?

    굳이 함께 사용할 필요가 없다고 생각합니다.

     

    위에서 언급한 대로 @AllArgsConstructor는 모든 필드에 대해서 파라미터를 받는 생성자를 만듭니다. 즉 final, @NonNull 필드도 포함시키기 때문에 중복되는 애노테이션을 사용할 필요는 없다고 생각합니다.

    반응형

    댓글

Designed by Tistory.