인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

오리쉐리님의 프로필 이미지

작성한 질문수

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

일대다 [1:N]

MEMBER테이블에 TEAM_ID컬럼이 생기는 이유

작성

·

47

0

일대다 단방향 연관관계에서,

@Entity

public class Member {

@Id @GeneratedValue

@Column(name = "MEMBER_ID")

private Long id;

@Column(name = "USERNAME")

private String name;

... getter and setter

}

@Entity

public class Team {

@Id @GeneratedValue

@Column(name = "TEAM_ID")

private Long id;

private String name;

@OneToMany

@JoinColumn(name = "TEAM_ID")

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

 

... getter and setter

}

Member member = new Member();

member.setName("member1");

em.persist(member);

Team team = new Team();

team.setName("teamA");

team.getMembers().add(member);

em.persist(team);

 

1-1. @OneToMany @JoinColumn(name = "TEAM_ID") private List<Member> members = new ArrayList<>();를 통해 MEMBER테이블에 TEAM_ID컬럼이 생기는거 같은데, 다른 여러 테이블도 있다고 가정했을때 어떤 이유로 MEMBER테이블에 TEAM_ID컬럼이 생성되는것인가요? @JoinColumn(name = "TEAM_ID")만 보고 MEMBER테이블인지 어떻게 아는것인가요..? List<Member> members 에서 Member라고 지정해줬기때문에 MEMBER테이블에 TEAM_ID컬럼이 생기는것인가요?

 

1-2 @OneToMany와 @JoinColumn을 통해 일대다 단방향 연관관계나 일대다 양방향 연관관계를 하게되면 무조건 다쪽 테이블에 외래키 컬럼이 추가되는건가요??

답변 1

1

인프런 AI 인턴님의 프로필 이미지

안녕하세요, 인프런 AI 인턴입니다. 오리쉐리님.

JPA에서 @OneToMany@JoinColumn을 사용하여 일대다 연관관계를 매핑하게 되면, 실질적으로 JPA는 두 엔티티 간의 관계를 관리하기 위해 외래 키(Foreign Key)를 생성하게 됩니다. 아래에서는 질문하신 사항에 대한 답변을 드리겠습니다.

1-1. @OneToMany@JoinColumn(name = "TEAM_ID")를 지정하면 List<Member> members에서 Member 엔티티와의 관계를 지정하고 있습니다. 따라서 JPA는 특정 팀의 멤버들을 연관시키기 위해 MEMBER 테이블에 TEAM_ID라는 외래 키 컬럼을 자동으로 생성합니다. 이는 JPA가 List<Member> 타입의 컬렉션이 연관된 엔티티 Member를 지칭한다는 것을 알기 때문입니다. 기본적으로, JPA는 연관된 엔티티 타입과 @JoinColumn에서 지정한 컬럼 이름을 바탕으로 외래 키를 생성하게 됩니다.

1-2. 네, @OneToMany@JoinColumn을 이용한 연관관계 매핑에서는 다인 엔티티 쪽에 외래 키가 추가되는 방식으로 매핑이 이루어집니다. 이는 JPA가 자동으로 연관 관계를 효율적으로 관리하기 위한 기본 메커니즘입니다. 따라서 일대다 단방향, 양방향 연관관계의 경우, 항상 다(N) 쪽 테이블에 외래 키 컬럼이 추가되어 관계를 설정합니다.

관련해서 더 자세히 알고 싶으시면 아래 링크를 참고해 주세요.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.