1. 가독성과 편의성
2. 불변성
3. 선택적 매개변수
4. 객체의 불변성을 유지하면서 가변적인 빌더
entity나 Dto객체에 값을 넣어줄때, 롬복의 빌더 애노테이션(@Builder)을 사용하는 예제들이 많다.
객체를 생성하기 위해서는 생성자 패턴, 자바빈 패턴, 빌더 패턴 등을 사용할 수 있는데, 이 빌더 패턴을 쓰는 이유가 무엇일까?
Telescoping Constructor Pattern
점층적 생성자 패턴
각 생성자를 오버로딩 해서 만드는 기초적인 방식이다.
필수적으로 값이 있어야할 멤버변수를 위해 생성자에 매개변수를 넣는다.
또한 선택적 인자를 받기위해 추가적인 생성자를 만든다.
쉽게 짤수 있다는 장점이 있지만,
인자들이 많아질수록 생성자가 많아지고
매개변수의 정보를 설명할 수 없으므로 어떤 객체에 어떤 인자가 들어갔는지 알기어렵다.
그래서 코드 수정(필드 추가 등)이 필요한 경우 수정이 복잡하다.
Java Beans Pattern
자바 빈 패턴
가장 익숙한 getter/setter를 이용하여 객체를 생성할때 필드를 주입하는 방식이다.
자바 빈즈패턴을 사용하면 가독성이 어느정도 해결된다. 하지만 코드량이 늘어나는 단점이 존재하고, 가장 문제가 되는점은 setter 메소드를 통해 값이 계속 변할 수 있기 때문에, 객체일관성이 깨진다는 것이다. 객체일관성이 깨진다는것은 한번 객체를 생성할때 그 객체가 변할 여지가 있다는 것이다.
우선 빌더 패턴이란 디자인패턴중 하나로, 생성과 표현의 분리다.
클래스를 설계하다보면 필수로 받야할 인자들이 있고 선택적으로 받야할 인자들이 있는데,
쉽게 말해 생성자에서 인자가 많을때 고려해 볼수있는것이 바로 이 빌더패턴이다.
Builder Pattern
빌더 패턴
위 둘의 단점을 모두 보완해서 나타난것이 바로 빌더패턴이다.
정보들은 자바 빈 패턴처럼 받되, 데이터 일관성을 위해 정보들을 다 받은 후에 객체를 생성한다.
빌더패턴을 적용하면 다음과 같은 장점이 있다.
- 불필요한 생성자의 제거
- 데이터의 순서에 상관없이 객체생성 가능
- 명시적 선언으로 이해하기가 쉽고 각 인자가 어떤 의미인지 알기 쉽다.(가독성)
- setter 메서드가 없으므로 변경 불가능한 객체를 만들수있다.(객체불변성)
- 한번에 객체를 생성하므로 객체 일관성이 깨지지 않는다.
- build() 함수가 null인지 체크해주므로 검증이 가능한다. (안그러면 set하지않은 객체에대해 get을 하게되는경우 nullPointerExcetpion발생 등등의 문제가 생김)
Lombok @Builder
클래스 또는 생성자 위에 @Builder 어노테이션을 붙여주면 빌더패턴 코드가 빌드된다. 생성자 상단에 선언시 생성자에 포함된 필드만 빌더에 포함된다.
import lombok.Builder;
@Builder
public class Member {
private String nickname;
private String password;
private Gender gender;
}
public static void main(String[] args) {
Member memberEntity = Member.builder()
.nickname("minji")
.password("123")
.gender(Gender.F)
.build();
}
변수의 개수가 2개 이하이거나, 변경 가능성이 없을 경우에는 필더 패턴의 장점을 누릴 수 없을테니 사용하지 않아도 될 것 같다.
'대충 넘어가지 않는 습관을 위한 기록' 카테고리의 다른 글
[SQL] DDL,DML,DCL,TCL에 대해 (1) | 2023.12.04 |
---|---|
LocalDate, LocalTime, 그리고 LocalDateTime (2) | 2023.12.04 |
JPA와 Spring data JPA 차이 (0) | 2023.11.17 |
equals 메서드에 대해 (NPE) (0) | 2023.11.16 |
@NoArgsConstructor(access = AccessLevel.PROTECTED)를 쓰는 이유 (0) | 2023.11.16 |