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

카도아보님의 프로필 이미지

작성한 질문수

실전! 스프링 부트와 JPA 활용1 - 웹 애플리케이션 개발

엔티티 클래스 개발1

MEMBER -ORDER 테이블 에서 JoinColumn 에 관련

작성

·

100

0

Member.java

@OneToMany
@JoinColumn(name="member")
private List<Order> orders = new ArrayList<>();

Order.java

@ManyToOne
@JoinColumn(name="member_id") //맵핑할 컬럼
private Member member;

Member 의 joinColumn 은 member 객체 자체이고

Order의 joinColumn은 db의 컬럼 명인데

member 의 joinColumn 을 member_id, 즉 db의 컬럼명으로 또는 그냥 id 라고 하면 안되나요? 안된다면 이유도 알려주시면 감사하겠습니다!!

답변 2

0

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

안녕하세요. 카도아보님

이 부분을 자세히 이해하려면 연관관계 매핑이라는 JPA의 기본을 학습하셔야 합니다.

이 부분은 JPA 기본편을 학습하시면 연관관계 매핑에 대한 전반을 이해하실 수 있을거에요.

감사합니다.

0

안녕하세요, 인프런 AI 인턴입니다.

@JoinColumn을 사용하는 경우, name 속성은 실제 데이터베이스 컬럼 이름을 지정하는 용도로 사용됩니다. @ManyToOne이나 @OneToMany와 같은 관계 매핑에서 @JoinColumnname 속성을 사용하여 외래 키(foreign key)의 이름을 지정합니다.

Member 클래스에서 @OneToMany 관계를 맺고 있는 orders 필드에 @JoinColumn(name="member")라고 지정하셨는데, 이는 Order 테이블에 member라는 컬럼이 외래 키로 사용됨을 의미합니다. 하지만, 일반적으로 @OneToMany 관계에서는 @JoinColumn을 사용하지 않는 것이 좋습니다. 왜냐하면 @OneToMany 관계에서 @JoinColumn을 직접 사용하면, 관리해야 하는 외래 키가 여러 개가 될 수 있기 때문입니다. 대신 @OneToMany 관계는 mappedBy 속성을 사용하여 양방향 관계의 소유측이 어디인지를 명시하는 것이 일반적입니다.

Order 클래스에서는 @ManyToOne 관계를 맺기 위해 @JoinColumn(name="member_id")를 사용하여, MemberOrder를 연결하는 외래 키 컬럼으로 member_id를 명시적으로 지정하고 있습니다. 이 경우는 올바른 사용 방법입니다.

따라서, Member 클래스에서 @JoinColumn을 사용하는 대신 @OneToMany(mappedBy="member") 같은 형태로 Order 클래스에서 Member를 참조하는 필드 이름을 mappedBy 속성으로 지정해 주어야 합니다. 이렇게 하면 Order 테이블의 member_id 컬럼을 통해 MemberOrder가 연결되며, JPA가 관계를 올바르게 관리할 수 있게 됩니다.

@OneToMany(mappedBy="member")
private List<Order> orders = new ArrayList<>();

본문에서 언급하신 @JoinColumn(name="member_id")Member 클래스에 직접 사용하는 것은 데이터베이스 설계와 JPA 매핑 전략에 따라 다를 수 있으나, 일반적인 사용 패턴은 위에서 설명한 대로 @OneToMany 관계에서는 mappedBy 속성을 사용하는 것입니다.