728x90
빌더 패턴은 3가지로 분리되어 호출
빌더 정의 -> 필드설정 -> 객체 생성
1. 빌더 정의
Member.MemberBuilder builder = Member.builder()
2. 필드 설정
builder
.name("Aaron")
.email("aaron@example.com")
3. 객체 생성
Member aaron = builder.build();
흔히 사용하는 빌드 패턴은 아래와 같이 빌드 정의 + 필드 설정 + 객체 생성이 모두 합쳐진 상태
Member aaron = Member.builder();
.email("aaron@example.com")
.name("Aaron")
.build();
생성자가 아닌 빌더를 통해 객체를 생성하는 이유
- 내가 원하는 필드만 설정할 수 있다.
- 생성자와 달리 필드값 주입 순서에 구애받지 않는다
- 필드 값 주입 역할을 마음껏 분리할 수 있다.
- 빌더 패턴은 3가지로 분리되어 호출되므로 본 특성에 따라 원하는 시점과 상황에 필드 설정이 가능 = 필드 설정 시차를 둘 수 있다.
- 빌더를 통한 객체 생성 장점: 필드 설정 시점/역할 분리 가능
String type = "THANKS_MESSAGE"; // "HELLO_MESSAGE"
// (1) 빌더 정의
MessageSender.MessageSenderBuilder builder = MessageSender.builder();
// (2) 필드 설정
// (2.1) 공통 부분을 먼저 설정하고
builder
.receiver("Aaron")
.sender("Baron")
.type(type);
// (2.2) 다른 부분은 따로 설정한다 (조건부)
if (type.equals("THANKS_MESSAGE")) {
builder
.title("감사합니다")
.message("정말 감사합니다");
}
if (type.equals("HELLO_MESSAGE")) {
builder
.title("안녕하세요")
.message("정말 반갑습니다");
}
// (3) 객체 생성
MessageSender sender = builder.build();
빌더 패턴을 현업에서 사용하는 방법들로 사용해보자
- @Builder: 클래스 단위인 @Builder 선언이 아닌 생성자 단위의 @Builder 선언을 통해 필드 제약
- @Builder.Defalut: 필드 설정이 없을 경우 객체 생성 시 설정해줄 필드 기본값
- @Singular: Collection(Map, Set, List)에 값을 한번에 넣지않고, 하나씩 주입
- @Builder 사용 시 Validation 로직을 포함한 Custom Builder 정의
1. @Builder
클래스 단위의 @Builder 선언이 아닌 생성자 단위의 @Builder 선언을 통해 필드 제약
Builder로 객체 생성할때 주입할 필드에 제약을 둘 수 잇다. -> 생성자에 @Builder를 추가
- 이런 제약을 두는 이유는 클래스가 가진 모든 필드에 대해 @Builder 사용이 가능하다면
- 너무 많은 경우의 수에 해당하는 객체가 생성될 수 있고
- 미리 설정되지 말아야할 필드가 설정된 객체가 생성될 수 있기 때문에, 이는 제대로 방지하는 게 좋다.
2. @Builder.Default
필드 설정이 없을 경우 객체 생성 시 설정해줄 필드 기본값
3. @Singular
Collection(Map, Set, List)에 값을 한번에 넣지 않고, 하나씩 주입
4. @Builder 사용 시 Validation 로직을 포함한 Custom Builder 정의
빌더 객체를 생성할 때 유효성 검증을 빌더 객체에 정의할 수 있다.
728x90
'ASAC 웹 풀스택 > Spring Boot' 카테고리의 다른 글
Java 기본 문법 및 JVM 구성(10) - final, static (0) | 2024.09.29 |
---|---|
Java 기본 문법 및 JVM 구성(9) - DTO, VO (0) | 2024.09.28 |
Java 기본 문법 및 JVM 구성(8) - 정적 팩토리 메서드 (1) | 2024.09.28 |
Java 기본 문법 및 JVM 구성(6) - Object(Lombok을 활용한): 객체 생성 (0) | 2024.09.28 |
Java 기본 문법 및 JVM 구성(5) - Java의 객체지향 프로그래밍 패러다임 문법 (0) | 2024.09.28 |