웹 개발

JPA 연관관계 매핑 정리

Blue_bull 2025. 2. 25. 10:31

🔹 JPA 연관관계 매핑 정리

JPA에서 연관관계를 매핑하는 방식은 총 4가지입니다.


🏷️ 1. @OneToOne (1:1 관계)

  • 특징: 한 엔터티가 다른 엔터티와 1:1로 매핑되는 관계

  • 예제: 사용자(User)주소(Address)

  • 매핑 방법:

    @OneToOne
    @JoinColumn(name = "address_id") // FK 지정
    private Address address;
  • 설명: 한 사용자는 하나의 주소만 가질 수 있음 (예: 집 주소)


🏷️ 2. @ManyToOne (N:1 관계)

  • 특징: 여러 개의 엔터티가 하나의 엔터티와 매핑되는 관계

  • 예제: 장바구니(Cart)회원(Member)

  • 매핑 방법:

    @ManyToOne
    @JoinColumn(name = "member_id") // FK 지정
    private Member member;
  • 설명: 여러 개의 장바구니가 한 회원에게 속함


🏷️ 3. @OneToMany (1:N 관계)

  • 특징: 하나의 엔터티가 여러 개의 엔터티를 가질 수 있는 관계

  • 예제: 회원(Member)주문(Order)

  • 매핑 방법:

    @OneToMany(mappedBy = "member") // 반대쪽 엔터티에서 ManyToOne 설정 필요
    private List<Order> orders;
  • 설명: 한 회원이 여러 개의 주문을 가질 수 있음


🏷️ 4. @ManyToMany (N:N 관계, 하지만 중간 테이블이 필요)

  • 특징: 두 개의 엔터티가 서로 다대다 관계를 가질 때 사용되지만, 직접 매핑하는 것은 권장되지 않음
  • 예제: 상품(Product)장바구니(Cart)
  • 설명:
    • 한 상품은 여러 개의 장바구니에 담길 수 있음
    • 한 장바구니에는 여러 개의 상품이 들어갈 수 있음
    • 중간 엔터티(교차 테이블)가 필요함

🔹 "상품"과 "장바구니"의 다대다 관계 (중간 엔터티 사용)

상품(Product)장바구니(Cart)N:N 관계지만, 직접 매핑하지 않고 중간 엔터티(CartItem)를 둡니다.

✅ 교차 엔터티: CartItem

  • CartProduct를 연결하는 중간 테이블 역할을 함
  • CartItem장바구니(Cart)상품(Product)각각 N:1로 연결

🛒 장바구니(Cart) 엔터티

@Entity
public class Cart {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "member_id")
    private Member member;

    @OneToMany(mappedBy = "cart", cascade = CascadeType.ALL)
    private List<CartItem> cartItems = new ArrayList<>();
}

📦 상품(Product) 엔터티

@Entity
public class Product {
    @Id @GeneratedValue
    private Long id;

    private String name;

    @OneToMany(mappedBy = "product", cascade = CascadeType.ALL)
    private List<CartItem> cartItems = new ArrayList<>();
}

🔗 중간 엔터티 (CartItem)

@Entity
public class CartItem {
    @Id @GeneratedValue
    private Long id;

    @ManyToOne
    @JoinColumn(name = "cart_id")
    private Cart cart;

    @ManyToOne
    @JoinColumn(name = "product_id")
    private Product product;

    private int quantity; // 수량
}

🔹 결론

  • JPA 연관관계 매핑에는 @OneToOne, @ManyToOne, @OneToMany, @ManyToMany4가지가 있음
  • "상품"과 "장바구니" 관계는 다대다(N:N) 관계이므로 중간 엔터티(CartItem)를 둬서 두 개의 ManyToOne 관계로 나누어야 함
  • CartItem을 사용하여 장바구니와 상품을 연결하고 수량 같은 추가 정보를 저장 가능

🔹 팁

  • 조인 관계를 설정
    항목 단방향 양방향
    설계 위치 보통 Many 쪽에 설정 양쪽에 설정하되 주인은 Many 쪽
    외래키 위치 항상 Many 쪽 테이블 항상 Many 쪽 테이블
    실무 추천 단방향 우선 → 필요시 양방향 단방향으로 시작, 필요시 확장