Back_End/JPA

JPA 핵심 매핑(Mapping) 개념

10Biliion 2025. 5. 8. 11:14
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 값 의미가 바뀜

  1. 순서가 바뀌면 DB 값 의미가 바뀜
  2. 기존에 저장된 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를 사용한 다양한 전략 지원
 

 


참고자료