[JAVA]Builder Pattern 적용기

bbbbbhyun·2024년 12월 26일
0

Builder Pattern이란?

Builder Pattern은 객체 생성 패턴(Creational Design Pattern) 중 하나로, 객체의 생성 과정을 세밀하게 제어하면서 복잡한 객체를 단계적으로 생성할 수 있게 해주는 디자인 패턴
이는 특히 생성할 객체의 속성이 많거나, 생성 과정에서의 변형이 필요한 경우 유용

기존 코드를 다음과 같이 사용중이였다

@Entity
@Getter
@Builder
@AllArgsConstructor
@NoArgsConstructor
public class LoginHistory {
    @Id
    @Column(name = "id", length = 36)
    private Long id;

    @Column(name = "login_ip", nullable = false)
    private String loginIp;
}

위코드의 잘한점

  1. @Setter를 사용하지 않아 객체가 무분별하게 변경될 가능성은 막고 있음

위코드의 문제점

  1. @NoArgsConstructor의 사용으로 기본 생성자의 접근 제어자가 불명확함
  2. @AllArgsConstructor의 사용으로 모든 필드를 포함한 생성자를 생성 (매우 위험)

해결방법1

@NoArgsConstructor(access = AccessLevel.PROTECTED)

  • 다음과 같이 설정하면 의미 없는 객체의 생성을 막을 수 있음
  • 즉 무분별한 객체 생성에 대해 한번 더 체크 가능
LoginHistory loginHistory = new LoginHistory();
//NoArgsConstructor(access = AccessLevel.PROTECTED) 사용시 다음과 같이 오류 발생
//'LoginHistory()' has protected access in 'com.test.project.domain.LoginHistory'

해결방법2

@AllArgsConstructor 삭제

리팩토링 결과

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class LoginHistory {

    @Id
    @Column(name = "id", length = 36)
    private Long id;

    @Column(name = "login_ip", nullable = false)
    private String loginIp;

    @Builder
    public LoginHistory(Long id, String loginIp){
        this.id = id;
        this.loginIp = loginIp;
    }
}

참고 사항

  1. toString시 오류나는 현상 방지
@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
@ToString
public class LoginHistory {

    @Id
    @Column(name = "id", length = 36)
    private Long id;

	@ToString.Exclude
    @OneToMany(mappedBy = "member", cascade = CascadeType.ALL)
    @Column(name = "member_id", nullable = false)
    private Member member;

    @Builder
    public LoginHistory(Long id){
        this.id = id;
    }
}
profile
BackEnd develope

0개의 댓글