인프런 커뮤니티 질문&답변

이남규님의 프로필 이미지

작성한 질문수

자바 ORM 표준 JPA 프로그래밍 - 기본편

일대일 [1:1]

OneToOne 매핑에서 Unique constraint와 Soft delete

21.06.11 23:31 작성

·

602

0

안녕하세요, 김영한 강사님.

일대일 관계에서 DB에 Unique constraint를 걸어준다는 것에는 공감이 되었습니다.

그런데 저번 강의 어떤 질문에서, 실무에서는 데이터 이력 유지를 위해 deleted를 나타내는 컬럼을 추가하여 활용한다고 말씀하신걸 봤는데,

이 경우 만약 Member의 기존 Locker가 삭제되어야하고, 새로운 Locker를 매핑해주어야 한다면, memberId에 걸린 Unique constraint에 의해 새로운 Locker 추가가 불가능한것이 아닌가 생각이 들었습니다.

짧은 검색을 통해 제약조건을 deleted = false인 컬럼에만 걸수 있는 방법이 있다는 것을 알았는데요,

실무에서도 이렇게 사용하시는지, 다른 방법이 있을지 궁금합니다.

감사합니다.

답변 2

2

김영한님의 프로필 이미지
김영한
지식공유자

2021. 06. 11. 23:50

안녕하세요. 남규님^^

이 경우 @OneToOne을 사용하시면 안됩니다.

그리고 @Where(deleted = false) 아마 이 기능을 말씀하시는 것 같은데, 이 기능은 권장하지 않습니다. 왜냐하면 어떤 경우에는 정말 삭제된 내용을 조회해야 할 수도 있거든요.

감사합니다.

0

이남규님의 프로필 이미지
이남규
질문자

2021. 06. 12. 00:07

안녕하세요, 강사님! 늦은 시간에도 답변 감사드립니다.

혹시 @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

제가 질문을 자세히 말씀 못드렸던 것 같은데, 혹시 제 궁금증이 전달이 되었을까요!

김영한님의 프로필 이미지
김영한
지식공유자

2021. 06. 13. 17:09

네 남규님 질문을 이해했습니다. 아쉽지만 데이터베이스에서 해당 기능을 지원하지는 않습니다.

Unique 제약조건은 해당 컬럼에 모두 적용됩니다. 부분 적용할 수 없습니다.

감사합니다.

이남규님의 프로필 이미지
이남규
질문자

2021. 06. 13. 18:24

답변 감사드립니다!