자바 클래스의 필드와 데이터베이스의 컬럼을 연결한다.
@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;
'springboot > jpa' 카테고리의 다른 글
JPA 기본키(PK) 매핑 전략 (0) | 2025.06.23 |
---|---|
JPA DB 스키마 자동 생성 이상과 현실 (0) | 2025.06.22 |
JPA 클래스와 테이블 매핑 @Entity, @Table (1) | 2025.06.22 |
JPA 영속성 관리 (1) | 2025.06.20 |
JPA를 왜 사용해야 하는가? (0) | 2025.06.18 |