인프런 커뮤니티 질문&답변
OneToOne 매핑에서 Unique constraint와 Soft delete
작성
·
736
0
안녕하세요, 김영한 강사님.
일대일 관계에서 DB에 Unique constraint를 걸어준다는 것에는 공감이 되었습니다.
그런데 저번 강의 어떤 질문에서, 실무에서는 데이터 이력 유지를 위해 deleted를 나타내는 컬럼을 추가하여 활용한다고 말씀하신걸 봤는데,
이 경우 만약 Member의 기존 Locker가 삭제되어야하고, 새로운 Locker를 매핑해주어야 한다면, memberId에 걸린 Unique constraint에 의해 새로운 Locker 추가가 불가능한것이 아닌가 생각이 들었습니다.
짧은 검색을 통해 제약조건을 deleted = false인 컬럼에만 걸수 있는 방법이 있다는 것을 알았는데요,
실무에서도 이렇게 사용하시는지, 다른 방법이 있을지 궁금합니다.
감사합니다.
퀴즈
양방향 연관관계 매핑 시, 데이터베이스 외래 키를 주로 관리하는 쪽은 어느 쪽일까요?
연관관계 주인
연관관계 주인이 아닌 쪽
N에 해당하는 쪽
1에 해당하는 쪽
답변 2
2
안녕하세요. 남규님^^
이 경우 @OneToOne을 사용하시면 안됩니다.
그리고 @Where(deleted = false) 아마 이 기능을 말씀하시는 것 같은데, 이 기능은 권장하지 않습니다. 왜냐하면 어떤 경우에는 정말 삭제된 내용을 조회해야 할 수도 있거든요.
감사합니다.
0
안녕하세요, 강사님! 늦은 시간에도 답변 감사드립니다.
혹시 @OneToOne을 사용하면 안된다는 것이 Member - One to Many - Locker 관계로 바꾸어서
Member에 List<Locker> 로 매핑이 되고, 그 안에는 deleted = true인 것들과 delete = false 인 것들이 매핑되어야 한다는 말씀이신가요? 잘 이해가 되지 않습니다 ㅠㅠ
질문의 요지는 OneToOne관계, FK에 Unique Constraint, Soft Delete 세 가지를 모두 적용할 수 있는 방법이 있는지 궁금했습니다!
검색해서 delete = false 인 것들에만 제약조건을 걸수 있다는 것을 말씀드린건, @Where 어노테이션을 말씀드린건 아니고 SQL문을 통해 제약조건 추가시에 Where delete = 0 구문을 추가하여
"delete = 0 인 row에 대해서만 memberId가 Unique하다" 라는 조건을 추가하는 방법을 혹시 사용하시는지 여쭤본것이었습니다. 예를들면 아래와 같이요,
CREATE UNIQUE INDEX memberId_index
ON locker (memberId)
WHERE IsDeleted = 0
제가 질문을 자세히 말씀 못드렸던 것 같은데, 혹시 제 궁금증이 전달이 되었을까요!






네 남규님 질문을 이해했습니다. 아쉽지만 데이터베이스에서 해당 기능을 지원하지는 않습니다.
Unique 제약조건은 해당 컬럼에 모두 적용됩니다. 부분 적용할 수 없습니다.
감사합니다.