life is egg

게시글 삭제 시 댓글 삭제 본문

개인공부/삽질

게시글 삭제 시 댓글 삭제

삶은계란진재혁 2022. 12. 29. 00:23

드디어 JPA 관계 설정시 오류나는 이유를 알았다

 

내가 postID를 먼저 코멘트 엔티티에 등록을 해놓아서... 포스트 객체를 가지고 Comment엔티티에 @ManyToOne 어노테이션을 달아놓으니까 오류가 생긴것.. 이거이거... 너무 똑똑한 JPA라 할 수 있겠다..

 

난 ... FK 이름을 Post_ID로 해놓고 Comment 엔티티 컬럼에 postId가 있어서 이름이 똑같아서 생기는 오류인줄 알고

postsID로 변경하니까 실행은 되는데 댓글 저장인 안되는 오류가 떳었는데... (사실 그전에 실행은 되는데 콘솔창에 오류가 떳었다)

 

튜터님의 조언으로 둘중 하나만 해야한다는 걸 알았다 똑똑한 JPA는  구분을 할 줄알아서 postID 컬럼을 가지고 있는데 포스트 객체로 관계를 맺으면 두번 관계를 맺는다는 것..

 @Column
 private Long postsId;  
    
   /* @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "POST_ID",nullable = false)
    private Posts posts;*/

 

둘중에하나만 해라 .. !이것이다 

 

그러면 관계를 안맺고 어떻게 게시글 삭제할때 댓글도 같이 삭제함..?! 내 의문이였는데 이것도 알아서 지원해주는 것이 있다..

 

public interface CommentRepository extends JpaRepository<Comment,Long> {

    ArrayList<Comment> findByPostsIdOrderByCreatedDateDesc(Long postId);

    ArrayList<Comment> deleteByPostsId(Long postId);

}

 바로 deleteByPostID... 이걸 포스트삭제메소드에 스리슬쩍 껴놓으면 된다 ..!

 @Transactional
    public void delete(Long id, HttpServletRequest request , PostDeleteRequestDto requestDto) {
        String token = jwtUtil.resolveToken(request);
        Claims claims;
        if (token != null) {
            if (jwtUtil.validateToken(token)) {
                claims = jwtUtil.getUserInfoFromToken(token);
            } else {
                throw new IllegalArgumentException("Token Error");
            }
            if (requestDto.getUsername().equals(claims.getSubject())){
                postsRepository.delete(postsRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("해당 게시글이 없습니다. id=" + id)));
                commentRepository.deleteByPostsId(id);
            }else
                throw new RuntimeException("글 작성자가 아니라서 실패란다!");
        }else
            throw new RuntimeException("삭제 실패란다!");
    }

이러면 게시글아이디값 @Path~ 이걸로 받아와서 삭제할때 댓글 레포지토리 들려서 같은 게시글아이디를 가진 댓글을 삭제해준다

 

포스트맨 과 H2DB로 확인해봤다 ! !! 단지 두번하기에는 지금 약간 피곤해서 안할뿐이다 ! 만세 만세 만세

 

아 그리고 

 

그러면 언제 연관관계를 맺고 안맺고 하는 기준이 있을꺼아니야? 그 기준이 뭔데라고 하면

 

일단 ... 그전에 댓글이 존재할려면 게시글이 꼭 필요해... 근데 게시글은 댓글이 필요없어 ! 있든말든임 그러면 일단 댓글엔티티에 관계설정을 해줘야해 .. 그러면 무슨 관계이지 게시글 하나에 댓글은 많이 달릴수 있자나 그러면 댓글에다가 관계설정을 해줘야하니까 ManyToOne이 됨.. ! //단방향으로 만족. 근데 만약에 관계가 OneToMany가 선행된다면 양방향 관계처럼 ManyToOne을 해줘야함 지금의 경우는 필요없지..!

 

여기까지가 관계설정이고 

그러면.. 언제 필요하냐면 만약에 댓글이... 포스트객체의 메소드..를 쓸일이 있다면 관계설정해서 꺼내쓰는게 더 편하겠집.. 아니면 id값만 설정해주는거고...

 Posts posts = comment.getPosts();
 
 Posts posts = postsRepository.findById(comment.getPostsId());

 

윗줄은 관계설정해서 코멘트 엔티티에서 포스츠 객체를 꺼내는거..

밑에는 코멘트엔티티에서 포스트아이디를 꺼내서 포스트아이디를 가지고 포스트 레포에접근해서 포스트 객체를 꺼내는것..

 

근데 지금 내상황에서는 포스트 객체로 하는 일이 없자나 그니까 관계설정 안해줘도됨 ..!

 

 

'개인공부 > 삽질' 카테고리의 다른 글

org.h2.jdbc.JdbcSQLInvalidAuthorizationSpecException: Wrong user name or password  (0) 2023.01.11
@Bean 등록 에러  (0) 2023.01.11
댓글 삭제 수정  (0) 2022.12.27
게시글마다 댓글조회하기.  (1) 2022.12.26
삽질 FE  (0) 2022.12.18
Comments