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

김태경님의 프로필 이미지
김태경

작성한 질문수

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

일대일 [1:1]

일대일 optional 여부에 따른 UNIQUE 제약

작성

·

426

3

안녕하세요! 강의를 너무나 잘 듣고 있습니다.

일대일 강의를 들으면서 이것저것 만져보다가 @OneToOne(optional=true) 인 경우에는 UNIQUE 제약이 걸리지 않고 반대로 false인 경우에는 UNIQUE 제약이 걸리는 것을 알게 되었습니다.

혹시 이렇게 구현된 이유가 무엇인지 알 수 있을까요?

답변 1

2

안녕하세요. 김태경님, 공식 서포터즈 David입니다.

optional 속성이 false일 경우 연관된 엔티티가 반드시 존재해야 합니다.

일대일 연관관계를 잘 생각해보면 A1 - BB, A2 - CC와 같이 각각 하나의 엔티티만 바라보아야 합니다.

만약 A1 - BB , A2 - BB 와 같이 엔티티가 중복 참조되고 있다면 일대일 관계가 아니게 됩니다.

따라서, false의 경우 연관된 엔티티가 반드시 존재해야 하고, 이때 엔티티가 중복 참조되면 안되므로 유니크 제약조건을 추가하게 되는 것입니다.

일대일 관계를 키워드로 검색하셔서 학습하시면 좋을 것 같습니다:)

감사합니다.

김태경님의 프로필 이미지
김태경
질문자

늦은 시간에 친절한 답변 감사합니다.

그럼 혹시 optional = true인 경우에는 어째서 UNIQUE 제약을 걸지 않는 걸까요? 말씀해주신 일대일 관계의 조건을 optional=true인 경우에도 지키도록 해야할텐데요.

optional 속성이 true라면 연관된 엔티티가 존재하지 않아도 됩니다. 그 반대인 false 값은 연관된 엔티티가 반드시 존재해야 합니다.

그렇다면 연관된 엔티티가 존재하지 않는 경우 null이 들어가게 될텐데, 유니크 제약조건의 경우 null 도 열(column)당 하나만 올 수 있습니다. (MSSQL 문서 참고) 이런 부분 때문에 optional이 true일 때 유니크 제약조건을 걸지 않도록 하는 것 같습니다.

김태경님의 프로필 이미지
김태경
질문자

MySQL의 경우 컬럼에 유니크 제약이 걸려있어도 다수의 null 값을 허용합니다.. (공식 docs)

그리고 이는 DBMS에 따라서 선택 가능한 선택적 기능입니다. 따라서 모든 DBMS가 그렇다고는 할 수 없네요. JPA가 nullable 선택지를 제공하면서 UNIQUE 제약 적용 방식을 범용성 있게 설계하기 위하여 이렇게 구현한 것인가 생각이 들긴 합니다.

덕분에 깊게 생각해 볼 수 있었습니다. 답변 감사합니다.

MySQL의 경우 다수의 null 값을 허용하는군요. 저는 MSSQL 문서를 참고했습니다.

유니크 제약조건에 의해 NULL도 하나만 들어오게 한다면 아래 문서에 나타난 케이스의 경우 대응할 방법이 마땅치 않아 보이네요. 말씀하신 부분에 공감합니다. 저도 하나 더 배우고 갑니다:)

https://zetawiki.com/wiki/UNIQUE_%EC%A1%B0%EA%B1%B4%EA%B3%BC_NULL_%ED%97%88%EC%9A%A9_%EC%A1%B0%EA%B1%B4%EC%9D%98_%EC%96%91%EB%A6%BD

김태경님의 프로필 이미지
김태경

작성한 질문수

질문하기