🔹 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
Cart
와Product
를 연결하는 중간 테이블 역할을 함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, @ManyToMany 총 4가지가 있음
- "상품"과 "장바구니" 관계는 다대다(N:N) 관계이므로 중간 엔터티(
CartItem
)를 둬서 두 개의 ManyToOne 관계로 나누어야 함 CartItem
을 사용하여 장바구니와 상품을 연결하고 수량 같은 추가 정보를 저장 가능
🔹 팁
- 조인 관계를 설정
항목 단방향 양방향 설계 위치 보통 Many 쪽에 설정 양쪽에 설정하되 주인은 Many 쪽 외래키 위치 항상 Many 쪽 테이블 항상 Many 쪽 테이블 실무 추천 단방향 우선 → 필요시 양방향 단방향으로 시작, 필요시 확장
'웹 개발' 카테고리의 다른 글
클라이언트(Frontend)와 서버(Backend) 간의 데이터 흐름 (0) | 2025.02.26 |
---|---|
URL 경로에 포함된 동적인 값을 처리하는 방법(Spring Boot). (0) | 2025.02.26 |
React - Router의 동작 흐름 (0) | 2025.02.24 |
Java - 특정 폴더의 이미지 파일 목록 가져오기 (0) | 2025.02.24 |
SpringBoot 개발환경 설정하기. (1) | 2025.02.17 |