[Java] @Builder 도입

귀찮Lee·2023년 2월 28일
0

◎ @Builder 도입

  • @NoArgsConstructor와 @Setter 사용시에 문제가 있음

    • 객체에 있어 객체가 할 수 있는 행동은 최대한 객체 내부에서 일어나야 하지만 setter를 사용하게 된다면 모든 행동들을 객체 외부에서 결정함
  • 객체 외부에서 변경을 할 수 있게 할 때 좋지 않은 점

    • setter를 사용하는 객체에서 다른 객체의 구조를 알고 있어야 한다.
      -> 한 class의 구조를 변경하게 된다면 연관된 class의 코드도 전부 바꿔야 한다.
    • 특정 값들은 인트턴스 생성 시에만 넣고 변경되어야 하지 않아야 될 데이터들도 변경 가능하게 된다.
      -> 다른 사람(팀원 등)이 유지/보수시 의도와는 다르게 코드르르 작성할 여지를 만든다.
  • @Builder 패턴 도입

    • 초기 Builder 패턴을 통해 초깃값들을 이해하기 쉽게 넣을 수 있다.
    • 변경이 필요한 값들은 Setter 대신 update() 등의 method들을 구현해서 사용하면 되겠다.

◎ @Builder 패턴 장점

  • 필요한 데이터만 설정할 수 있다
  • 유연성을 확보할 수 있다
  • 가독성을 높일 수 있다
  • 변경 가능성을 최소화할 수 있다

◎ @Builder 사용 유의 사항

  • class위에 @Builder를 붙이는 것을 지양해야 한다.

    • 생성시 특정 값들을 설정해야 되지 않거나 정해진 Default 값을 사용해야 한다면 해당 @Builder 사용은 적절지 않다.
    • 생성자를 하나 만들고 그 곳에 @Builder를 사용한다면 내가 초기 설정해야 하는 값들만 설정할 수 있다.
  • @Builder.Default 사용

    • 따로 builder를 통해 값들을 설정해 주지 않을 때 기본값이 필요하다면 field에 @Builder.Default를 사용한다면 기본값을 설정해 줄 수 있다.

◎ 사용 예시

// class에 Builder를 붙이는 것을 추천하지 않는다.
// 추후 리팩토링 예정

@AllArgsConstructor
@Builder
@Getter
public class Member {

    private long memberId;
    private String email;
    private String password;
    private String displayName;
    @Builder.Default
    private MemberRole role = MemberRole.ROLE_USER;
    
    // 변경이 필요하다면 method를 구현함
    public void updatePassword(String encodedPassword) {
        this.password = encodedPassword;
    }
}

◎ 참고 자료

profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!

0개의 댓글