[JPA] 필드와 컬럼 매핑 :: 잡다한 프로그래밍
반응형

지난 시간에는 엔티티와 테이블 매핑을 배웠다면,
이번에는 엔티티의 필드와 데이터베이스 컬럼을 어떻게 매핑하는지에 대해 정리합니다.

 

실습 요구사항

아래 조건에 맞는 회원(Member) 엔티티를 만들어 봅니다.

  1. 회원은 일반 회원과 관리자 두 가지 역할이 있다.
  2. 회원 가입일과 수정일을 저장해야 한다.
  3. 회원을 설명할 수 있는 필드가 있으며, 길이 제한은 없다.

회원 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

+ Recent posts