Topic (오늘의 주제)
자바의 빌더 패턴 (Builder Pattern)
: 복잡한 객체의 생성 과정과 표현 방법을 분리하여, 가독성 있게 객체를 생성하는 디자인 패턴 (생성 패턴 중 하나).
Why (왜 사용하는가? 왜 중요한가?)
실무: 생성자 인자가 많을 때, 실수로 순서를 바꿔 넣는 문제(ex. 주소와 이름을 바꿔 넣음)를 방지하고 코드를 읽기 쉽게 만든다.
구조적 의미: **불변 객체(Immutable Object)**를 만들 수 있게 해준다. Setter를 쓰지 않고도 객체 생성 시점에 값을 채워넣을 수 있다.
면접 의도: "생성자 점층적 패턴(Telescoping Constructor Pattern)"의 문제점을 알고 있는지, 그리고 불변성을 지키면서 객체를 생성하는 방법을 아는지 확인한다.
Core Concept (핵심 개념 정리)
| 요소 | 내용 |
| 개념 정의 | 별도의 Builder 클래스(보통 내부 정적 클래스)를 만들어, 메서드 체이닝(Method Chaining)을 통해 값을 설정하고 최종적으로 build()를 호출해 객체를 생성하는 방식. |
| 동작 방식 | 1. Builder 클래스 생성 2. 각 필드 설정을 위한 메서드 구현 (반환값은 Builder 자신: this) 3. build() 메서드에서 최종 객체 반환. |
| 장점 | 1. 가독성: member.setName("A").setAge(20) 처럼 코드만 봐도 어떤 값이 들어가는지 명확함. 2. 유연성: 필요한 파라미터만 선택적으로 할당 가능. 3. 불변성: 객체 생성 후 상태를 변경할 수 없도록(Setter 없이) 만들 수 있음. |
| 단점 | 코드량이 늘어난다. (클래스마다 별도의 Builder 클래스를 만들어야 함) → Lombok으로 해결 가능. |
| 비교 (vs) | 생성자: 인자가 많아지면 타입이 같은 인자의 순서가 헷갈림. JavaBeans (Setter): 가독성은 좋으나, 객체 생성 시점에 완벽한 상태임을 보장 못함(일관성 깨짐) + 불변성 불가. |
Interview Answer Version (면접 답변식 요약)
"빌더 패턴은 생성자의 파라미터가 많을 때 발생하는 가독성 저하와 실수를 방지하기 위해 사용합니다.
생성자는 인자의 순서가 중요하지만, 빌더 패턴은 메서드 체이닝을 통해 명시적으로 값을 할당하므로 가독성이 높습니다. 또한, Setter 패턴과 달리 객체 생성 시점에 모든 값을 주입하여 '불변 객체'를 만들 수 있다는 점에서 데이터 무결성을 보장하는 데 유리합니다."
Practical Tip (사용시 주의할 점 or 활용 예)
1. 롬복(Lombok)의 @Builder 활용 (표준)
실무에서는 직접 Builder 클래스를 코딩하지 않고 99% 롬복을 사용한다.
Java
@Getter
@Builder // 클래스 위에 붙이면 AllArgs 생성자와 빌더 패턴 코드를 자동 생성
public class User {
private final String name;
private final int age;
private final String email;
}
// 사용 예시
User user = User.builder()
.name("홍길동")
.email("hong@test.com") // age는 선택적으로 생략 가능 (기본값 0)
.build();
2. 필수 인자 강제하기
@Builder는 모든 인자가 선택사항처럼 보일 수 있다. 필수 인자를 강제하고 싶다면 직접 구현하거나 커스텀 빌더 방식을 섞어야 한다.
- Tip: 생성자 레벨에 @Builder를 붙여서 필수값만 받는 생성자를 정의할 수도 있다.
3. 유효성 검사 (Validation) 위치
값을 넣는 시점에 검증하고 싶다면, build() 메서드 내부에서 검증 로직을 수행하도록 커스텀 할 수 있다.
Java
// 직접 구현 시 예시
public User build() {
if (this.age < 0) {
throw new IllegalArgumentException("나이는 0보다 작을 수 없습니다.");
}
return new User(this);
}
예상 꼬리질문 정리
- Q: 빌더 패턴을 쓰면 Setter는 아예 안 쓰는 게 좋은가요?
- A: 네, 객체의 **불변성(Immutability)**을 지키기 위해서는 Setter 사용을 지양해야 합니다. 값이 변경되어야 한다면 Setter로 내부 값을 바꾸기보다, 변경된 값을 가진 새로운 객체를 반환하거나 빌더의 toBuilder()(Lombok 기능) 기능을 활용하는 것이 좋습니다.
- Q: 생성자(Constructor)와 비교했을 때 빌더 패턴의 단점은 무엇인가요?
- A: 객체를 생성하기 위해 별도의 빌더 객체를 먼저 생성해야 하므로 성능상 미세한 오버헤드가 있을 수 있고, 코드량이(롬복 미사용 시) 상당히 늘어난다는 단점이 있습니다.
- Q: 자바의 StringBuilder도 빌더 패턴인가요?
- A: 이름은 빌더지만, 디자인 패턴의 '빌더 패턴'과는 조금 다릅니다. 디자인 패턴의 빌더는 복잡한 객체의 생성 과정을 캡슐화하는 것이 목적이지만, StringBuilder는 문자열 변경의 효율성을 위한 가변 객체 헬퍼 클래스에 가깝습니다. 하지만 append() 메서드가 자신을 반환하여 체이닝을 지원하는 점은 빌더 패턴의 특징과 유사합니다.
'Archive > Daily Dev Q&A' 카테고리의 다른 글
| Daily Dev Q&A: RDBMS (0) | 2025.12.15 |
|---|---|
| Daily Dev Q&A: 프레임워크(Framework) (0) | 2025.12.13 |
| Daily Dev Q&A: 자바 제네릭 (0) | 2025.12.10 |
| Daily Dev Q&A: 자바의 접근 제어자(Access Modifier) (0) | 2025.12.09 |
| Daily Dev Q&A: 자바의 Collections Framework (0) | 2025.12.08 |