작성
·
857
0
[질문 내용]
안녕하세요.
개인 토이 프로젝트를 JPA를 활용하여 개발하다가 복합키와 관련하여 질문 드립니다.
현재 계좌라는 테이블에 1:N 매핑되어 거래 이력을 관리하는 이력 테이블을 설계했습니다. 해당 엔티티에 대한 기본키를 복합키로 설정했는데요. 식별관계 복합키로 계좌번호(FK)+거래날짜+시퀀스로 방향을 잡았습니다.
복합키 설정 중, 더 객체지향적인 방식이라는 @EmbeddedId 방식을 채택해서 사용했는데요. 복합키를 정의한 클래스의 필드에 시퀀스 필드에@GeneratedValue를 붙여 db에 저장될 시에 시퀀셜하게 번호가 채번될 거라고 생각했는데 결과는 널값이 들어 가더군요. 구글링을 해보니, 마찬가지 경우를 겪은 분들의 글을 보았고, @EmbeddedId 방식에서는 해당 @GeneratedValue를 사용 못한다는 것을 알게 되었습니다. 이에 대한 대안으로 다른 분들은 아예 복합키를 사용하지 않고, @GeneratedValue를 적용한 ID필드로 하나의 기본키를 두거나, 복합키의 또 다른 방법 중 하나인 @IdClass를 활용하고, @SequenceGenerator를 적용하여 시퀀스를 따로 관리해주는 식으로 하여 제가 처음 원하던대로 복합키에서도 시퀀스를 사용하는 것을 보았습니다.
질문은 실무에서는 이런 이력성 엔티티에 대해 어떤 방식은 사용하는지 궁금합니다. 사실 별도의 기본키 하나를 두고, 구현을 하자면.. 결과적으로 나중에 이력을 조회하고자 한다면 기본키가 아닌 값들로 조건을 줘서 쿼리가 나가게 될텐데.. DB 성능적인 부분에서 비효율적이지 않을까 싶고,,, @IdClass로 복합키를 설정하자니 이렇게 하는게 적절한 방법인가 싶습니다.
긴 질문 읽어주셔서 감사합니다!! :)
답변 2
0
안녕하세요. 정훈님
다음과 같은 선택이 있습니다.
1. 말씀하신 식별관계 + 복합키를 사용한다면 @GeneratedValue를 사용하지 못합니다. 대신에 직접 DB 시퀀스를 호출해서 그 값을 반영하면 됩니다.
2. @GeneratedValue만 사용한다면 새로운 키를 사용합니다. 그리고 조회를 위한 적절한 인덱스를 추가합니다.
전통적인 DBA라면 1번의 방법을 보통 선호하게 되지만, 저는 요구사항 변경의 유연성과 JPA 사용의 편의성 관점에서 2번의 방법을 더 선호합니다.
감사합니다.
0
안녕하세요, 인프런 AI 인턴이에요. 복합키와 관련해서 질문이 있으신 것 같네요. @GeneratedValue를 @EmbeddedId 방식에서 사용할 수 없다는 것을 알게 되었다고 말씀하셨는데요, 그렇습니다. @EmbeddedId로 사용하는 경우, 해당 클래스의 필드에 @GeneratedValue를 적용할 수 없습니다.
대안으로는 두 가지 방법을 제시할 수 있겠습니다. 첫 번째 방법은, 복합키 대신에 ID 필드를 추가해서 사용하는 방법입니다. 이 경우, @GeneratedValue를 사용하여 시퀀스 번호를 자동으로 채번할 수 있습니다.
두 번째 방법은, @IdClass를 활용하는 방법입니다. @IdClass를 사용하면 별도의 식별자 클래스를 만들어서 복합키를 관리할 수 있습니다. @SequenceGenerator를 적용해 시퀀스를 따로 관리해주면, 원하시는 대로 복합키에서도 시퀀스를 사용할 수 있습니다.
어떤 방법을 선택하실지는 상황과 선호도에 따라 다를 수 있습니다. 각 방법의 장단점을 고려하여 적절한 방식을 선택하시면 될 것 같습니다.
더 자세한 내용은 관련 문서나 JPA 관련 자료를 참고해보시는 것을 추천드립니다. 혹시 추가로 궁금한 점이 있으시다면 댓글로 알려주세요. 좋은 프로젝트 개발되시길 바라요! :)