계정 삭제 기능 개발 중 마주친 외래키 제약 조건 이슈

oversleep·2025년 2월 14일
0

troubleshooting

목록 보기
2/19
post-thumbnail

발생한 상황

계정 삭제 기능을 개발하던 중, 스웨거를 통해 API 테스트를 진행하였습니다.
테스트 결과 예상치 못한 409 상태 코드와 함께 다음과 같은 에러 메시지를 받았습니다.

{
  "message": "DataIntegrityViolationException: PreparedStatementCallback; SQL [DELETE FROM users WHERE id = ?]; Cannot delete or update a parent row: a foreign key constraint fails (`pickup_db`.`match`, CONSTRAINT `match_ibfk_1` FOREIGN KEY (`host_id`) REFERENCES `users` (`id`))",
  "status": 409
}

원인 분석

이 에러는 데이터베이스의 외래키(Foreign Key) 제약조건으로 인해 발생했습니다.

구체적으로:

  1. users 테이블과 match 테이블이 외래키로 연결되어 있음
  2. match 테이블의 host_id가 users 테이블의 id를 참조
  3. 삭제하려는 사용자가 생성한 매치 데이터가 존재
  4. 참조되고 있는 사용자 데이터를 직접 삭제할 수 없는 상황

데이터베이스 키(Key) 개념 이해하기

Primary Key - 기본 키(PK)

  • 테이블의 각 행을 고유하게 식별하는 키
  • 중복될 수 없고 NULL 값을 가질 수 없음
  • 예: users 테이블의 id - 각 사용자를 구분하는 고유 식별자

Foreign Key - 외래 키(FK)

  • 다른 테이블의 Primary Key를 참조하는 키
  • 테이블 간의 관계를 정의하는 데 사용
  • 예: match 테이블의 host_id - users 테이블의 id를 참조하여 매치를 생성한 사용자를 지정

해결 방안

현재 고려할 수 있는 해결 방안은 두 가지:

1. CASCADE 방식 (백엔드/DB 영역)

ALTER TABLE match
ADD CONSTRAINT match_ibfk_1
FOREIGN KEY (host_id) REFERENCES users (id)
ON DELETE CASCADE;
  • 사용자 삭제 시 관련된 매치 데이터도 자동 삭제
  • 데이터베이스 레벨에서 처리되므로 프론트엔드 로직 수정 불필요

2. 순차적 삭제 방식 (백엔드 영역)

async function deleteAccount(userId: string) {
  // 1. 사용자가 생성한 매치 데이터 삭제
  // 2. 사용자 데이터 삭제
  // 3. 결과 반환
}

현재 진행 상황

  1. 백엔드 팀에 현재 상황 전달

    • 외래키 제약조건으로 인한 삭제 불가 상황 공유
    • 회원 탈퇴 시 관련 데이터 일괄 처리 요청
  2. 프론트엔드 처리 방향

    • 백엔드에서 데이터 일괄 처리하는 방식 채택 예정
    • 프론트엔드는 API 호출 및 결과 처리에만 집중

배운 점

  1. 데이터베이스 관계의 중요성

    • 테이블 간의 관계가 실제 기능 구현에 미치는 영향
    • 외래키 제약조건의 실제 동작 방식
  2. 프론트엔드와 백엔드의 역할 분담

    • 데이터 정합성은 백엔드에서 보장하는 것이 안전
    • 프론트엔드는 사용자 인터페이스와 상호작용에 집중

앞으로 해야 할 일

  1. 백엔드 팀의 해결 방안 확인
  2. 선택된 방식에 따른 프론트엔드 로직 수정
  3. 예외 처리 및 사용자 피드백 추가

이 이슈를 통해 프론트엔드 개발자도 데이터베이스 구조와 제약조건에 대한 기본적인 이해가 필요하다는 것을 다시 한번 깨달았습니다.

profile
궁금한 것, 했던 것, 시행착오 그리고 기억하고 싶은 것들을 기록합니다.

0개의 댓글