반응형
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에 따라 자동 선택
- PK 생성 전략
@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 |