[cs - Java] Builder 패턴

링딩·2023년 5월 2일
0

Computer Science

목록 보기
46/49

이 글을 통해 작성하였습니다.

빌더 패턴?

◽ 의미

복잡한 Object들을 단계별로 구축할 수 있는 생성 디자인 패턴

  • 이를 이용하면 동일한 구성코드를 사용해 다양한 타입과 표현을 제공한다.
    => 즉 생성자를 가독성 있게 만들어주는 도구라고 생각하자.

그렇다면 보통 다들 생성자 말고 Setter를 쓰면 어떤가?

라는 생각을 할 수도 있을텐데 Setter를 쓰면 가독성은 좋지만 다른 문제가 생긴다.

Q. Setter를 지양하는 이유?

1. 의도 파악이 어렵다.

객체의 값을 바꾼다는 것은 보통 비즈니스 로직을 위해서 바꾸지만 Setter를 이용하는 경우에선 무슨 의도를 가지고 하였는지 알 수 없다.

=> 이 의도를 명확히 할 수 있는 함수를 만들자


2. 객체의 일관성을 유지하기 어렵다.

Setter를 쓰게 된다면, 객체 하나를 만들기 위해서 함수를 여러개 호출해야되고,
객체가 완전히 생성되기 전까지는 일관성이 무너진 상태에 놓이게 된다.

  • Setter는 public으로 변경이 용이하다
    -> 즉 어디서든 변경이 이루어질 수 있는 위험이 생긴다.
    -> 객체의 일관성을 유지하기 어렵다.😥
    -> final 키워드로 제한을 주면 되는거 아닌가? A. 굳이 그렇게 할거면 생성자에서 값을 설정하고 Setter를 만들 필요가 있을까?

결론은

이런 이유 때문에 빌더 패턴이 필요하고 권장하고 있다.

⚡️ 이펙티브 자바 책에서도 아래와 같이 이야기 한다.

생성자나 정적 팩터리가 처리해야 할 매개변수가 많다면 빌더 패턴을 선택하는 게 더 낫다



2. 빌더 패턴 사용 방법

기본적으로 @Builder 어노테이션을 사용하면 간단히 사용할 수 있다.


  • 클래스 전체에서 적용
@Getter @Builder // ✨ 클래스 전체 필드를 빌더로 사용 가능!
public class UserLombok {

  private Long id;
  private String email;
  private String password;
  private String name;
}

// 사용예제
public User join(String email, String password, String name) {
  UserLombok build = UserLombok.builder()
            .email(email)
            .password(password)
            .name(name)
            .build();
  ...
}

  • 특정 생성자에서 적용
@Getter
public class UserLombok {

  private Long id;
  private String email;
  private String password;
  private String name;

  @Builder // ✨ 빌더는 email, password만 사용 가능
  public UserLombok(String email, String password) {
    this.email = email;
    this.password = password;
  }

  public UserLombok(Long id, String email, String password, String name) {
    this.id = id;
    this.email = email;
    this.password = password;
    this.name = name;
  }
}

// 사용예제 - email, password만 가능!
public User join(String email, String password, String name) {
  UserLombok build = UserLombok.builder()
            .email(email)
            .password(password)
            .build();
  ...
}





profile
초짜 백엔드 개린이

0개의 댓글