1️⃣ 일정 삭제하기 중 DataIntegrityViolationException 오류
PPT를 제작하기 위해 기능들에 대한 화면 캡쳐를 하는데 일정 삭제에서 오류가 났다.
뭐지?!
일정 삭제 기능을 구현 완료 했을 때에는 분명 잘 됐었는데...
오류 창을 읽어보니
회원 탈퇴에서의 오류에서 봤던 것 같았다.
이래서 오류가 뭔지 해석하고, 원인을 알아보고, 해결하고 또 기록하는 과정이 중요하구나..를 새삼 느꼈다.
원인)
어찌됐든 원인은 무결성 제약 조건 위반이었다.
일정 삭제 구현 완료 했을 때에는 상세 일정 보기를 구현하기 전이라 travel 테이블만 관련있었는데 지금은 상세 일정 보기 기능 구현을 위해 plan 테이블에서 자식 레코드가 발견되어 외래 키 제약 조건에 위반 되었다는 것이다!
해결 방법)
1. 트랜잭션 사용 👉 여러 데이터베이스 작업을 하나의 논리적 작업 단위로 묶는 데 사용된다. 롤백을 허용하여 데이터 일관성 및 무결성을 유지하며, 동시성 문제를 해결하는 데 중요하다.
2. 외래 키 제약 조건에 대한 삭제 작업을 조정하는 것 ( ㅣ을 사용하여 부모 레코드가 삭제될 때 자식 레코드도 함께 삭제하게 하는 것) 👉 데이터의 일관성을 유지하고 데이터 불일치를 방지하는 데 사용된다. 데이터베이스의 무결성을 강화하기 위한 좋은 방법이다.
해결)
회원 탈퇴 구현에서 트랜잭션을 사용해봤기 때문에 일정 삭제 구현은 CASCADE로 해결해보기로 한다.
✅ 테이블이 이미 형성된 상태이기 때문에 ALTER TABLE 문을 사용하여 외래 키(Foreign Key) 제약을 수정해야 한다.
Oracle Database에서 테이블에 이미 데이터가 존재하고 있는 경우, 외래 키(Foreign Key) 제약에 ON DELETE CASCADE를 적용하려면 다음 SQL문을 써서 먼저 외래 키 제약을 삭제해야한다.
ALTER TABLE 테이블명
DROP CONSTRAINT 외래키제약이름;
✅ 그 다음 새로운 외래 키 제약을 추가해야 한다.
ALTER TABLE 테이블명
ADD CONSTRAINT 외래키제약이름
FOREIGN KEY (컬럼명) REFERENCES 참조테이블명(참조컬럼)
ON DELETE CASCADE;
- ALTER TABLE plan: "plan" 테이블에 대한 변경 작업을 시작
- ADD CONSTRAINT FK_TRAVEL_TO_PLAN_1: "FK_TRAVEL_TO_PLAN_1"이라는 이름의 새로운 외래 키 제약 조건을 추가. 이 이름은 고유해야 한다.
- FOREIGN KEY (travelID): "travelID" 열을 외래 키로 지정. 이 열은 "plan" 테이블의 외래 키 열로 사용된다.
- REFERENCES travel(travelID): 이 부분에서 "travelID" 열은 "travel" 테이블의 "travelID" 열을 참조하게 된다. 즉, "plan" 테이블의 "travelID" 열은 "travel" 테이블의 "travelID" 열과 관련이 있으며 이것이 외래 키 관계를 정의한다.
- ON DELETE CASCADE: 이 부분은 외래 키 제약 조건에 대한 삭제 동작을 정의한다. ON DELETE CASCADE를 사용하면 "travel" 테이블에서 행이 삭제될 때 "plan" 테이블에서 해당 "travelID"를 참조하는 모든 행도 자동으로 삭제된다.
이렇게 설정하면 "travel" 테이블의 여행 정보가 삭제되면 해당 여행과 관련된 "plan" 정보도 자동으로 삭제된다.
commit까지 해주는 점 잊지말자!
이렇게 해주었더니 일정 삭제 프로세스가 문제 없이 실행되는 것을 볼 수 있었다.
'Project 여담 > 5주차' 카테고리의 다른 글
11/05 : interceptor와 filter를 알아보자 (0) | 2023.11.05 |
---|---|
11/04 : 3번째 멘토링 / 중간점검 (0) | 2023.11.05 |
11/02 : 일정 상세보기 지도에 인포윈도우 추가 (0) | 2023.11.02 |
11/01 : 일정 상세보기 kakao map api와 DB 연동해 마커 찍기 (0) | 2023.11.01 |
10/31 : 일정 상세보기 로직 구현 (0) | 2023.10.31 |