@Builder : 롬복에서 제공하는 어노테이션으로, Builder 패턴을 사용해 오브젝트를 생성할 수 있다.
TodoEntity todo = TodoEntity.builder()
.id("t- 29283828482")
.userId("developer")
.title("Implement Model")
.build();
생성자를 사용해 오브젝트를 생성하는 것과 비슷하며, 생성자 매개변수가 많을 때 각각의 매개변수의 순서를 모르더라도 생성할 수 있다.
클래스 위치 : 필드를 추가할 때마다 수정하지 않아도 된다.
@Getter @Setter
@AllArgsConstructor
@NoArgsConstructor
@Builder
public class MemberDto {
private String username;
private String password;
private String nickname;
}
생성자 위치 : 사용하고 싶지 않은 매개변수를 제외하고 생성할 수 있다.
(예를들면 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 어노테이션을 함께 사용해준다
@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)
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;
}