01 엔티티 매핑이란?
JPA에서 엔티티는 데이터베이스 테이블과 매핑되는 객체입니다.
엔티티 매핑은 객체 중심의 프로그래밍과 관계형 데이터베이스의 데이터를 연결하는 핵심 요소로, 객체와 테이블 간의 매핑을 설정해줍니다.
이를 통해 개발자는 SQL을 직접 작성하지 않고도 객체를 통해 데이터베이스를 다룰 수 있습니다.
이번 글에서는 기본적인 매핑 어노테이션을 정리해보겠습니다.
02 @Entity와 @Table
1. @Entity
@Entity는 JPA에서 엔티티 클래스를 정의하는 데 사용됩니다. 이 어노테이션이 선언된 클래스는 데이터베이스 테이블과 매핑됩니다.
- 속성
- name : JPA에서 사용할 엔티티 이름을 지정합니다. 기본값은 클래스 이름과 동일합니다.
- 주의사항
- 기본 생성자가 반드시 필요합니다.
- final, enum, interface, inner class에는 사용할 수 없습니다.
- 저장할 필드에 final을 사용할 수 없습니다.
@Entity
public class Member {
@Id
private Long id;
private String name;
}
2. @Table
@Table은 엔티티와 매핑할 데이터베이스 테이블을 지정합니다. 생략하면 엔티티 이름이 테이블 이름으로 사용됩니다.
- 속성
- name: 매핑할 테이블 이름을 지정합니다.
- catalog: 데이터베이스 카탈로그를 지정합니다.
- schema: 데이터베이스 스키마를 지정합니다.
- uniqueConstraints: DDL 생성 시 유니크 제약조건을 만듭니다.
@Entity
@Table(name = "members")
public class Member {
@Id
private Long id;
private String name;
}
03 기본 키 매핑
1. @Id
@Id는 엔티티의 기본 키를 매핑합니다. 기본 키는 테이블에서 각 행을 고유하게 식별하는 데 사용됩니다.
2. @GeneratedValue
@GeneratedValue는 기본 키 생성 전략을 지정합니다.
- 전략
- GenerationType.IDENTITY: 기본 키 생성을 데이터베이스에 위임합니다.
- *Statement.getGeneratedKeys()**를 사용하면 데이터 저장과 동시에 생성된 기본 키 값을 가져올 수 있습니다.
- 트랜잭션을 지원하는 쓰기 지연이 동작하지 않으니 유의하세요.
- GenerationType.SEQUENCE: 데이터베이스 시퀀스를 사용합니다.
- 시퀀스를 생성하려면 @SequenceGenerator를 함께 사용합니다.
- 속성:
- name: 식별자 이름.
- sequenceName: 매핑할 데이터베이스 시퀀스 이름.
- initialValue: 시작 값.
- allocationSize: 한 번 호출에 증가하는 값 (기본값 50, 성능 최적화).
- GenerationType.TABLE: 키 생성 전용 테이블을 사용합니다.
- GenerationType.AUTO: 데이터베이스 방언에 따라 전략이 자동으로 선택됩니다.
- GenerationType.IDENTITY: 기본 키 생성을 데이터베이스에 위임합니다.
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
}
04 필드와 컬럼 매핑
1. @Column
@Column은 엔티티의 필드를 테이블의 컬럼에 매핑합니다. 생략하면 필드 이름이 컬럼 이름으로 사용됩니다.
- 속성
- name: 매핑할 컬럼 이름.
- nullable: NULL 허용 여부.
- unique: 유니크 제약조건 설정.
- columnDefinition: DDL 생성 시 사용할 컬럼 정의.
- length: 문자열 길이 (기본값: 255).
- precision, scale: 숫자 타입(BigDecimal, BigInteger)의 정밀도와 스케일.
@Column(name = "member_name", nullable = false, length = 100)
private String name;
2. @Enumerated
@Enumerated는 enum 타입을 매핑합니다.
- 속성
- EnumType.ORDINAL: 순서를 저장 (기본값)
- EnumType.STRING: 이름을 저장 (권장)
@Enumerated(EnumType.STRING)
private Role role;
3. @Temporal
@Temporal은 날짜 타입을 매핑합니다. (Java 8 이상에서는 LocalDate, LocalDateTime 사용 권장)
- 속성
- TemporalType.DATE: 날짜만 저장.
- TemporalType.TIME: 시간만 저장.
- TemporalType.TIMESTAMP: 날짜와 시간을 저장.
@Temporal(TemporalType.DATE)
private Date birthDate;
4. @Lob
@Lob은 대형 데이터를 매핑합니다. 문자열이면 CLOB, 바이너리 데이터면 BLOB으로 매핑됩니다.
@Lob
private String description;
5. @Transient
@Transient는 특정 필드를 매핑에서 제외합니다. 해당 필드는 데이터베이스에 저장되지 않습니다.
@Transient
private String tempData;
05 스키마 자동 생성
JPA는 애플리케이션 실행 시점에 데이터베이스 테이블을 자동으로 생성하는 기능을 제공합니다.
hibernate.hbm2ddl.auto 속성을 설정하여 다양한 동작을 정의할 수 있습니다.
- 속성
- create: 기존 테이블을 삭제하고 새로 생성.
- create-drop: create와 동일하지만 애플리케이션 종료 시 테이블 삭제.
- update: 테이블과 엔티티를 비교하여 변경사항만 반영.
- validate: 테이블과 엔티티를 비교하여 차이가 있으면 오류 발생.
- none: 스키마 자동 생성 기능 비활성화.
<property name="hibernate.hbm2ddl.auto" value="create" />
06 이름 매핑 전략 변경
JPA는 기본적으로 자바의 카멜 표기법을 테이블의 언더스코어 표기법으로 매핑합니다. 매핑 전략을 변경하려면 hibernate.ejb.naming_strategy 속성을 설정합니다.
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
'BackEnd > JPA' 카테고리의 다른 글
[JPA] JPA의 다양한 연관관계 매핑 (다대일, 일대다, 일대일, 다대다) (1) | 2025.02.02 |
---|---|
[JPA]JPA와 영속성 컨텍스트 (2) | 2024.12.17 |
[JPA] SpringBoot + JPA 시작하기 (1) | 2024.12.13 |
[JPA] JPA를 배워야 하는 이유는? SQL Mapper vs ORM (2) | 2024.12.10 |