꽤 오랜만에 JPA를 사용하는 프로젝트를 진행중인데

얼마나 시간이 지났다고 연관관계 mapping하는 방법이 가물가물하다; (예전에 그렇게 학을 떼어놓고는..)

살짝 헷가리는 어노테이션 정리하고 렛츠고!

 

mappedBy와 @JoinColumn은 JPA에서 엔티티 간 관계를 매핑할 때 사용하는 어노테이션입니다.

둘 다 관계 매핑에 필요한 정보를 제공하고 있지만, 다음과 같은 차이가 있습니다.

  • mappedBy: 양방향 관계에서 "다(N)" 쪽의 엔티티에서 사용되며, "일(1)" 쪽의 엔티티에 대한 매핑 정보를 지정합니다. 이를 통해 연관된 엔티티 사이에 양방향 참조를 설정할 수 있습니다.
  • @JoinColumn: "일(1)" 쪽의 엔티티에서 사용되며, 조인 컬럼 이름을 지정하여 연관된 엔티티의 외래 키 컬럼을 매핑합니다. 이를 통해 단방향 관계에서 연관된 엔티티의 외래 키를 지정할 수 있습니다.

즉, mappedBy는 양방향 관계에서만 사용되며, 연관된 엔티티 사이의 관계를 맺을 때 사용하고, @JoinColumn은 단방향 관계에서도 사용 가능하며, 외래 키 매핑에 사용됩니다.

그러나 두 어노테이션은 함께 사용되기도 합니다. 예를 들어, @ManyToOne으로 매핑된 엔티티 클래스에서 @JoinColumn 어노테이션을 사용하여 조인 컬럼을 지정하면, 이에 대응하는 @OneToMany으로 매핑된 엔티티 클래스에서는 mappedBy를 사용하여 역방향 참조를 설정하는 경우가 많습니다.

 

예를 들어, Team과 Member가 일대다 관계를 가지고 있다고 가정해봅시다. 이때 Team엔티티에서 Member엔티티의 리스트를 매핑하고, Member엔티티에서는 Team엔티티와의 관계를 역방향 매핑하려면 다음과 같이 mappedBy를 사용할 수 있습니다.

@Entity
public class Member {
    @Id
    @Column(name = "MEMBER_ID")
    private String id;

    @ManyToOne
    @JoinColumn(name = "TEAM_ID")
    private Team team;
    
    // getters, setters
}

@Entity
public class Team {
    @Id
    @Column(name = "TEAM_ID")
    private Long id;

    @OneToMany(mappedBy = "team")
    private List<Member> members = new ArrayList<>();
    
    // getters, setters
}

+ Recent posts