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

햇병아리님의 프로필 이미지

작성한 질문수

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

실전 예제 3 - 다양한 연관관계 매핑

@JoinColumn 의 name, referencedColumnName 에 대해 질문 드립니다.

작성

·

11K

11

선생님  2가지 질문이 있습니다.

첫번째는 @JoinColumn 의 name 속성 사용방법에 대한 질문입니다.

@JoinColumn 의 name 속성을 사용하는 방법이 
여러가지가 있는거 같은데요.

1) 참조 하고자 하는 엔티티 클래스명 + _ + 엔티티 클래스 기본키 필드 이름

2) 참조 하고자 하는 엔티티 클래스의 필드명 + _ + 엔티티 클래스기본키 필드 이름

3) 현재 엔티티 클래스의 필드명 + _ + 참조하는 테이블의 기본키 컬럼명

수업중에 사용하신 코드에서 구체적예를 가져와봤습니다.

1 번 방법은 Order 엔티티에서 Member 엔티티를 매핑 한 부분에서 사용된 방법입니다. 

처음에는 Order 엔티티에서 매핑하는 MEMBER_ID 가 매핑하고자 하는 테이블의 컬럼명(Member 테이블의 MEMBER_ID 필드)이라고 생각했지만, 

Member 엔티티의 @Column(name = "MEMBER_ID") 부분을 제거하고 코드를 동작해도 데이터 입력처리가 되기 때문에

테이블 컬럼명이 아니라고 생각했습니다.

2번 방법의 경우, Category 엔티티에서 셀프 매핑(parent)을 할 때 사용하는 경우

3번 방법은 기본값(name 을 입력하지 않은 경우)

이렇게 사용할 수 있는 거 같은데, 맞나요.?

두번째는 @JoinColumn의 referencedColumnName 에 사용처에 관한 내용입니다.

위에서 제가 언급한 name 속성을 사용하는 방법 중에서 1번, 2번 같이 엔티티 클래스 필드 이름을 사용하여 매핑하는 방법을 사용하면,

외래키가 참조하는 대상 테이블의 컬럼명이 다르다 하더라도 referecedColumnName 을 사용안하고 매핑할 수 있는 거 같은데 맞을까요.?

제가 생각하는 것이 맞다면, referencedColumnName 을 사용 할 일이 거의 없을 꺼 같은데 추가적인 사용처가 있을지 궁금합니다.

 

답변 3

22

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

안녕하세요. 햇병아리님

예제로 설명드릴께요.

------------ 테이블 ------------

Member

- memberId(PK)

- teamId(FK)

Team

- teamId(PK)

------------- 객체 ----------------------

Member {

  @JoinColumn(name="teamId")

  Team team;

}

여기서 Member와 team이 연관관계가 있는데요. 여기서 @JoinColumn의 name은 FK 이름입니다.

이제 조인을 하려면 FK가 조인할 대상 테이블의 컬럼이 있어야겠지요? 이게 바로 referencedColumnName입니다.

그런데 referencedColumnName을 사용하지 않는 이유는 바로 referencedColumnName을 생략하면 대상 테이블의 PK로 자동 지정되기 때문입니다.

따라서 여기서는 Member.teamId(FK) -> Team.teamId(PK)를 조인하면서 연관관계가 처리됩니다.

referencedColumnName을 PK가 아닌 다른 컬럼에 직접 지정할 수도 있지만 정규화 관점에서 권장하지는 않습니다.

감사합니다.

13

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

네 JPA는 대상 테이블을 엔티티를 보고 인지합니다^^

다음의 경우 Team 객체가 매핑된 테이블이 대상 테이블이 되는 것이지요.

Member {

  @JoinColumn(name="teamId")

  Team team;

}

4

햇병아리님의 프로필 이미지
햇병아리
질문자

자세한 설명 감사합니다.

선생님, referencedColumnName 을 생략하면 대상 테이블의 pk로 자동 지정한다고 했는데,

JPA 는 대상테이블이 어떤것인지 어떻게 아는 것인가요.?

@JoinColumn 이 적용되는 필드 타입을 보고 판단한다고 생각하면 되나요.?