이론적으로 OneToOne 관계에서 소프트 삭제된 데이터가 있는 경우, 새로운 데이터를 삽입할 수 있어야 하는가?

왕감자·2025년 2월 24일

2025 내일배움캠프

목록 보기
32/39


ERROR: duplicate key value violates unique constraint "uk2ivyaatle6o0u2qqjc4rgw8hc"
Detail: Key (order_id)=(ead94ffd-0941-4bb7-939c-f0c859fd4ed4) already exists.
2025

org.postgresql.util.PSQLException: ERROR: duplicate key value violates unique constraint "uk2ivyaatle6o0u2qqjc4rgw8hc"
Detail: Key (order_id)=(ead94ffd-0941-4bb7-939c-f0c859fd4ed4) already exists.

👉 정답: 아니. @OneToOne 관계에 @JoinColumn(unique = true)가 적용되어 있으면 소프트 삭제된 데이터가 있어도 새로운 데이터 삽입이 불가능함.

🎯 이유 분석
현재 order_id 필드가 @OneToOne 관계 + @JoinColumn(unique = true)가 설정되어 있는 경우,
DB에서는 논리적으로 삭제된 데이터(deleted_at IS NOT NULL)도 여전히 같은 order_id를 갖고 있는 상태로 인식함.

즉,

JPA에서는 deleted_at IS NULL 조건으로 필터링할 수 있지만,
DB 차원에서는 소프트 삭제 여부를 알지 못하고, 단순히 order_id가 중복되는지 여부만 체크함.
order_id가 여전히 존재한다고 판단하여 유니크 제약 조건(23505) 위반 오류 발생.

💡 결론: DB 차원에서는 deleted_at IS NULL 조건을 고려하지 않기 때문에, OneToOne(unique = true) 관계가 유지되면서 중복 삽입이 불가능함.


🔍 DDL-AUTO 설정을 어떻게 해야 할까?
기존 @OneToOne → @ManyToOne으로 변경하는 경우, DB 스키마에 영향을 주므로 ddl-auto 설정을 신중하게 선택해야 함.

✅ 이 경우 적절한 설정
1. 데이터 손실 없이 기존 데이터 유지하면서 변경하려면:
→ ddl-auto: update

🔹 장점: 기존 데이터를 유지하면서 스키마를 변경 가능
🔹 단점: @OneToOne → @ManyToOne 변경 시 기존 유니크 제약 조건이 자동으로 제거되지 않을 수도 있음
🔹 추가 작업: DB에서 order_id의 유니크 제약 조건을 수동으로 삭제해야 할 수도 있음

  1. 기존 테이블 유지하고, 수동으로 변경할 계획이라면:
    → ddl-auto: none

🔹 장점: 애플리케이션이 자동으로 스키마를 변경하지 않음
🔹 단점: 직접 DB에서 order_id의 유니크 제약 조건을 제거하고 관계를 수정해야 함

✅ 추가로 해야 할 작업
✅ DB에서 기존 order_id의 유니크 제약 조건을 제거해야 함.
아래 SQL을 실행해서 직접 변경:

ALTER TABLE p_review DROP CONSTRAINT uk2ivyaatle6o0u2qqjc4rgw8hc; -- 기존 유니크 제약 조건 삭제

그리고, @ManyToOne으로 변경한 후 애플리케이션을 실행하면 됨.

0개의 댓글