반응형
지난 시간에는 엔티티와 테이블 매핑을 배웠다면,
이번에는 엔티티의 필드와 데이터베이스 컬럼을 어떻게 매핑하는지에 대해 정리합니다.
실습 요구사항
아래 조건에 맞는 회원(Member) 엔티티를 만들어 봅니다.
- 회원은 일반 회원과 관리자 두 가지 역할이 있다.
- 회원 가입일과 수정일을 저장해야 한다.
- 회원을 설명할 수 있는 필드가 있으며, 길이 제한은 없다.
회원 Entity
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name") // 필드는 username 이지만, 컬럼명은 name일 때
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
}
생성되는 테이블 예시
create table Member {
id bigint not null,
age integer,
createdDate timestamp,
description clob,
lastModifiedDate timestamp,
roleType varchar(255),
name varchar(255)
primary key (id)
}
매핑 어노테이션 정리
1. @Column
- 기본적으로 필드명 = 컬럼명 이지만, @Column(name="...")으로 커스텀 가능
- 주요 속성:
속성 | 설 |
name | 컬럼명 지정 |
nullable | false면 NOT NULL 제약조건 생성 (default true) |
unique | 간단한 유니크 제약조건 부여 (운영에선 비권장, 유니크의 이름이 랜덤값으로 생성되어 알아보기 불편함, 멀티 컬럼 선택 불가 등) |
insertable/updatable | INSERT, UPDATE 가능 여부 |
columnDefinition | 직접 DDL 정의 (예: "varchar(100) default 'EMPTY'") |
length | 문자열 길이 제한 (기본 255) |
precision, scale | BigDecimal 등 정밀 수치 지정 (precision=19, scale=2) |
2. @Enumerated
- Enum 타입 매핑 시 사용
- 옵션:
- EnumType.ORDINAL: enum 순서를 저장 (비추천)
- EnumType.STRING: enum 이름을 저장 (필수 권장)
ORDINAL 사용 시 문제 예시
public enum RoleType {
USER, ADMIN
}
이렇게 사용중일 때 DB에 USER = 0, ADMIN = 1로 저장
public enum RoleType {
GUEST, USER, ADMIN
}
만약 이후에 GUEST라는 타입을 추가했다면
GUEST = 0, USER = 1, ADMIN = 2
기존 USER가 GUEST로 해석될 수 있음 ⇒ 데이터 망가짐
3. @Temporal (최신 자바 미사용)
- java.util.Date, java.util.Calendar 타입 매핑 시 사용
4. @Lob
- 큰 데이터(CLOB, BLOB)를 저장할 때 사용
- 필드 타입에 따라 자동 결정:
- String, char[] → CLOB
- byte[] → BLOB
@Lob은 속성이 없음. 타입에 따라 자동으로 CLOB/BLOB 선택됨.
📌 그럼 CLOB vs TEXT 차이?
- CLOB: 표준 ANSI SQL의 대용량 문자 타입
- TEXT: DBMS에 따라 제공되는 비표준 타입 (MySQL 등)
- JPA는 CLOB으로 매핑하며, 방언에 따라 TEXT 등으로 변환됨
5. @Transient
- 해당 필드를 DB 컬럼으로 매핑하지 않음
- 계산용, 로그 출력용 등 JPA에서 관리하지 않아야 할 필드에 사용
반응형
'프로그래밍 > JPA' 카테고리의 다른 글
[JPA] 단방향 연관관계 (0) | 2025.06.24 |
---|---|
[JPA] 기본키 매핑 (0) | 2025.06.19 |
[JPA] 데이터베이스 스키마 자동 생성 (0) | 2025.06.19 |
[JPA] 객체와 테이블 매핑 (0) | 2025.06.19 |
[JPA] JPA의 영속성 관리2 (0) | 2025.06.10 |