본문 바로가기

오늘의 공부 & 기록

빌더패턴(Builder Pattern)과 @Builder

https://pamyferret.tistory.com/67

 

빌더 패턴(Builder pattern)을 써야하는 이유, @Builder

빌더 패턴(Builder pattern)이란? 객체를 정의하고 그 객체를 생성할 때 보통 생성자를 통해 생성하는 것을 생각한다. Bag bag = new Bag("name", 1000, "memo"); 하지만 생성자를 통해 객체를 생성하는데 몇 가

pamyferret.tistory.com

https://mangkyu.tistory.com/163

 

[Java] 빌더 패턴(Builder Pattern)을 사용해야 하는 이유

객체를 생성하기 위해서는 생성자 패턴, 정적 메소드 패턴, 수정자 패턴, 빌더 패턴 등을 사용할 수 있습니다. 개인적으로 객체를 생성할 때에는 반드시 빌더 패턴을 사용해야 한다고 생각하는

mangkyu.tistory.com

https://velog.io/@sally_devv/Builder-%ED%8C%A8%ED%84%B4-Dto

 

@Builder 패턴, Dto

IssueTracker 클론 프로젝트 진행 중 PR 보낸 코드에 리뷰가 달렸다.from. 리뷰어 왕민 dto 클래스에 builder 패턴은 오버스펙으로 보입니다.빌더패턴 사용 이유에 대해서 알아봅시다 :)빌더 패턴 사용 이

velog.io

 

 

1. 점층적 생성자 패턴(Telescoping Constructor Pattern)

생성자를 다른 여러 형태로 만들어서 사용하는 방식

 

public class Member{

  private String name; //필수
  private String nickname; // 필수
  private String gender; //선택
  private String email; //선택

  public Member(String name, String nickname){ // 필수 변수 생성자 추가
     this.name = name;
     this.nickname = nickname;
  }

  public Member(String name, String nickname, String gender){
    this.name = name;
    this.nickname = nickname;	
    this.gender = gender;
  }

  public Member(String name, String nickname, String email){
    this.name = name;
    this.nickname = nickname;
    this.email = email;
  }
  
    public Member(String name, String nickname, String gender, String email){
    this.name = name;
    this.nickname = nickname;	
    this.gender = gender;
    this.email = email;
  }
}

 

Member member = new Member("kimsky", "sky", "여", "sky@mail.com");

 

단점

인자들이 많아질 수록 생성자가 많아짐

매개변수의 정보(위치와 타입)를 알 수 없으므로 가독성이 떨어지고 코드 수정이 필요한 경우 코드 수정이 복잡함

변수가 추가/삭제 되는 경우 기존 코드를 수정해야함

 

 

2. 자바 빈즈 패턴(JavaBeans Pattern)

getter/setter를 이용하여 객체를 생성할 때 필드를 주입하는 방식

 

public class Member{

  private String name; //필수
  private String nickname; //필수
  private String gender; //선택
  private String email; //선택
  
  public Member(){

  }

  public void setName(String name){

    this.name = name;

  }
  
    public void setNickname(String nickname){

    this.nickname = nickname;

  }

  public void setGender(String gender){

    this.gender = gender;

  }

  public void setEmail(Stirng email){

    this.email = email;

  }
}

 

Member member = new member(); // 객체 생성 후 값 넣음
member.setName("kimsky");
member.setNickname("sky");
member.setGender("여");
member.setEmail("sky@mail.com");

 

장점

점층적 생성자 패턴에 비해 가독성이 좋음

 

단점

코드량이 늘어남

setter메서드를 통해 값이 계속 변할 수 있기 때문에 객체 일관성이 깨짐(객체 생성 후 값을 넣기 때문에)

 

 

3. 빌더 패턴(Builder Pattern)

객체 생성을 위한 디자인 패턴(Refactoring Guru) 중 하나

점층적 생성자 패턴과 자바 빈즈 패턴을 보완한 것이 빌드 패턴

데이터는 자바 빈즈 패턴처럼 받고, 데이터 일관성을 위해 데이터를 다 받은 후 객체를 생성함

 

package com.example.todo_app.domain;

public class Member {

    private String name; // 필수
    private String nickname; // 필수
    private String gender; // 선택
    private String email; // 선택

    public static class Builder {
        private final String name;
        private final String nickname;
        private String gender;
        private String email;

        // 필수 변수는 생성자로 값을 넣음
        public Builder(String name, String nickname) {
            this.name = name;
            this.nickname = nickname;
        }

        // 멤버 변수별 메서드: 빌더 클래스의 필드값을 set, 빌더 객체 리턴
        public Builder gender(String gender) {
            this.gender = gender;
            return this;
        }

        public Builder email(String email) {
            this.email = email;
            return this;
        }

        // 빌더 메서드
        public Member build() {
            Member member = new Member();
            member.name = this.name;
            member.nickname = this.nickname;
            member.gender = this.gender;
            member.email = this.email;
            return member;
        }


        Member memberEntity = new Builder("kimsky", "sky")
                .gender("여")
                .email("sky@mail.com")
                .build();







    }
}

 

 

 

장점

가독성을 높임

- 불필요한 생성자 제거, 명시적 선언으로 각 인자의 의미를 알기 쉬움

 

인수 확장에 용이

 

필요한 데이터만 설정 가능

- 데이터 순서에 상관 없이 객체 생성 가능

 

객체 불변성

- setter메서드를 사용하지 않으므로 변경 불가능한 객체를 만들 수 있음

 

단점

객체 생성 전에 빌더 객체 생성 필요

 

빌더 패턴을 사용하면 좋은 경우

인자들이 최소 4개 이상으로 많은 경우

선택적 인자들이 많은 경우

추가될 인자들이 많은 경우

 

 

주의

- 변수가 2개 이하이거나, 변경 가능성이 없는경우 빌더패턴의 장점이 무의미함

- 빌더 패턴이 점층적 생성자 패턴, 자바빈즈 패턴보다 항상 좋은 패턴은 아님, 상황에 맞게 판단하여 사용해야함

 

LomBok @Builder 어노테이션

- Builder 클래스를 따로 개발하지 않고 Builder패턴을 사용해 객체를 생성할 수 있음

import lombok.Builder;

@Builder
public class Member {
    private String name;
    private String nickname;
    private String gender;
    private String email;
}

 

Builder 메서드 사용법

public static void main(String[] args) {
    Member member = Member.builder()
                .name("kimsky")
                .nickname("sky")
                .gender("여")
                .email("sky@mail.com")
                .build();
}

 

 

 

 

 

 

더 알아보기: 생성자패턴, 수정자패턴, 정적 메소드 패턴