본문 바로가기
Lecture

자바 코드 리팩토링: @Builder 애노테이션을 클래스 상단에서 사용하는 것을 지양하자

by Renechoi 2023. 7. 7.

@Builder 애노테이션을 클래스 상단에서 사용하는 것을 지양하자 

 

문제점 

- @Builder를 클래스 상단에서 사용하면 해당 클래스의 모든 필드에 대해 빌더 패턴이 적용된다.

  -> 일부 필드에는 불필요한 빌더 메서드가 생성될 수 있다. 

 

다음과 같은 코드를 보자. 

 

@Builder
public class Person {
	private int id;
    private String name;
    private int age;
    private String address;
    private LocalDateTime createdAt;
    
    // ... (생략)
}

 

이때 Person이 entity라면 Jpa를 사용하는 프로젝트에서 다음과 같은 애노테이션을 사용할 것이다.

 



@Builder
public class Person {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
    
    private String name;
    
    private int age;
    
    private String address;
   
    @CreationTimeStamp
    private LocalDateTime createdAt;
    
    // ... (생략)
}

 

@Builder를 전체 클래스에 걸면, id와 createdAt과 같이 변경이 되지 않아야 하는 필드들에 대해서도 초기화가 가능해진다. 이는 코드 안정성을 저해하는 요인이 된다. 

 

-> 보다 명확하게 자신이 필요한 값과 필요하지 않은 값을 구분해서 받도록 하자. 

 

 

리팩토링 방법 

- @Builder 애노테이션을 클래스 상단에서 사용하는 대신, 필요한 필드에 대해서만 @Builder 애노테이션을 사용하는 것이 좋다.

 

 

 

Before 

 

@Builder
public class Person {
	@Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
	private int id;
    
    private String name;
    
    private int age;
    
    private String address;
   
    @CreationTimeStamp
    private LocalDateTime createdAt;
    
    // ... (생략)
}

 

 

 

After 

 

import java.time.LocalDateTime;

import lombok.Builder;

public class Person {
   @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
   private int id;
    
    private String name;
    
    private int age;
    
    private String address;
   
    @CreationTimeStamp
    private LocalDateTime createdAt;

   @Builder
   public Person(String name, int age, String address) {
      this.name = name;
      this.age = age;
      this.address = address;
   }

   // ... (생략)
}

 

생성자에 @Builder 애노테이션을 붙여 필요한 필드만 빌더 패턴을 적용하도록 변경한 내용이다. 

 

 

이와 같이 필요한 필드에 대해서만 @Builder 애노테이션을 사용하도록 수정한다.

 

 

 

Comment 

 

한편, @Builder 애너테이션을 이용하는 이유는 생성시 field 값들을 정확하게 binding 해주기 위함도 있지만 필드가 많아질 때 생성자를 통해 초기화를 하면 가독성이 떨어지고 복잡하기 때문인 이유도 있다.

 

그러한 관점에서 보자면 생성자 메서드를 만들고 거기에 @Builder를 사용하는 방식이라면 사실 @Builder를 사용하는 의미가 있나, 그럴 꺼면 그냥 안 쓰는 거랑 큰 차이가 있나, 라는 생각도 든다.

 

 

 


 

참고자료

- 패스트 캠퍼스 (한 번에 끝내는 Spring 완.전.판 초격차 패키지 Online - Part9)

 

 

반응형