public enum Status {
ACTIVE, INACTIVE, DELETED
}

JPA(Java Persistence API)는 자바 객체와 데이터베이스 테이블 간의 자동 매핑을 제공하는 ORM(Object-Relational Mapping) 프레임워크입니다.
객체와 테이블 매핑
JPA는 자바 객체를 관계형 데이터베이스 테이블에 매핑할 수 있도록 합니다.
이때 사용하는 기본 어노테이션은 @Entity와 @Table입니다.
@Entity // 이 클래스는 JPA가 관리하는 엔티티
@Table(name = "member") // 테이블명 지정 (생략 시 클래스명 소문자)
public class Member {
@Id
private Long id;
private String name;
}
어노테이션 | 설명 |
@Entity | 해당 클래스가 JPA에서 관리되는 엔티티 클래스임을 나타냄 |
@Table(name="...") | 매핑할 테이블 이름 지정 (생략 시 클래스명 사용) |
@Entity는 필수이며, 기본 생성자도 반드시 존재해야 합니다.
또한 final 클래스나 enum, interface에는 사용할 수 없습니다.
데이터베이스 스키마 자동 생성
JPA는 엔티티 클래스를 기반으로 데이터베이스 테이블을 자동 생성할 수 있습니다.
이는 persistence.xml 또는 application.yml 설정을 통해 제어됩니다.
설정 예시 (application.yml)
spring:
jpa:
hibernate:
ddl-auto: create
옵션 종류
값 | 설명 |
none | 아무 동작도 하지 않음 (기본값) |
create | 애플리케이션 시작 시 기존 테이블 삭제 후 새로 생성 |
create-drop | 종료 시점에 테이블 제거 |
update | 변경된 엔티티 구조만 반영 |
validate | DB 테이블과 엔티티의 매핑이 정확한지 검증 (테이블 생성은 하지 않음) |
❗ 실무에서는 ddl-auto=none 또는 validate 사용을 권장합니다.
create, update는 초기 개발 단계 또는 테스트 환경에만 사용하세요.
필드와 컬럼 매핑
엔티티 클래스의 **필드(변수)는 테이블의 컬럼(Column)**에 매핑됩니다.
기본 매핑 예시
@Column(name = "user_name", nullable = false, length = 100)
private String username;
@Column 속성
속성 | 내용 |
name | 컬럼명 지정 (생략 시 필드명과 동일) |
nullable | NOT NULL 여부 (기본값: true) |
unique | 유니크 제약조건 (DB 인덱스로 생성됨) |
length | 문자 길이 (기본값: 255, 문자열에만 해당) |
insertable, updatable | SQL 생성 시 포함 여부 제어 |
주의
- 매핑은 필드 기준, 프로퍼티 기준 중 선택 가능하나 혼용하면 안 됩니다.
- JPA는 **접근 전략을 필드 기준(@Id가 필드에 붙은 경우)**으로 판단합니다.
@Enumerated 속성
- 아무 설정도 하지 않으면 기본값은 ORDINAL입니다.
- enum의 **순서값(index)**이 DB에 저장됩니다.
public enum Status {
ACTIVE, INACTIVE, DELETED
}
@Enumerated // = EnumType.ORDINAL
@Column(name = "status")
private Status status;
Enum 값 | 실제 DB 저장 값 |
ACTIVE | 0 |
INACTIVE | 1 |
DELETED | 2 |
문제점: 순서가 바뀌거나 새로운 값이 추가되면 DB 값 의미가 바뀜
- 순서가 바뀌면 DB 값 의미가 바뀜
- 기존에 저장된 0은 더 이상 ACTIVE가 아니라 INACTIVE로 해석됨 → 데이터 오류
public enum Status {
INACTIVE, ACTIVE, DELETED // 순서 바뀜
}
반드시 @Enumerated(EnumType.STRING) 속성을 사용
- Enum의 이름 자체를 문자열로 저장합니다.
@Enumerated(EnumType.STRING)
@Column(name = "status")
private Status status;
Enum 값 | 실제 DB 저장 값 |
ACTIVE | 'ACTIVE' |
INACTIVE | 'INACTIVE' |
DELETED | 'DELETED' |
기본 키 매핑
모든 JPA 엔티티는 반드시 식별자(PK)를 가져야 하며, @Id를 사용해 지정합니다.
@Id
private Long id;
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
종류 | 설명 |
AUTO (기본값) | DB 방언에 따라 자동 선택 (ex: H2는 IDENTITY, Oracle은 SEQUENCE) |
IDENTITY | DB의 AUTO_INCREMENT 기능 사용 |
SEQUENCE | DB 시퀀스 객체 사용 (Oracle, PostgreSQL 등) |
TABLE | 키 값을 생성하는 별도 테이블 사용 (성능 저하 우려) |
시퀀스 사용 예제 (Oracle용)
@SequenceGenerator(
name = "member_seq_gen",
sequenceName = "member_seq",
allocationSize = 1
)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "member_seq_gen")
private Long id;

항목 | 설명 |
@Entity | 객체를 테이블로 매핑하는 기본 단위 |
@Table | 테이블 이름을 명시적으로 지정 |
DDL 자동 생성 | spring.jpa.hibernate.ddl-auto 설정으로 제어 |
필드 매핑 | @Column으로 컬럼 속성 제어 가능 |
기본 키 | @Id, @GeneratedValue를 사용한 다양한 전략 지원 |
참고자료
- JPA 공식 문서 (Jakarta)
- 김영한, 『자바 ORM 표준 JPA 프로그래밍』
- Spring Data JPA 레퍼런스
'Back_End > JPA' 카테고리의 다른 글
JPA 연관관계 매핑 정리 (0) | 2025.07.16 |
---|---|
JPA @GeneratedValue 전략 (0) | 2025.07.07 |
JPA 영속성 컨텍스트,엔티티 매니저, 그리고 엔티티 (0) | 2025.05.08 |
Spring Data JPA란? (1) | 2025.04.11 |
JPA, ORM, HIBERNATE이란? (0) | 2025.04.11 |