JAVA

builder 패턴

3분 입문자 2023. 7. 4.
@NoArgsConstructor  
@Getter
@Entity
public class Member {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(nullable = false , length = 20)
    private String email;
    @Column(nullable = false , length = 20)
    private String username;

    @Column(nullable = false , length = 500) // 패스워드 인코딩(BCrypt)
    private String password;

    @Column(nullable = false , length = 20)
    private String fullname;

    @Enumerated(EnumType.STRING)
    @Column(nullable = false)
    private MemberEnum role;

    @CreatedDate
    @Column(nullable = false)
    private LocalDateTime createdAt;

    private String provider;

    private String providerId;

    @LastModifiedDate
    @Column(nullable = false)
    private LocalDateTime updatedAt;

    @Column(length = 4000)
    private String refreshToken;

    private int lgnFlrCnt;

    private boolean isUsed;

    @LastModifiedDate
    @Column(nullable = false)
    private LocalDateTime lastAccessDate;

    private LocalDateTime pwChgDate;

    @Builder
    public Member(Long id,
                  String username,
                  String password,
                  String email,
                  String fullname,
                  MemberEnum role,
                  String refreshToken,
                  int lgnFlrCnt,
                  String provider,
                  String providerId,
                  boolean isUsed,
                  LocalDateTime createdAt,
                  LocalDateTime updatedAt,
                  LocalDateTime lastAccessDate,
                  LocalDateTime pwChgDate) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
        this.fullname = fullname;
        this.role = role;
        this.refreshToken = refreshToken;
        this.lgnFlrCnt = lgnFlrCnt;
        this.provider = provider;
        this.providerId = providerId;
        this.isUsed = isUsed;
        this.createdAt = createdAt;
        this.updatedAt = updatedAt;
        this.lastAccessDate = lastAccessDate;
        this.pwChgDate = pwChgDate;
    }

 

생성자에 @Builder 어노테이션을 추가하여 builder 패턴을 사용한다.

그 후 사용시에

Member.builder.xxx().xx().build(); 로 객체를 생성한다.

그리고 디롬복을 해서 코드를 보니

 public static MemberBuilder builder() {
        return new MemberBuilder();
    }

    public Member(Long id,
                  String username,
                  String password,
                  String email,
                  String fullname,
                  MemberEnum role,
                  String refreshToken,
                  int lgnFlrCnt,
                  String provider,
                  String providerId,
                  boolean isUsed,
                  LocalDateTime createdAt,
                  LocalDateTime updatedAt,
                  LocalDateTime lastAccessDate,
                  LocalDateTime pwChgDate) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
        this.fullname = fullname;
        this.role = role;
        this.refreshToken = refreshToken;
        this.lgnFlrCnt = lgnFlrCnt;
        this.provider = provider;
        this.providerId = providerId;
        this.isUsed = isUsed;
        this.createdAt = createdAt;
        this.updatedAt = updatedAt;
        this.lastAccessDate = lastAccessDate;
        this.pwChgDate = pwChgDate;
    }


    public static class MemberBuilder {
        private Long id;
        private String username;
        private String password;
        private String email;
        private String fullname;
        private MemberEnum role;
        private String refreshToken;
        private int lgnFlrCnt;
        private String provider;
        private String providerId;
        private boolean isUsed;
        private LocalDateTime createdAt;
        private LocalDateTime updatedAt;
        private LocalDateTime lastAccessDate;
        private LocalDateTime pwChgDate;

        MemberBuilder() {
        }

        public MemberBuilder id(Long id) {
            this.id = id;
            return this;
        }

        public MemberBuilder username(String username) {
            this.username = username;
            return this;
        }

        public MemberBuilder password(String password) {
            this.password = password;
            return this;
        }

        public MemberBuilder email(String email) {
            this.email = email;
            return this;
        }

        public MemberBuilder fullname(String fullname) {
            this.fullname = fullname;
            return this;
        }

        public MemberBuilder role(MemberEnum role) {
            this.role = role;
            return this;
        }

        public MemberBuilder refreshToken(String refreshToken) {
            this.refreshToken = refreshToken;
            return this;
        }

        public MemberBuilder lgnFlrCnt(int lgnFlrCnt) {
            this.lgnFlrCnt = lgnFlrCnt;
            return this;
        }

        public MemberBuilder provider(String provider) {
            this.provider = provider;
            return this;
        }

        public MemberBuilder providerId(String providerId) {
            this.providerId = providerId;
            return this;
        }

        public MemberBuilder isUsed(boolean isUsed) {
            this.isUsed = isUsed;
            return this;
        }

        public MemberBuilder createdAt(LocalDateTime createdAt) {
            this.createdAt = createdAt;
            return this;
        }

        public MemberBuilder updatedAt(LocalDateTime updatedAt) {
            this.updatedAt = updatedAt;
            return this;
        }

        public MemberBuilder lastAccessDate(LocalDateTime lastAccessDate) {
            this.lastAccessDate = lastAccessDate;
            return this;
        }

        public MemberBuilder pwChgDate(LocalDateTime pwChgDate) {
            this.pwChgDate = pwChgDate;
            return this;
        }

        public Member build() {
            return new Member(id, username, password, email, fullname, role, refreshToken, lgnFlrCnt, provider, providerId, isUsed, createdAt, updatedAt, lastAccessDate, pwChgDate);
        }

        public String toString() {
            return "Member.MemberBuilder(id=" + this.id + ", username=" + this.username + ", password=" + this.password + ", email=" + this.email + ", fullname=" + this.fullname + ", role=" + this.role + ", refreshToken=" + this.refreshToken + ", lgnFlrCnt=" + this.lgnFlrCnt + ", provider=" + this.provider + ", providerId=" + this.providerId + ", isUsed=" + this.isUsed + ", createdAt=" + this.createdAt + ", updatedAt=" + this.updatedAt + ", lastAccessDate=" + this.lastAccessDate + ", pwChgDate=" + this.pwChgDate + ")";
        }
    }

- 빌더 패턴 푼 소스

 

 

이렇게 @Builder에 파라미터를 추가 하여 메서드 명을 수정 할 수 있다.

//보편적으로 사용
@Builder
Member.builder().build();

//내가 builder , build 메서드 명을 수정
@Builder(builderMethodName = "aaa",buildMethodName = "bbb")
Member.aaa().bbb();

builder 와 build 메서드 명을 변경 할 수 있으면

entity에서 객체 인스턴스 생성은 정적 팩토리 메서드 보다 빌더 패턴이 더 낫지 않을까 하는 생각이 든다..

'JAVA' 카테고리의 다른 글

Lombok (@EqualsAndHashCode ) 직접 오버라이드  (0) 2025.03.05
equals / == 비교  (0) 2025.03.03
object 클래스 ,string 관련  (0) 2023.03.04
super 키워드 , 다운캐스팅 , instanceof  (0) 2023.03.04
변수 범위  (0) 2023.03.04

댓글