빌더 패턴
빌더 패턴이란
빌더 패턴은 복잡한 객체 생성 과정을 단계적으로 진행할 수 있도록 돕는 생성 패턴 입니다. 이 패턴에서는 객체와 객체의 생성 과정을 분리 하게 됩니다.
빌더 패턴의 구성 요소
간단한 빌더 패턴
제품 (Product)
: 최종적으로 생성될 객체
빌더 (Builder)
: 제품을 생성하는 방법과 단계를 정의한 객체
Java 의 lombok 의 @builder
가 이러한 패턴을 가진다.
전통적인 빌더 패턴
제품 (Product)
: 최종적으로 생성될 객체
빌더 (Builder)
: 제품을 생성하는 방법에 대한추상 인터페이스
구상 빌더 (Concrete Builder)
: 앞서 정의된 생성 단계들을 상속받아 다양하게 구현한다.
(선택사항) 디렉터 (Director)
: 빌더를 이용해 제품의 생성 순서를 정의한다.
예제
Java lombok 의 @builder
1
2
3
4
5
6
7
8
9
10
11
// Product
import lombok.Builder ;
import lombok.ToString ;
@Builder
@ToString
public class User {
private String name ;
private int age ;
private String email ;
}
1
2
3
4
5
6
7
8
9
10
// 빌더를 이용한 객체 생성
public static void main ( String [] args ) {
User user = User . builder ()
. name ( "Alice" )
. age ( 30 )
. email ( "alice@example.com" )
. build ();
System . out . println ( user );
}
Python 에서 빌더 패턴 따라해보기
lombok 에서 사용하는 builder 패턴을 파이썬에서 따라해보면 아래와 같다.
1
2
3
4
5
6
# Product
class User :
def __init__ ( self ):
self . name : str = ""
self . age : int = 0
self . email : str = ""
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# Builder
class UserBuilder :
def __init__ ( self ):
self . user = User ()
def set_name ( self , name : str ):
self . user . name = name
return self
def set_age ( self , age : int ):
self . user . age = age
return self
def set_email ( self , email : str ):
self . user . email = email
return self
def build ( self ):
return self . user
1
2
3
4
5
6
7
8
# builder 사용
user = UserBuilder (). set_name ( name = "홍길동" ) \
. set_age ( age = 20 ) \
. set_email ( email = "hong@abc.com" ) \
. build ()
print ( user . __dict__ )
>> { 'name' : "홍길동" , 'age' : 20 , 'email' : "hong@abc.com" }
Pydantic
하지만 파이썬에서는 Pydantic
을 사용하면 이와 같은 빌더 패턴을 사용할 필요가 없다.
1
2
3
4
5
6
7
# Product
from pydantic import BaseModel
class User ( BaseModel ):
name : str
age : int
email : str
1
2
3
4
5
6
7
8
9
# 클래스 생성
user = User (
name = "홍길동" ,
age = 20 ,
email = "hong@abc.com"
)
print ( user . __dict__ )
>> { 'name' : "홍길동" , 'age' : 20 , 'email' : "hong@abc.com" }
또한 .model_copy(update={...})
메서드를 사용하면 필드 업데이트도 가능하다.
1
2
3
4
new_user = user . model_copy ( update = { "age" : 30 })
print ( user . __dict__ )
>> { 'name' : "홍길동" , 'age' : 30 , 'email' : "hong@abc.com" }
빌더 패턴의 장단점
장점
- 객체들을 단계별로 생성할 수 있어, 복잡한 생성을 단순화할 수 있다. - 객체 생성의 유연성을 높일 수 있다. - 단일 책임 원칙에 따르며, 복잡한 생성 코드를 고립시킬 수 있다. - 객체 생성 시 유효성 검증(필드에 대한 유효성 검증 등)을 수행할 수 있다.
단점
- 코드의 길이가 늘어날 수 있다. - 객체 생성 부분 자체는 단순해지지만, 전반적인 코드의 복잡성이 올라갈 수 있다. - 객체 생성 시간이 조금 더 늘어날 수 있다. (미미함)
Reference
https://refactoring.guru/ko/design-patterns/builder
https://python101.tistory.com
Tags:
builder ,
builderpattern ,
design ,
designpattern ,
pattern ,
디자인 ,
디자인패턴 ,
빌더 ,
빌더패턴 ,
설계 ,
패턴
Categories:
design_pattern
Updated: 2025-07-d
Comments