본문 바로가기

📝 ErrorNote

[ SpringBoot ] lombok : 오버라이딩한 생성자에 @Builder 어노테이션 사용 시 발생하는 문제

오늘은 개인 미니프로젝트를 하다가 새롭게 알게 된 내용을 적어보려고 한다.

 

Builder 어노테이션을 활용하여 회원가입, 회원정보수정 시 사용할 생성자를 정의해두었다. 

    @Builder
    public User(String username, String password, String name, String email) {
        this.username = username;
        this.password = password;
        this.name = name;
        this.email = email;
    }

    @Builder
    public User(String name, String password, String website, String bio, String phone, String gender) {
        this.name = name;
        this.password = password;
        this.website = website;
        this.bio = bio;
        this.phone = phone;
        this.gender = gender;
    }

 

그리고난 뒤 Dto로 받아온 객체를 Entity 객체로 전환하기 위해 toEntity 메서드를 선언 하는 과정에서 

계속 회원정보 수정시에도 회원가입 빌더가 적용되어

회원정보 수정시 필요한 필드인 website, bio, phone 등의 필드 값을 저장하려고 하면 

계속 빨간 글자로 되는 오류를 만났다. 

 

왜 그러는가 도대체.. 쉬운 문제인 것 같았지만 해결하는 방법을 몰라 한참을 구글링하다가 알게된 개념은

 

바로 "Buildermethodname"이라는 속성이었다. 

 

@Builder 어노테이션 옆에 빌더 메서드 네임을 따로 지정해주면 생성자가 여러개 오버라이딩 되어 빌더를 사용할 때 오류가 발생하는 것을 막을 수 있다. 

 

생성자의 경우 클래스 이름으로 만들어져 여러개가 오버라이딩 될 경우 어떤 생성자를 사용하여 빌더패턴을 적용해야하는지 혼동한다고 한다.! 

 

@Builder(builderMethodName = "signupBuilder")
public User(String username, String password, String name, String email) {
    this.username = username;
    this.password = password;
    this.name = name;
    this.email = email;
}

@Builder(builderMethodName = "updateBuilder")
public User(String name, String password, String website, String bio, String phone, String gender) {
    this.name = name;
    this.password = password;
    this.website = website;
    this.bio = bio;
    this.phone = phone;
    this.gender = gender;
}

 

이렇게 각각 이름을 설정해둔 뒤에 해당 빌더를 사용할 때 

 

public User toEntity() {
    User user = User.updateBuilder()
            .name(name)
            .password(password)
            .website(website)
            .bio(bio)
            .phone(phone)
            .gender(gender).build();

    return user;
}

 

이렇게 지정해준 이름으로 빌더를 불러와서 사용해주면 된다! 

 

빌더 어노테이션으로 빌더패턴을 쉽게 사용하면서도 이런 간단한 설정 방법을 몰랐다! 

 

역시 더 공부해야한다!!