spring boot) builder 패턴 사용시 문제점 식별

박우영·2023년 4월 1일
0

트러블 슈팅

목록 보기
2/19

기존에 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 발생되는것을 막을 수 있다.

0개의 댓글