Post

λΉŒλ” νŒ¨ν„΄ (Builder Pattern)

λΉŒλ” νŒ¨ν„΄ (Builder Pattern)

πŸ”” λΉŒλ” νŒ¨ν„΄μ΄λž€?
πŸ”” κΈ°μ‘΄ μƒμ„±μž λ°©μ‹κ³Όμ˜ 차이점

What? Why?

λΉŒλ” νŒ¨ν„΄(Builder Pattern)은 λ³΅μž‘ν•œ 객체λ₯Ό λ‹¨κ³„λ³„λ‘œ 생성할 수 있게 ν•΄μ£ΌλŠ” λ””μžμΈ νŒ¨ν„΄μ΄λ‹€. 객체의 생성 과정을 μΆ”μƒν™”ν•˜μ—¬, λ‹€μ–‘ν•œ ν˜•νƒœμ˜ 객체λ₯Ό μœ μ—°ν•˜κ²Œ 생성할 수 μžˆλ„λ‘ 도와쀀닀.

κΈ°μ‘΄ μƒμ„±μž λ°©μ‹κ³Όμ˜ 비ꡐ

κΈ°μ‘΄ μƒμ„±μž 방식

기쑴의 μƒμ„±μž 방식은 객체λ₯Ό 생성할 λ•Œ ν•„μš”ν•œ λͺ¨λ“  νŒŒλΌλ―Έν„°λ₯Ό μƒμ„±μžμ— 전달해야 ν•œλ‹€.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class User {
    private Long id;
    private String userId;
    private String username;
    private Set<Role> roles;
    // 기타 ν•„λ“œ 및 λ©”μ„œλ“œ

    public User(Long id, String userId, String username, Set<Role> roles) {
        this.id = id;
        this.userId = userId;
        this.username = username;
        this.roles = roles;
    }
}

λΉŒλ” νŒ¨ν„΄ 방식

λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ 객체의 ν•„λ“œλ₯Ό λ‹¨κ³„λ³„λ‘œ μ„€μ •ν•  수 있으며, 가독성이 높아지고 선택적인 ν•„λ“œλ₯Ό μ‰½κ²Œ μ²˜λ¦¬ν•  수 μžˆλ‹€.

1
2
3
4
5
User user = User.builder()
                .userId("uniqueUserId123")
                .username("홍길동")
                .roles(new HashSet<>())
                .build();

λΉŒλ” νŒ¨ν„΄μ΄ λ“±μž₯ν•˜κ²Œ 된 계기

기쑴의 μƒμ„±μž 방식은 λ§€κ°œλ³€μˆ˜κ°€ λ§Žμ•„μ§€λ©΄ μ½”λ“œκ°€ λ³΅μž‘ν•΄μ§€κ³  가독성이 λ–¨μ–΄μ§€λŠ” 단점이 μžˆλ‹€.

특히, λ™μΌν•œ νƒ€μž…μ˜ μ—¬λŸ¬ νŒŒλΌλ―Έν„°κ°€ μžˆμ„ 경우 μ‹€μˆ˜ν•˜κΈ° 쉽닀. μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•΄ λΉŒλ” νŒ¨ν„΄μ΄ λ“±μž₯ν•˜κ²Œ λ˜μ—ˆλ‹€.

μž₯단점 비ꡐ

λΉŒλ” νŒ¨ν„΄μ˜ μž₯점

  1. 가독성 ν–₯상
    λ©”μ„œλ“œ 체이닝을 톡해 μ–΄λ–€ ν•„λ“œμ— μ–΄λ–€ 값을 μ„€μ •ν•˜λŠ”μ§€ λͺ…ν™•ν•˜κ²Œ λ“œλŸ¬λ‚œλ‹€.

  2. μœ μ—°μ„±
    선택적인 ν•„λ“œλ₯Ό μ‰½κ²Œ μ„€μ •ν•  수 있으며, ν•„λ“œμ˜ μˆœμ„œμ— 상관없이 값을 지정할 수 μžˆλ‹€.

  3. λΆˆλ³€ 객체 생성
    λΉŒλ” νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λ©΄ 객체λ₯Ό λΆˆλ³€μœΌλ‘œ λ§Œλ“€κΈ° 쉽닀.

  4. λ³΅μž‘ν•œ 객체 생성 용이
    객체 생성 과정이 λ³΅μž‘ν•œ 경우 λΉŒλ” νŒ¨ν„΄μ΄ λ”μš± νš¨κ³Όμ μ΄λ‹€.

λΉŒλ” νŒ¨ν„΄μ˜ 단점

  1. μ½”λ“œλŸ‰ 증가
    λ³„λ„μ˜ λΉŒλ” 클래슀λ₯Ό μž‘μ„±ν•˜κ±°λ‚˜, Lombokκ³Ό 같은 라이브러리λ₯Ό μ‚¬μš©ν•˜μ§€ μ•ŠμœΌλ©΄ μ½”λ“œκ°€ κΈΈμ–΄μ§ˆ 수 μžˆλ‹€.

  2. μ„±λŠ₯ μ˜€λ²„ν—€λ“œ
    맀우 λΉˆλ²ˆν•œ 객체 생성을 μš”κ΅¬ν•˜λŠ” 경우 λΉŒλ” νŒ¨ν„΄μ€ μ•½κ°„μ˜ μ„±λŠ₯ μ˜€λ²„ν—€λ“œλ₯Ό μœ λ°œν•  수 μžˆλ‹€. ν•˜μ§€λ§Œ λŒ€λΆ€λΆ„μ˜ 경우 μ΄λŠ” 큰 λ¬Έμ œκ°€ λ˜μ§€ μ•ŠλŠ”λ‹€.

μƒμ„±μž λ°©μ‹μ˜ μž₯점

  1. 간단함
    λ‹¨μˆœν•œ 객체λ₯Ό 생성할 λ•ŒλŠ” μƒμ„±μž 방식이 더 κ°„λ‹¨ν•˜κ³  직관적이닀.

  2. μ„±λŠ₯
    λΉŒλ” νŒ¨ν„΄μ— λΉ„ν•΄ μ•½κ°„μ˜ μ„±λŠ₯ 이점을 κ°€μ§ˆ 수 μžˆλ‹€.

μƒμ„±μž λ°©μ‹μ˜ 단점

  1. 가독성 μ €ν•˜
    λ§€κ°œλ³€μˆ˜κ°€ λ§Žμ•„μ§€λ©΄ μƒμ„±μžμ˜ 가독성이 떨어진닀.

  2. μœ μ—°μ„± λΆ€μ‘±
    선택적인 ν•„λ“œλ₯Ό μ„€μ •ν•˜κΈ° μ–΄λ ΅κ³ , ν•„λ“œμ˜ μˆœμ„œμ— μ˜μ‘΄ν•˜κ²Œ λœλ‹€.

  3. μœ μ§€λ³΄μˆ˜ 어렀움
    ν•„λ“œκ°€ μΆ”κ°€λ˜κ±°λ‚˜ 변경될 λ•Œλ§ˆλ‹€ μƒμ„±μžλ„ μˆ˜μ •ν•΄μ•Ό ν•œλ‹€.

μš”μ•½

λΉŒλ” νŒ¨ν„΄μ€ 객체 생성 μ‹œ 가독성과 μœ μ—°μ„±μ„ 높이고, λ³΅μž‘ν•œ 객체λ₯Ό 보닀 μ‰½κ²Œ 생성할 수 있게 ν•΄μ€€λ‹€. 특히 ν•„λ“œκ°€ λ§Žκ±°λ‚˜ 선택적인 ν•„λ“œκ°€ μžˆλŠ” 경우 λΉŒλ” νŒ¨ν„΄μ΄ 맀우 μœ μš©ν•˜λ‹€.

반면, λ‹¨μˆœν•œ 객체 μƒμ„±μ—λŠ” 기쑴의 μƒμ„±μž 방식이 더 간단할 수 μžˆλ‹€. 상황에 맞게 μ μ ˆν•œ νŒ¨ν„΄μ„ μ„ νƒν•˜λŠ” 것이 μ€‘μš”ν•˜λ‹€.

This post is licensed under CC BY 4.0 by the author.