빌더 패턴(Builder Pattern)은 복잡한 객체의 생성 과정과 표현 방법을 분리하여 같은 생성 절차에서 서로 다른 표현 결과를 만들 수 있도록 하는 디자인 패턴입니다. 주로 생성할 객체의 필드가 많거나, 선택적인 필드가 많을 때 사용하면 유용함.
🔧 1. 빌더 패턴이 필요한 이유
예시: 일반 생성자 방식 (문제점)
public class User {
private String name;
private int age;
private String email;
private String phone;
public User(String name, int age, String email, String phone) {
this.name = name;
this.age = age;
this.email = email;
this.phone = phone;
}
}
사용할 때:
User user = new User("Alice", 25, "alice@example.com", "010-1234-5678");
✅ 문제점: 필드가 많아질수록 생성자가 복잡해지고 파라미터 순서를 헷갈릴 수 있으며, 일부 필드만 설정하고 싶어도 모든 값을 넣어야 합니다.
🏗️ 2. 빌더 패턴 예제
public class User {
private String name;
private int age;
private String email;
private String phone;
// private 생성자
private User(Builder builder) {
this.name = builder.name;
this.age = builder.age;
this.email = builder.email;
this.phone = builder.phone;
}
// static inner Builder 클래스
public static class Builder {
private String name;
private int age;
private String email;
private String phone;
public Builder(String name) { // 필수 파라미터
this.name = name;
}
public Builder age(int age) {
this.age = age;
return this;
}
public Builder email(String email) {
this.email = email;
return this;
}
public Builder phone(String phone) {
this.phone = phone;
return this;
}
public User build() {
return new User(this);
}
}
// toString
@Override
public String toString() {
return name + ", " + age + ", " + email + ", " + phone;
}
}
✅ 사용 예시:
User user = new User.Builder("Alice")
.age(25)
.email("alice@example.com")
.phone("010-1234-5678")
.build();
System.out.println(user);
🧱 빌더 패턴 사용 예시 (실제 라이브러리)
- Lombok의 @Builder 어노테이션을 사용하면 쉽게 구현 가능합니다.
import lombok.Builder;
@Builder
public class User {
private String name;
private int age;
private String email;
private String phone;
}
User user = User.builder()
.name("Alice")
.age(25)
.email("alice@example.com")
.build();
✅ 빌더 패턴을 사용하는 이유
🔹 1. 복잡한 객체 생성을 간결하고 명확하게 하기 위해
- 필드가 많거나, 선택적으로 설정해야 하는 필드가 있는 경우 생성자나 setter 방식은 코드가 지저분해지고 실수가 잦아집니다.
- 빌더 패턴은 필요한 필드만 명시적으로 설정하면서도, 객체 생성을 한 줄로 처리할 수 있게 도와줍니다.
🔹 2. 가독성과 유지보수 향상
- 어떤 값이 어떤 필드에 대응되는지 명확하게 드러납니다.
- 필드 순서를 외울 필요도 없습니다.
🔹 3. 불변(immutable) 객체를 쉽게 만들 수 있음
- 객체 생성 후에는 변경되지 않도록 하여, 안전하고 예측 가능한 코드 작성이 가능합니다.
- 멀티스레드 환경에서도 유리합니다.
🔹 4. 메서드 체이닝으로 깔끔한 코드 작성
- .name("홍길동").age(30).email("hong@example.com") 처럼 체이닝 방식으로 작성 가능.
- 매우 직관적이며 읽기 쉽습니다.
🌟 빌더 패턴의 장점 정리
장점 설명
| ✅ 가독성 좋음 | 어떤 값이 어떤 필드인지 명확히 알 수 있음 |
| ✅ 유연한 객체 생성 | 필드 순서 상관없이 필요한 필드만 설정 가능 |
| ✅ 안전한 객체 생성 | 불완전하거나 잘못된 상태의 객체 생성을 방지 |
| ✅ 확장에 용이함 | 필드가 추가돼도 기존 코드를 크게 변경할 필요 없음 |
| ✅ 메서드 체이닝 가능 | 코드가 간결하고 읽기 쉬워짐 |
| ✅ 불변 객체 생성에 유리 | final과 함께 사용하면 객체 상태 변경 불가 |
📌 언제 빌더 패턴을 쓰면 좋은가?
- 생성자에 인자가 3개 이상일 때
- 어떤 인자는 필수고, 어떤 인자는 선택인 경우
- 생성자 오버로딩이 많아지는 경우
- 가독성과 안정성을 모두 챙기고 싶을 때
📎 비교: 생성자 vs setter vs 빌더
방식 특징 단점
| 생성자 | 한 번에 생성 | 필드 많으면 순서 외우기 힘듦 |
| setter | 필드 하나씩 설정 | 객체가 불완전한 상태일 수 있음 |
| 빌더 | 가독성 + 안정성 + 유연성 | 코드가 조금 더 길어질 수 있음 (직접 구현 시) |
✅ 결론
빌더 패턴은 안전하고 가독성이 높은 방식으로 객체를 생성하고 싶을 때 사용하는 디자인 패턴입니다. 객체를 유연하고 명확하게 만들고 싶을 때 주로 사용함.
'탐구하기' 카테고리의 다른 글
| AWS EC2 서버 구성 및 배포, AMI 생성 및 복제 (0) | 2025.06.10 |
|---|---|
| RestAPI란 무엇일까?? (1) | 2025.06.02 |
| Maven과 Gradle의 역할과 기능은 무엇일까? (2) | 2025.06.02 |
| @SpringBootApplication은 어떤역할을 하는 어노테이션일까? (0) | 2025.06.02 |
| 프록시 패턴과 AOP에 대해서 연관성 (0) | 2025.05.22 |