기존에 builder 를 사용할때 일반 사용자 함수를 만들어 하는 방식과 동일하게
public void create(String content, Board board, Member member) {
Comment comment = Comment.builder()
.content(content) // 내용
.createDate(LocalDateTime.now()) // 등록일 (최초 게시)
.board(board) // 게시글
.member(member) // 작성자
.build(); // 마무리
board.getComments().add(comment); // board 에 추가
member.getComments().add(comment); // member 에 추가
this.commentRepository.save(comment); // 댓글 저장
}
위와 같이 사용했다 문제는 create 할때는 문제가 되지 않지만
update 할때 새로운 객체가 생성된 다는 것이었다.
예를들어 id =1 인 comment 를 만들었는데 수정하면 새로운 id 를 생성해서
덮어씌워야 하는문제가 발생 하는것이다.
또, 이런식으로 기존의 create_date 는 삭제가 되고 id는 증가 하는 문제가 생긴다.
이때 기존의 객체를 복제하는 toBuilder 를 사용했다
toBuilder 메서드를 사용하기 위해선 Builder어노테이션에
@Builder(toBuilder = true) 를 설정해주면 된다.
// 댓글 수정 //
public void modify(Comment comment, String contents) {
Comment comment1 = comment.toBuilder() // toBuilder 로 수정!!!
.content(contents)
.modifyDate(LocalDateTime.now())
.build();
this.commentRepository.save(comment1);
}
기존의 comment 를 toBuilder()메서드를 이용해 복제후 수정 하는 것이다.
추가적으로,
entity 클래스에 List가 없다면 문제되지 않지만
List 가 있을때 빌더에 추가 되는값이 아니라면
@OneToMany(mappedBy = "member")
@Builder.Default
private List<Board> boards = new ArrayList<>();
위와같이 @Builder.Default로 null 발생되는것을 막을 수 있다.