본문 바로가기
springboot/jpa

JPA 필드와 컬럼 매핑

by cactuslog 2025. 6. 23.
자바 클래스의 필드와 데이터베이스의 컬럼을 연결한다.

@Column 속성

name

●  매핑할 컬럼 이름 설정

@Column(name = "user_name")
private String name;

 

insertable / updatable

●  INSERT/UPDATE 쿼리에 컬럼 포함 여부(기본값 true)

@Column(insertable = false)
private String name;

 

●  insert query에서 name 컬럼은 제외된다.

[Hibernate] 
insert 
into
    member (modified_at, created_at, desc, email, role, id) 
values
    (?, ?, ?, ?, ?, ?)

 

●  updatable은 생성일, ID 같이 수정되면 안되는 필드에 사용

@Column(updatable = false)
private LocalDateTime createdAt;

nullable (DDL)

●  NOT NULL 여부 설정

●  false로 설정하면 DDL 생성 시 not null 제약조건 설정

@Column(nullable = false)
private String name;


create table member (
        ...
        name varchar(255) not null      
    )

unique (DDL)

●  단일 유니크 제약 조건 생성

 

●  복합 유니크 제약 조건은 @Table의 uniqueConstraints 속성 사용

@Column(unique = true)
private String email;


create table member (
...
email varchar(255) unique
)

 

●  unique 옵션을 쓰면 제약 이름이 랜덤으로 생성 되어서 운영에서 사용하기 안 좋다.

 

●  유니크 제약 예외가 걸리면 이름을 보고 바로 알 수가 없다.

Unique index or primary key violation: "PUBLIC.CONSTRAINT_INDEX_87

 

●  uniqueConstraints를 사용하면 지정한 이름을 보고 바로 알 수 있다.

Unique index or primary key violation: "PUBLIC.UK_NAME_EMAIL_INDEX_8

length (DDL)

●  문자열 길이 제한 설정 (기본 255)

@Column(length = 100)
private String name;


create table member (
...
name varchar(100)
)

columnDefinition (DDL)

●  데이터베이스 컬럼 정보를 직접 설정

@Column(columnDefinition = "varchar(50) default 'JPA_USER'")
private String name;


create table member (
...
name varchar(50) default 'JPA_USER'
)

precision / scale (DDL)

●  BigDecimal 타입에 사용한다.

 

●  precision은 소수점을 포함한 전체 자릿수

 

●  scale은 소수의 자릿수

 

●  double, float 타입에는 적용되지 않는다.

 

●  아주 큰 숫자나 정밀한 소수를 다룰 때만 사용한다.

@Column(precision = 10, scale = 2)
private BigDecimal currency;

// mysql
create table member (
...
currency decimal(10,2)
)

enum 타입 매핑

public enum RoleType {
	ADMIN, USER
}

@Enumerated(EnumType.STRING)
private RoleType role;


create table member (
...
role enum ('ADMIN','USER')
)

@Enumerated

EnumType.ORDINAL enum 순서를 DB에 저장 기본값
EnumType.STRING enum 이름을 DB에 저장 실무 사용 권장

 

●  enum 순서를 DB에 저장하면 숫자가 저장되기 때문에, enum에 새로운 요소가 추가될 경우 순서가 바뀌어 문제가 된다.

 

●  EnumType.STRING 을 사용하여 enum 이름을 DB에 저장해야 한다.


날짜 매핑

@Temporal

@Temporal(TemporalType.TIMESTAMP)
private LocalDateTime createdAt;
TemporalType.DATE 날짜, DB date 타입과 매핑
TemporalType.TIME 시간, DB time 타입과 매핑
TemporalType.TIMESTAMP 날짜와 시간, DB timestamp 타입과 매핑

 

●  LocalDate, LocalDateTime 타입을 사용할 때는 annotation 생략 가능

private LocalDateTime createdAt;
private LocalDate ModifiedAt;


create table member (
...
created_at timestamp(6),
modified_at date
)

 

날짜 자동 기록 

●  Spring Data JPA에서는 엔티티 생성 시점과 수정 시점을 자동으로 기록하기 위해 어노테이션 제공한다.

●  org.springframework.data.annotation 패키지에 포함되어 있다.

@CreatedDate 엔티티가 처음 저장될 때
@LastModifiedDate 엔티티가 업데이트 될 때마다

 

●  CreatedDate는 persist 시점에 한 번만 세팅

 

●  LastModified는 persist, update 시점마다 갱신

사용 조건

1. EntityListners 붙이기

@Entity
@EntityListeners(AuditingEntityListener.class)
public class MemberEntity {
    ...
}

2. EnableJpaAuditing 설정

@Configuration
@EnableJpaAuditing
public class JpaConfig {
}

3. 날짜 필드에 어노테이션 추가

@CreatedDate
private LocalDateTime createdDate;

@LastModifiedDate
private LocalDateTime lastModifiedDate;

실무 예제

●  실무에서는 보통 공통 속성을 묶어서, 상속을 통해 사용한다.

@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class BaseTimeEntity {

    @CreatedDate
    private LocalDateTime createdDate;

    @LastModifiedDate
    private LocalDateTime lastModifiedDate;
}

@Entity
public class MemberEntity extends BaseTimeEntity {
    ...
}

BLOB, CLOB 매핑

@Lob

@Lob
private String desc;


create table member (
...
desc clob
)

 

●  Lob에는 지정할 수 있는 속성이 없다.

 

●  매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑

CLOB String, char[], java.sql.CLOB 텍스트 데이터 저장
BLOB byte[], java.sql. BLOB 이미지, 동영상, 파일 등 이진 데이터 저장

매핑 제외하기

@Transient

●  필드 매핑 제외

 

●  DB에 저장, 조회 안 된다.

 

●  주로 메모리 상에서만 임시로 어떤 값을 보관하고 싶을 때 사용

@Transient
private String ignoreData;