[Spring Boot] @Builder가 과연 좋을까?

이동엽·2023년 6월 21일
3

spring

목록 보기
7/21

프로젝트 아보카도의 백엔드 서버에서는 현재 엔티티를 @Builder 애너테이션을 이용해 엔티티를 생성하는 빌더 패턴을 사용중이다.


  • 사용 예시
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class Member extends BaseEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "member_id")
    private Long id;

    @Column(name = "member_nickname", unique = true, nullable = false)
    private String nickname;

    @Column(name = "member_email", unique = true, nullable = false)
    private String email;

    @Column(name = "member_password", nullable = false)
    private String password;

    @Column(name = "member_phonenumber", nullable = false)
	private String phoneNumber;

	...

	@Builder
	public Member(
		final String nickname,
        final String email,
        final String password,
        final String phoneNumber) {

        final Member member = new Member();
        member.nickname = nickname;
        member.email = email;
        member.password = password;
        member.phoneNumber = phoneNumber;

        return member;
	}

	...
}

이 방식의 문제점은 객체 생성시 가독성을 챙길 순 있지만, 필수 파라미터를 보장하지 않는다!

ex) 아래와 같이 필수로 요구되는 필드를 입력하지 않아도 객체를 생성해버린다.

  • 원했던 생성자
Member member = 
	Member.builder()
    .nickname(nickname)
    .email(email)
    .password(password)
    .phoneNumber(phoneNumber)
    .build();

  • 실제로는 아래와 같이 몇몇 필드를 입력하지 않아도 객체를 생성시킨다.
Member member = 
	Member.builder()
    .nickname(nickname)
    .email(email)
//	.password(password)
//  .phoneNumber(phoneNumber)
    .build();

첫번째 시도

이러한 부적절한 객체 생성을 방지하기 위해서 Spring에서 제공하는 Assert를 이용해 유효성 검사를 추가했다.

새롭게 생긴 문제점

해당 메서드는 유효성 조건에 만족하지 않을시 IllegalArgumentException 을 던지는데,
문제는 해당 예외를 던지는 것 까지는 알겠으나.. 처리(catch)해주는 부분이 없다.
(아래 도큐먼트 사진 참조)


두번째 시도

이제는 이러한 예외들을 공통으로 핸들링할 수 있도록 Exception Handler를 생성하여 예외를 핸들링해보자.

이제 예외까지 핸들링하였으니.. 부적절한 객체의 생성도 막았다..
근데 이 공허함은 뭘까?


아쉬운 점

가독성을 챙기고자 도입했던 빌더로 인해서,
생성자에 유효성 검사가 추가되고.. 예외를 처리하는 로직까지 추가되었다. 이득보다 손해가 더 많은 느낌이다.

다음엔 안 써야겠다.
전체 코드는 링크를 통해 보실 수 있습니다.

profile
백엔드 개발자로 등 따숩고 배 부르게 되는 그 날까지

1개의 댓글

comment-user-thumbnail
2023년 6월 23일

님이 뭔데 우리 빌더 욕해요

답글 달기