프로젝트 아보카도의 백엔드 서버에서는 현재 엔티티를 @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
를 생성하여 예외를 핸들링해보자.
이제 예외까지 핸들링하였으니.. 부적절한 객체의 생성도 막았다..
근데 이 공허함은 뭘까?
아쉬운 점
가독성을 챙기고자 도입했던 빌더로 인해서,
생성자에 유효성 검사가 추가
되고.. 예외를 처리하는 로직까지 추가되었다. 이득보다 손해가 더 많은 느낌이다.
다음엔 안 써야겠다.
전체 코드는 링크를 통해 보실 수 있습니다.
님이 뭔데 우리 빌더 욕해요