@Builder란?, @NonNull?

·2023년 7월 14일
0

프로젝트 공부

목록 보기
12/33

@Builder

@Builder : 롬복에서 제공하는 어노테이션으로, Builder 패턴을 사용해 오브젝트를 생성할 수 있다.

TodoEntity todo = TodoEntity.builder()
					.id("t-	29283828482")
					.userId("developer")
					.title("Implement Model")
					.build();

생성자를 사용해 오브젝트를 생성하는 것과 비슷하며, 생성자 매개변수가 많을 때 각각의 매개변수의 순서를 모르더라도 생성할 수 있다.

Builder 사용법 - Class 위치

클래스 위치 : 필드를 추가할 때마다 수정하지 않아도 된다.

@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MemberDto {

    private String username;

    private String password;

    private String nickname;
}

Builder 사용법 - 생성자 위치

생성자 위치 : 사용하고 싶지 않은 매개변수를 제외하고 생성할 수 있다.
(예를들면 JPA Entity에서 @Id 필드)

@Getter @Setter
@NoArgsConstructor
public class MemberDto {

    private String username;

    private String password;

    private String nickname;

    @Builder
    public MemberDto(String username, String password, String nickname) {
        this.username = username;
        this.password = password;
        this.nickname = nickname;
    }
}

❗주의 - 기본 생성자 사라진다

@Builder를 사용하면 매개변수가 들어간 생성자가 생긴다
=> 기본 생성자가 사라진다
=> Request와 연결하는 과정에서 문제가 발생할 수 있다
=> 기본생성자를 생성해주는 @NoArgsConstructor 어노테이션을 함께 사용해준다

❗NotNull 해결법

1. Assert 이용하기

@ToString
public class Book {

    private String bookName;
    private String author;
    private Integer price;


    @Builder
    public Book(String bookName, String author, Integer price) {
        Assert.hasText(bookName, "책이름이 없습니다");
        Assert.hasText(author, "저자명이 없습니다");

        this.bookName = bookName;
        this.author = author;
        this.price = price;
    }
}

출력 로그

book = Book(bookName=나는 바람처럼 자유롭다, author=최인호, price=1000)
book2 = Book(bookName=null, author=null, price=1000)

@NonNull 사용하기

DB에 넣을 엔티티의 필드 중에는 NULL또는 NonNULL로 나뉜다.
이때 NonNull인 값이 null이 들어가는 것을 막기 위해, @builder가 사용된 생성자의 파라미터에 @NonNull을 추가해 해결해줄 수 있다

@Builder
public Book(@NonNull String bookName, @NonNull String author, Integer price) {
	this.bookName = bookName;
    this.author = author;
    this.price = price;
}
  • 참고-@NonNull 사용시 메세지 커스텀 불가

참고
Builder
[java] builder 패턴, 객체를 안전하게 생성하기

profile
개발자가 되고싶은 낭랑 24세

0개의 댓글

관련 채용 정보