JPA에서 unique 속성을 사용하면 일어나는 일
이제까지 프로젝트를 진행하면서 어떤 컬럼의 값이 중복되는 것을 방지하기 위해 unique 속성을 즐겨 사용했었다.
하지만 이렇게 unique 속성을 사용했을 때 큰 단점이 하나 있다.
JPA에서 해당 컬럼에 대한 unique 제약조건을 만들어주기는하는데, 대신 제약조건의 이름이 랜덤으로 정해진다는 것이다.
아래 사진에서 빨간색으로 표시해둔 부분이 바로 제약조건의 이름이다.
제약조건 이름이 랜덤인게 뭐가 문제인가?
뭐가 문제인지 알고싶으면 직접 오류를 일으켜서 확인해보는게 확실하다.
postman을 사용해서 일부러 중복되는 email을 저장해보았다.
콘솔창도 확인해보자.
내용이 너무 길어서 일부만 캡쳐해왔다.
아래 빨간박스로 표시한 부분이 바로 JPA에서 랜덤으로 만들어준 제약조건의 이름이다!
지금은 우리가 어떤 컬럼에서 문제가 생겼는지 알고 있지만,
만약 아무것도 모르는 상황에서 저 문구를 마주한다면 '저게 뭐지?'하는 생각이 먼저 들지 않을까..
위 사진에서 보았듯이 제약 조건 위반 시 발생하는 오류 메세지에는 지정해둔 이름이 표시된다.
따라서 제약조건의 이름을 명확하게 지어두면 어떤 제약조건을 위배했는지 쉽게 파악할 수 있다.
제약조건의 이름을 지정하는 방법 - @uniqueConstraint
JPA에서 제약조건의 이름을 지정하려면 @uniqueConstraint를 사용하면 된다.
(※ @uniqueConstraint을 통해 제약조건에 이름을 지정하는 기능은 JPA 2.0 부터 지원한다.)
@uniqueConstraint는 '복합 유니크 제약 조건'을 정의하는데 사용된다.
하지만 어떻게 활용할지는 개인의 자유가 아닐까😋
[사용방법]
@Table(uniqueConstraints = {@uniqueConstraint(name = "제약조건 이름", columnNames={"컬럼명", "컬럼명"})})
실제 코드에도 적용해보자.
필자는 email 컬럼에만 unique 제약조건을 걸어보았다.
제약 조건의 이름은 "UniqueMemberEmail"로 정했다.
콘솔창에서도 랜덤값이 아닌 제대로 된 제약조건의 이름이 나오는 것을 확인할 수 있다.
오류를 일으키면 어떻게 나올까?
확인해보자.
아까와 같이 중복된 email을 저장하는 오류를 낸 뒤 콘솔창을 확인하면,
이번에는 제대로된 이름이 나오는 것을 확인할 수 있다.
이름 덕분에 어디가 문제인지 빠르게 파악이 가능하다.
이로써 제약 조건의 이름을 지정하는 것의 중요성과 그 방법에 대해 알아보았다.
앞서 설명한 것처럼 JPA에서 unique 제약 조건의 이름을 지정해주면 오류 메시지가 명확해져서 문제를 파악하기 쉬워진다. 이후 프로젝트를 진행할 때 이런 작은 부분도 신경 써서 코드의 가독성과 유지보수에 도움이 되도록 노력해야겠다.
[참고자료]