Spring Boot/JPA(Java Persistence API)

매핑 규칙(어노테이션)

재윤 2025. 8. 28. 17:52
반응형

1. 엔티티 기본 매핑

  • @Entity
    • 클래스가 JPA 엔티티임을 표시
    • 기본 생성자 필수 (public 또는 protected)
  • @Table(name = "table_name")
    • 매핑할 DB 테이블 이름 지정 (기본값은 클래스명과 동일)
@Entity
@Table(name = "accounts")
public class Account { ... }

2. 기본 키 매핑

  • @Id
    • PK 컬럼 지정
  • @GeneratedValue
    • PK 생성 전략
      • IDENTITY : DB auto_increment 사용 (MySQL, MariaDB)
      • SEQUENCE : DB 시퀀스 사용 (Oracle)
      • TABLE : 키 생성용 테이블 사용
      • AUTO : DB dialect에 따라 자동 선택
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

3. 필드 매핑

  • @Column
    • 컬럼 속성 지정 (nullable, length, unique, precision, scale 등)
  • @Enumerated(EnumType.STRING)
    • Enum 매핑 (기본값 ORDINAL은 위험 → STRING 추천)
  • @Temporal (Java 8 이전 Date/Calendar에 사용 → 지금은 LocalDate/LocalDateTime 쓰는 게 표준)
  • @Lob
    • BLOB/CLOB 매핑
@Column(nullable = false, length = 50, unique = true)
private String owner;

4. 연관관계 매핑

JPA 핵심 부분 (객체 참조 ↔ 외래 키 매핑)

  • @ManyToOne
    • 다대일 관계 (N:1)
    • 대부분의 관계는 이거로 시작 (예: 주문 → 회원)
  • @OneToMany
    • 일대다 관계 (1:N)
    • 잘 안 씀 (성능/설계상 문제 많음 → 보통 ManyToOne의 반대편에서 mappedBy로 매핑)
  • @OneToOne
    • 일대일 관계
  • @ManyToMany
    • 다대다 (거의 안 씀, 중간 테이블 엔티티 만들어서 일대다 + 다대일로 풀어냄)
  • 공통 속성:
    • mappedBy : 연관관계의 주인 지정 (외래 키를 가진 쪽이 주인)
    • cascade : 영속성 전이 (PERSIST, REMOVE, ALL)
    • fetch : 로딩 전략 (LAZY, EAGER)
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "owner_id")
private User owner;

5. 상속 매핑

객체 상속 구조 ↔ 테이블 매핑 규칙

  • @Inheritance(strategy = …)
    • SINGLE_TABLE : 한 테이블에 다 넣기 (DTYPE 구분 컬럼 필요)
    • JOINED : 부모/자식 테이블 따로 (JOIN 필요)
    • TABLE_PER_CLASS : 자식마다 개별 테이블
  • @DiscriminatorColumn(name = "DTYPE")
    • 구분 컬럼

6. Mapped Superclass (공통 속성 상속)

  • 실제 테이블은 없고, 여러 엔티티에서 공통으로 쓰는 속성 정의
  • ex: 등록일, 수정일, 작성자 등
@MappedSuperclass
public abstract class BaseEntity {
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;
}
반응형

'Spring Boot > JPA(Java Persistence API)' 카테고리의 다른 글

N + 1 문제 해결  (1) 2025.08.28
영속성 컨텍스트  (0) 2025.08.28
쿼리 방법(JPQL/Criteria)  (1) 2025.08.28
EntityManager API  (0) 2025.08.28