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

김민지님의 프로필 이미지

작성한 질문수

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

일대다 [1:N]

@joincolumn name 속성

22.03.18 16:35 작성

·

791

1

1. team에서는 멤버변수가 member클래스고 joincolumn의 name속성은 team_id잖아요 
@joincolumn(name = "team_id")

private List<Member> members = new ArrayList<>();

왜 member_id가 아니라 team_id인건가요?

답변 4

2

David님의 프로필 이미지

2022. 03. 20. 01:13

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

@JoinColumn은 외래키 매핑을 위한 것입니다.

데이터베이스에서 외래키는 다(N)에 생성됩니다.

Team(1)의 입장에서 멤버를 참조하기 위해 외래키를 매핑하려면 무조건 데이터베이스 상에서 Member (N)테이블에 생성된 외래키 칼럼을 바라볼 수 밖에 없습니다. 외래키는 다(N)에 생성되기 때문입니다.

따라서, 데이터베이스 상에서 Member 테이블의 외래키 칼럼의 값은 team의 id가 됩니다. 그러므로 객체 상에서 Team의 members를 @JoinColumn(name="team_id")로 매핑해준 것입니다.

감사합니다.

1

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

2022. 03. 21. 16:54

member가 다 인데 조인컬럼은 다쪽에 있어야하는거 아닌가요? 왜 일쪽에 조인컬럼이 있는거죠?

David님의 프로필 이미지

2022. 03. 21. 17:00

일대다 단방향(Team -> Member)이라서 그렇습니다.

강의에서 언급되는 그림을 살펴봐주세요.

0

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

2022. 03. 22. 18:17

저 team_id는 members의 team_id를 말하는건가요?
그니까

@OneToMany
@JoinColumn(name = "team_id")
private List<Member> members = new ArrayList<>();

이 코드에서 joincolumn이 외래키 이름을 team_id로하겠다인거잖아요 근데 이 team_id는 
team클래스에 있는 team_id여야맞지 않나요..? 연관관계의 주인이 fk를 가지고 있으니까요 그런데

 

여기선 fk를 child가 가지고있어야하는데 parent_id라는 필드가 여기에 없잖아요
parent로 가면 id의 column명을 제가 @column(name = "parent_id")로해줄거라 그 필드가 있는데 말이죠..


1. parent_id라는것은 어디서 나오는 이름인거죠? 그냥제가 a라고 설정하면 알아서 

아래 변수의 id값을 fk이름이 a인 컬럼에 매핑해주는건가요?
아니면 parent의 id에 @Column(name = "parent_id")로 설정이 되어있어서

조인컬럼을 한다는것은 그 어노테이션이붙은 멤버변수에 해당 name을 가진 필드를 찾아서 그 필드랑
멤버변수를 매핑시켜준다는의미인건가요?

David님의 프로필 이미지

2022. 03. 22. 19:35

joincolumn의 name 속성의 값이 fk 컬럼의 이름이 됩니다.

올려주신 코드대로라면 child 테이블에 parent_id라는 fk칼럼이 생깁니다.

 

아래 변수의 id값을 fk이름이 a인 컬럼에 매핑해주는건가요?

=> 맞습니다.

0

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

2022. 03. 21. 17:31

1. 연관관계의 주인이 일에 있냐 다에 있냐로 일대다 다대일을 나누는건가요?

2. 연관관계주인이 일에 있다는 얘기가 

일에 대한 클래스에 멤버변수로 다가들어간걸 말하는건가요?
3. joincolumn의 name엔 매핑할 외래키가 들어가야하는거아닌가요?? 헷갈려요.. 매핑할 외래키면.. members에 있는.. members_id여야하는거아닌가요

 

David님의 프로필 이미지

2022. 03. 21. 21:52

1. 네, 맞습니다.

2. 네, 맞습니다.

3. 네, 헷갈리는 게 맞습니다. JPA에서 연관관계와 연관관계의 주인을 이해하는 게 난이도가 있습니다. 따라서, 헷갈리신다면 강의를 반복하여 들으시면서 코드를 작성해보시는 수 밖엔 없습니다.

데이터베이스를 기준으로 Team과 Member는 어떤 값을 가지고 서로 연관관계를 인식하나요? Team의 Id입니다. 따라서, 외래키로 매핑되는 대상이 Member 테이블의 Team Id가 되는 것입니다.