Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

개발자되기 프로젝트

글 삭제하기, cascade, orphanRemoval, 영속성 전이 본문

Project/블로그 게시판 만들기

글 삭제하기, cascade, orphanRemoval, 영속성 전이

Seung__ 2021. 10. 9. 12:41

1. 현상


  • 댓글이 있는 글을 삭제하려고 시도하면 에러가 발생한다.

  • Referential integrity constraint violation 예외가 발생한다.
    • Referential integrity constraint violations는 참조 무결성 제약조건 위반을 말한다.
    • Comment(N)와 Post(1)의 연관관계는 Comment가 연관관계의 주인이다.
    • 따라서 COMMENT에서 POST의 PK를 FK로 가지고 있다.
    • log를 보면 FK에서 문제가 발생했고, 해당 예외는 FK를 참조할 수가 없어서 발생한 문제이다.
    • 현제 Post 삭제 로직은 post(1)만 삭제하지 연관관계에 있는 coment(N)를 삭제하지 않는다.
    • 따라서 comment입장에서는 post가 삭제되면 가지고 있는 FK로 참조할 데이터가 없는것..
org.h2.jdbc.JdbcSQLIntegrityConstraintViolationException:
Referential integrity constraint violation:
"FKS1SLVNKUEMJSQ2KJ4H3VHX7I1:
PUBLIC.COMMENT FOREIGN KEY(POST_ID) REFERENCES PUBLIC.POST(POST_ID) (2)";
SQL statement:
delete from post where post_id=? [23503-200]

 

 

2. 해결


  • Post 삭제 로직에 일일히 코드를 넣을 수 도 있지만 영속성 전이, 고아객체 제거를 활용해보자.
 

영속성 전이(CASCADE),고아 객체

1. 영속성 전이 : CASCADE 특정 엔티티를 영속 상태로 만들 때 연관된 엔티티도 함께 영속 상태로 만들고 싶을 때 사용 부모 엔티티를 저장할 때 자식 엔티티도 함께 저장. CASCADE를 사용하지 않으면

bsh-developer.tistory.com

  • 위 글을 참고하면 CASCADE를 사용할 수 있는 조건이 있다.
      • 게시판이랑, 첨부파일의 경로???? 관계에서 사용이 가능-> 관계 없음
      • 첨부파일 경로는 "한" 게시물에서만 관리됨.요런 경우 사용 가능 ->댓글을 한 게시물에만 관련있음.
      • 즉, CHILD가 여러 곳과 연관관계가 있는 경우는 사용하면 안됨.->댓글을 한 게시물에만 관련있음.
      • 즉, 라이프 사이클이 거의 같을 경우, 소유자가 하나일 경우에만 사용.->댓글을 한 게시물에만 관련있음.
  • 추가로 CASCADE에는 여러 방식이 있다.
    • 댓글을 소속된 글과 라이프사이클이 거의 같으니 ALL을 사용
ALL 모두 적용
PERSIST 영속
REMOVE 삭제
MERGE 병합
REFRESH REFRESH
DETACH DETACH
  • 고아객체 제거(OrphanRemoval)는 
    • orphanRemoval = true
    • fale가 기본값임.
    • 참조가 제거된 엔티티는 다른 곳에서 참조하지 않는 고아 객체로 보고 삭제하는 기능.
    • 참조하는 곳이 하나일 때 사용해야해. 당연!
    • 특정 엔티티가 개인 소유할 때 사용
    • 즉, @OneToOne, @OneToMany에서만 사용 가능
    • 참고로 개념적으로 부모를 제거하면 자식은 고아가 됨.
      따라서 고아 객체 제거 기능을 활성화 하면, 부모를 제거할 때 자식도 함께 제거된다.
      어? CascadeType.REMOVE랑 비슷하다.

 

3. 적용, Post


  • Comment와 연관관계 설정 시 cascade, orphanRemoval을 추가.
    @OneToMany(mappedBy = "post", cascade = CascadeType.ALL, orphanRemoval = true)
    @ToString.Exclude
    private List<Comment> comments = new ArrayList<>();

 

 

 

4. 결과


  • 8번 글을 삭제해보자

  • 성공!

 

 

5. 앞으로


  • est용 data 서버시작할 때 DB에 올리기
  • Listener
    • createdAt, updatedAt등
  • 게시글에 작성자 표시
  • view 정리
  • 게시글 검색
    • 검색 옵션 추가 : 작성자, 제목 구분
  • 영속성 전이 설정
  • 댓글 삭제 버튼
  • 대댓글
  • 검증 & 예외처리
    • 회원 가입시 필수 정보 지정.
    • 데이터 타입 지정
  • 인증처리
    • 로그인한 사용자만 글 & 댓글 작성 가능.
    • 본인이 작성한 글, 댓글만 삭제 가능
    • 관리자는 모든 권한
  • 예외처리
  • 페이징 처리
  • 컬렉션 조회 최적화

 

5. GitHub: 211009 post & comment, cascade, orphanRemoval


 

GitHub - bsh6463/blog

Contribute to bsh6463/blog development by creating an account on GitHub.

github.com

 

'Project > 블로그 게시판 만들기' 카테고리의 다른 글

댓글 삭제버튼 추가  (0) 2021.10.09
회원 탈퇴하기  (0) 2021.10.09
검색기능 추가 및 view 정비  (0) 2021.10.09
Listener, Formatter 사용  (0) 2021.10.07
글 상세 페이지에 작성자 추가  (0) 2021.10.07
Comments