Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- JDBC
- Proxy
- http
- 자바
- Spring Boot
- Servlet
- 인프런
- transaction
- jpa
- QueryDSL
- JPQL
- db
- Greedy
- 백준
- Exception
- kotlin
- 그리디
- pointcut
- springdatajpa
- SpringBoot
- AOP
- 스프링 핵심 기능
- 스프링
- Android
- spring
- java
- 김영한
- 알고리즘
- 스프링 핵심 원리
- Thymeleaf
Archives
- Today
- Total
개발자되기 프로젝트
글 삭제하기, cascade, orphanRemoval, 영속성 전이 본문
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를 사용할 수 있는 조건이 있다.
-
- 게시판이랑, 첨부파일의 경로???? 관계에서 사용이 가능-> 관계 없음
- 첨부파일 경로는 "한" 게시물에서만 관리됨.요런 경우 사용 가능 ->댓글을 한 게시물에만 관련있음.
- 즉, 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
'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