생성자에 매개변수가 많다면 빌더를 고려하라

OH JU HYEON·2022년 8월 2일
1

Java

목록 보기
2/6
post-thumbnail

생성자에 매개변수가 많다면 빌더를 고려하라

아이템 2

이전 방법들의 단점

전에 정적 팩터리에 관한 내용을 공부했는데 이 정적 팩터리 메서드와 생성자는 선택적 매개변수가 많을 때 사용하기가 어렵다는 점이다.

책에서는 영양 성분으로 예시를 들었는데 영양 성분 정보는 매우 많은 정보를 포함하고 있지만 대부분의 값이 그냥 0인 경우가 많아 생성자를 활용한 패턴은 확장이 어렵다는 점을 꼬집고 있다.

즉, 사용은 가능하다 매개변수의 수가 많아지면 코드를 작성하기 어렵거나 읽기가 어려워진다는 단점이 있는 것이다. 또 다른 방법으로 자바 빈즈 패턴이 있지만 이 방법은 일관성이 깨지고 불변으로 만들 수 없다는 점에 있어 단점이 있다. 왜냐하면 자바 빈즈 패턴에서 객체를 하나 만들기 위해 여러 개의 메서드를 호출해야 하고 객체를 완성하기 전 까지는 일관성이 깨진 상태가 되기 때문이다.

빌더 패턴

이런 단점들을 보완하여 사용할 만한 방법으로 매개변수가 많을 때 빌더 패턴(Builder Pattern)을 사용할 것을 권장하고 있다.

빌더를 사용하여 클라이언트는 필수 매개변수만으로 생성자를 호출해 빌더 객체를 얻고 빌더 객체가 제공하는 메서드로 원하는 메서드를 설정한다. 이 다음으로 매개변수가 없는 build 메서드를 호출해 객체를 얻게 된다.

빌더는 생성할 클래스 안에서 정적 멤버 클래스로 만드는 것이 일반적이라고 한다.

간단한 예시

간단한 예시로 내가 저번에 프로젝트 할 때 사용한 빌더인데 이렇게 활용할 수가 있다.

 @Builder
 public UserEntity(Long userNo,
                  String userName,
                  String userPn,
                  String userEmail,
                  String userId,
                  String userPw,
                  String userAddr) {
    this.userNo = userNo;
    this.userName = userName;
    this.userPn = userPn;
    this.userEmail = userEmail;
    this.userId = userId;
    this.userPw = userPw;
    this.userAddr = userAddr;
}

UserEntity에서 이렇게 @Builder를 통해 간단하게 사용할 수 있다.

UserEntity userEntity = UserEntity.builder()
                .userNo(userDTO.getUserNo())
                .userName(userDTO.getUserName())
                .userPn(userDTO.getUserPn())
                .userEmail(userDTO.getUserEmail())
                .userId(userDTO.getUserId())
                .userPw(EncryptUtil.encHashSHA256(userDTO.getUserPw()))
                .userAddr(userDTO.getUserAddr())
                .build();

사용은 위 코드와 같이 사용할 수 있다. 빌더에 관한 내용은 공식 문서를 참고하면 되는데 @builder어노테이션이 붙은 클래스에 대해 빌더를 생성해 주는 역할을 한다.

특징

빌더는 계층적으로 설계된 클래스와 함께 사용하기 좋고 자바 빈즈보다 안전하고 생성자보다 코드를 읽고 쓰기가 쉽다는 특징이 있다. 단점으로는 객체를 만들기 위해 빌더부터 만들어야 하는데 이 빌더 생성 비용이 크지는 않지만 민감한 상황에서는 문제가 될 수도 있다고 한다. 때문에 정적 팩터리 메서드나 생성자를 사용하다가 추후에 매개변수가 많아지면 빌더로 전환하여 사용해도 괜찮다. 물론, 그렇지 않고 빌더로 시작해도 무방하다고 한다.

참고

Lombok 공식 문서 : Builder
Effective Java 3/E

profile
읽기만 해도 이해가 되는 글을 쓰기 위해 노력합니다.

0개의 댓글