🧱 Entity 설계
Entity는 데이터베이스 테이블과 매핑되는 도메인 객체로,
비지니스 로직의 핵심 데이터 구조를 정의하는 JPA의 중심 개념입니다.
Entity를 올바르게 설계하면 DB 스키마, ORM 매핑, 비지니스 규칙이 명확히 드러납니다.
1️⃣ Entity 기본 개념
Entity는 @Entity 어노테이션으로 정의되며,
각 필드는 데이터베이스의 컬럼(Column)과 1:1로 매핑됩니다.
@Entity
@Table(name = "reservation")
public class Reservation {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(nullable = false, unique = true, length = 64)
private String token;
}
| 어노테이션 | 설명 |
|---|---|
@Entity | JPA가 관리할 엔티티 클래스 지정 |
@Table | 실제 매핑될 DB 테이블 이름 지정 |
@Id | PK(Primary Key) 지정 |
@GeneratedValue | 기본 키 생성 전략 (AUTO, IDENTITY 등) |
@Column | 컬럼 세부 속성 설정 (NULL, UNIQUE, 길이 등) |
2️⃣ 컬럼 속성 설계
Entity는 단순히 필드 정의를 넘어, 데이터 제약조건을 명시적으로 표현할 수 있습니다.
이를 통해 코드 레벨에서 스키마의 의도를 유지합니다.
@Column(name = "customer_name", nullable = false, length = 100)
private String customerName;
nullable = false→ DB의NOT NULL제약조건length = 100→VARCHAR(100)길이 매핑name→ 실제 DB 컬럼명(snake_case) 지정 가능
✅ 코드만 보고도 컬럼 스펙을 이해할 수 있어, SQL 스키마 의존성을 줄입니다.
3️⃣ Enum 타입 매핑
비즈니스 도메인에서 자주 등장하는 상태값(status, type, method)은
Enum으로 정의하여 가독성과 안정성을 높입니다.
@Enumerated(EnumType.STRING)
@Column(nullable = false, length = 20)
private Status status;
public enum Status {
ACTIVE, CANCELLED, EXPIRED
}
| EnumType | 설명 |
|---|---|
ORDINAL | Enum 순서를 숫자로 저장 (0, 1, 2) - ❌ 가독성 낮음 |
STRING | Enum 이름을 문자열로 저장 - ✅ 명확하고 안전 |
💡 EnumType.STRING을 항상 권장합니다.
나중에 Enum 순서가 바뀌어도 DB 값이 영향을 받지 않습니다.
4️⃣ 엔티티 라이프사이클 이벤트
@PrePresist, @PreUpdate 같은 JPA 콜백을 통해
데이터 생성·수정 시 자동으로 값을 채워 넣을 수 있습니다.
@PrePersist
public void prePersist() {
createdAt = LocalDateTime.now();
updatedAt = LocalDateTime.now();
status = Status.ACTIVE;
}
@PreUpdate
public void preUpdate() {
updatedAt = LocalDateTime.now();
}
|어노테이션|시점|용도|
|@PrePersist|INSERT 직전|기본값 설정, 생성일 등록|
|@PreUpdate|UPDATE 직전|수정일 자동 갱신|
✅ Service 단에서 일일이
createdAt을 설정하지 않아도 됨
✅ 코드 일관성 유지 + 중복 로직 제거