반응형

JPA 테이블 매핑과 어노테이션 가이드

JPA(Java Persistence API)에서 테이블을 정의하는 방법에 대해 자세히 알아보겠습니다. JPA는 자바 애플리케이션에서 관계형 데이터베이스를 객체지향적으로 사용할 수 있게 해주는 기술입니다.

기본 엔티티 매핑

가장 기본적인 엔티티 매핑에는 다음과 같은 어노테이션들이 사용됩니다:

@Entity

클래스가 JPA 엔티티임을 나타냅니다. 이 어노테이션이 적용된 클래스는 데이터베이스 테이블과 매핑됩니다.

@Entity
public class Order {
    // 클래스 내용
}

@Table

엔티티와 매핑할 테이블을 지정합니다. 생략하면 엔티티 이름이 테이블 이름으로 사용됩니다.

@Entity
@Table(name = "ORDERS", 
       uniqueConstraints = {@UniqueConstraint(
           name = "NAME_AGE_UNIQUE",
           columnNames = {"NAME", "AGE"})})
public class Order {
    // 클래스 내용
}

기본 키 매핑

@Id와 @GeneratedValue

기본 키 매핑을 위해 사용되며, 데이터베이스별로 다른 생성 전략을 사용할 수 있습니다:

// MySQL
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

// Oracle
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
private Long id;

// H2
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;

필드 매핑

@Column

컬럼 매핑을 세밀하게 제어할 수 있습니다:

@Column(name = "ORDER_DATE",
        nullable = false,
        length = 10,
        updatable = false)
private String orderDate;

@Temporal

날짜 타입 매핑에 사용됩니다:

@Temporal(TemporalType.TIMESTAMP)
private Date orderDate;

@Enumerated

열거형 타입 매핑에 사용됩니다:

@Enumerated(EnumType.STRING)
private OrderStatus status;

연관관계 매핑

@OneToMany

일대다 관계를 매핑합니다:

@OneToMany(mappedBy = "order")
private List<OrderItem> orderItems = new ArrayList<>();

@ManyToOne

다대일 관계를 매핑합니다:

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "MEMBER_ID")
private Member member;

실전 예제

다음은 주문 시스템의 완전한 엔티티 예제입니다:

@Entity
@Table(name = "ORDERS")
public class Order {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ORDER_ID")
    private Long id;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "MEMBER_ID")
    private Member member;

    @OneToMany(mappedBy = "order", cascade = CascadeType.ALL)
    private List<OrderItem> orderItems = new ArrayList<>();

    @Temporal(TemporalType.TIMESTAMP)
    private Date orderDate;

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

    // 연관관계 편의 메서드
    public void setMember(Member member) {
        this.member = member;
        member.getOrders().add(this);
    }

    public void addOrderItem(OrderItem orderItem) {
        orderItems.add(orderItem);
        orderItem.setOrder(this);
    }
}

참고 자료

이 내용은 다음 자료들을 참고하여 작성되었습니다:

주의사항

  • @GeneratedValue 전략은 데이터베이스에 따라 적절한 것을 선택해야 합니다
  • @OneToMany, @ManyToOne 관계에서는 성능을 위해 지연 로딩(LAZY)을 권장합니다
  • 양방향 관계에서는 연관관계의 주인을 명확히 설정해야 합니다

이러한 JPA 엔티티 매핑을 통해 객체와 테이블을 효과적으로 매핑하고, 객체지향적인 도메인 모델을 구축할 수 있습니다.

반응형

'Java > JPA' 카테고리의 다른 글

JPA & Hibernate Cache  (0) 2022.01.19
JPA Cascade Types  (0) 2021.12.19

+ Recent posts