@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)
'Lecture' 카테고리의 다른 글
자바 코드 리팩토링: 객체에게 꼬치꼬치 묻지 말고 시켜라 - 종속적인 관계가 아닌 자율적인 관계 유지하기 (0) | 2023.07.09 |
---|---|
자바 코드 리팩토링: 객체의 협력 관계를 디자인해보자. (0) | 2023.07.09 |
자바 코드 리팩토링: 생성자 대신 팩토리 메서드, 전략 패턴/상태 패턴 적용, 상속 대신 위임, 에러 예외 처리 (0) | 2023.07.07 |
자바 코드 리팩토링: 매직넘버, 제어 플래그, 널 문제, 분류 코드 문제, 분기문 문제 (0) | 2023.07.06 |
자바 디자인 패턴: 플라이웨이트, 프록시, 명령, 해석 패턴 (0) | 2023.07.06 |