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

kate님의 프로필 이미지
kate

작성한 질문수

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

다대일 [N:1]

Many To One 매핑시 JoinColumn을 무조건 대상테이블의 PK로만 걸어야하는지

작성

·

321

·

수정됨

0

Many 쪽에서 One쪽으로 @JoinColumn을 지정하게되면 그 컬럼은 곧 FK로 사용되는데
ID값이 아닌 다른 Unique한 컬럼을 참조하고 싶다면 대체하여도 상관없을까요???

예를들어, 게시판에서 글 작성자를 출력한다고 가정합니다.
우선적으로 필요한 값은 Nickname하나뿐입니다.

User테이블에는 PK값이 자동증가값과 같은 의미없는 고유번호로 부여하고 있다고 가정합니다.

Board테이블에서 User테이블의 고유값 PK가 아닌 Nickname의 값만 가져오고 싶고, 해당 값은 중복이 불가능한 Unique한 값이라면
PK값이 아닌 해당 값에 걸어도 무방한지요?

만약 게시판에서 닉네임뿐만 아니라 닉네임을 눌렀을때 해당 User의 다양한 정보를 얻기 위하면 PK를 가져오는게 맞다고 생각합니다.
하지만 게시판에 User의 PK값에 FK가 걸려있고(Mapping)
Board에서 참조하려는 값이 '단순히 닉네임 단 하나'라고 한다면 PK값을 기준으로 닉네임을 다시 한번 조회해야 하기 때문에 불필요한 쿼리가 발생한다고 생각이 듭니다

물론 닉네임으로 매핑을 하더라도 Unique한 특성때문에 닉네임 기준으로 User의 정보를 조회할 수는 있겠으나
Board테이블로부터 테이블이 지속적으로 확장되어 나가고 해당 테이블에 User의 PK가 식별관계로 상속되어나간다면 데이터베이스의 PK의 역할로 볼때는 PK로 지정해주는게 맞다고는 생각합니다...

위와같이 매핑되는 FK대상 JoinColumn 필드를 비즈니스적 측면에서 유도리있게 설정해도 무관할까요?

답변 1

0

안녕하세요, 인프런 AI 인턴이에요. ManyToOne 매핑에서 @JoinColumn을 사용할 때, 무조건 대상 테이블의 PK로만 걸어야 하는 것은 아닙니다. 실제로 FK로 사용할 컬럼은 참조하고자 하는 값이 Unique하다면 다른 Unique한 컬럼을 지정할 수 있습니다.

예를 들어 게시판에서 글 작성자를 출력하는데 닉네임을 사용하고자 한다면, User 테이블의 PK인 고유번호 대신 Unique한 닉네임 컬럼을 참조할 수 있습니다. 이렇게 하면 게시판에서 매핑된 닉네임 값만 가져올 수 있습니다.

하지만, 닉네임을 클릭했을 때 해당 User의 다양한 정보를 얻기 위해서는 PK 값을 가져오는 것이 더 적합할 수 있습니다. 이 경우에는 게시판에서 User의 PK 값을 참조하도록 매핑을 해야 합니다.

더불어, 게시판에서 User의 PK값에 FK가 걸려있는데 닉네임 하나만을 참조하고자 한다면, 닉네임을 기준으로 다시 한번 조회하는 것이 필요하며, 이로 인해 불필요한 쿼리가 발생할 수 있습니다. 따라서 DB 조회 성능 등을 고려하여 어떤 값을 참조할지 결정하셔야 합니다.

요약하자면, ManyToOne 매핑에서 @JoinColumn을 사용할 때, 대상 테이블의 PK 이외의 Unique한 컬럼을 참조할 수 있습니다. 그러나 어떤 값을 참조하는 것이 적합한지는 사용자의 요구사항과 DB 성능 등을 고려하여 결정해야 합니다. 추가로 궁금한 점이 있으시면 언제든지 물어보세요!

kate님의 프로필 이미지
kate

작성한 질문수

질문하기