꾸준한 개발일기

JPA 어노테이션의 종류와 기능 본문

Programing/스프링

JPA 어노테이션의 종류와 기능

꾸개일 2025. 6. 3. 08:52
반응형

 1. @Inheritance(strategy = InheritanceType.SINGLE_TABLE)

  • JPA에서 상속 매핑을 할 때 사용
  • SINGLE_TABLE 전략은 부모와 자식 엔티티를 하나의 테이블에 저장하는 방식
 
@Entity
@Inheritance(strategy = InheritanceType.SINGLE_TABLE)
@DiscriminatorColumn(name = "dtype") // 구분 컬럼
public abstract class Item {
    @Id @GeneratedValue
    private Long id;
}
@Entity
@DiscriminatorValue("B") // dtype = "B"로 저장
public class Book extends Item {
    private String author;
}

 

@DiscriminatorColumn(name = "dtype")

  • 상속 구조에서 엔티티 구분을 위한 컬럼 설정
  • 위 예시에서 dtype 컬럼에 "B", "M" 등 자식 타입을 저장
  • 기본값은 DTYPE

@DiscriminatorValue("B")

  • 해당 엔티티가 저장될 때 구분 컬럼에 들어갈 값을 지정
  • 위 예시에서 Book을 저장하면 dtype 컬럼에 "B"가 저장

2. @Enumerated(EnumType.STRING)

  • enum 타입 필드를 DB에 저장할 때 방식 지정
public enum DeliveryStatus {
    READY, COMP
}

@Enumerated(EnumType.STRING)
private DeliveryStatus status;
  • EnumType.STRING → "READY", "COMP" 등 문자열로 저장 (권장)
  • EnumType.ORDINAL → 0, 1 같은 숫자로 저장 (비권장, 순서 바뀌면 문제 생김)

3. @OneToOne @JoinColumn(name = "delivery_id")

  • 단방향 1:1 관계
  • 현재 엔티티에 delivery_id FK 컬럼을 생성하고 Delivery 엔티티 참조
@OneToOne(mappedBy = "delivery")  // 연관관계 주인 아님
private Order order;

4. @OneToOne(mappedBy = "delivery")

  • 양방향 1:1 관계의 반대편(Delivery 측) 에서 사용하는 설정
  • mappedBy는 연관관계의 주인이 아님을 의미
@OneToOne(mappedBy = "delivery")  // 연관관계 주인 아님
private Order order;
  • 위 예시에서는 Order.delivery가 연관관계의 주인이고,
    Delivery.order는 그냥 매핑된 값

5 @ManyToMany @JoinTable(name = "category_item")

  • N:N 다대다 관계 매핑
  • 실제로는 중간 테이블(category_item)을 생성해서 다대다를 일대다 + 다대일로 풀어냄
@ManyToMany
@JoinTable(name = "category_item",  // 중간 테이블 이름
    joinColumns = @JoinColumn(name = "item_id"),         // 현재 엔티티 FK
    inverseJoinColumns = @JoinColumn(name = "category_id")  // 반대쪽 엔티티 FK
)
private List<Category> categories = new ArrayList<>();

다대다는 실무에선 거의 안 씀 → 중간 테이블을 엔티티로 따로 만들어서 @ManyToOne, @OneToMany로 푸는 게 정석

반응형
Comments