인프런 김영한 강의 정리/자바 ORM 표준 JPA 프로그래밍 기본편

JPA 기본 | 필드와 컬럼 매핑 | @Column, @Enumerated, @Temporal, @Lob

백엔드 개발자 - 젤리곰 2024. 6. 10. 18:28
728x90

1. 필드와 컬럼 매핑 예제

1) Member 클래스

package hellojpa;

import jakarta.persistence.*;
import lombok.Getter;
import lombok.Setter;

import java.util.Date;


@Entity
@Table(name="member")
@Getter
@Setter
public class Member {


    @Id
    private Long id;

    @Column(name = "name") //객체명은 username인데, DB 컬럼명은 name일때
    private String username;

    private Integer age;

    @Enumerated(EnumType.STRING) //사용자를 회원과 관리자로 구분한다. ENUM클래스를 만들어서 import해와야한다.
    private RoleType roleType;

    @Temporal(TemporalType.TIMESTAMP) //생성일자, 수정일자 같은 컬럼의 날짜 타입
    private Date createdDate;

    @Temporal(TemporalType.TIMESTAMP)
    private Date lastModifiedDate;

    @Lob //varchar타입 이상의 큰 데이터인 CLOB, BLOB같은 데이터 타입
    private String description;
    
    @Transient
    private int temp;

    public Member() {
    }

}

✔️@Column

name 옵션으로 DB 컬럼 이름을 지정한다.

(더 다양한 옵션도 있다.)

 

✔️@Enumerated

- JPA에서 자바의 enum 타입을 데이터베이스에 매핑할 때 사용한다.

- DB에는 Java의 enum 타입과 직접 매핑되는 타입이 없기때문에 enum값을 DB에 저장할 때, String으로 변환할 지 정수형으로 변환할지 선택할 수 있게 해주는 어노테이션이다.

 

💡기본타입인 ORDINAL은 사용하지 말자. (enum의 순서를 정수형으로 저장)

 요구사항이 변경되어, ENUM 값이 변경된다면 데이터 일관성을 보장할 수가 없기 때문이다. 

 

✔️@Temporal

- 날짜/시간 타입을 DB에 매핑할 때 사용한다.

💡요즘엔 이 어노테이션을 쓰지 않고 LocalDate, LocalDateTime 타입을 쓴다.

하이버네이트에서 타입만 보고도 알 수 있기때문이다.

 

✔️@Lob

- CLOB(Character Large Object)나 BLOB(Binary Large Object) 과 같은 대용량 데이터를 DB에 저장할 때 사용한다.

 

✔️@Transient

메모리에서만 사용하고 DB에 넣고 싶지는 않을 때 사용하는 어노테이션이다.

 

2) Enum 클래스 

package hellojpa;

public enum RoleType {
    USER,ADMIN
}

 

3) 애플리케이션 실행부

package hellojpa;

import jakarta.persistence.*;

public class JpaMain {

    public static void main(String[] args) {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
        EntityManager em = emf.createEntityManager();

        EntityTransaction tx = em.getTransaction();
        tx.begin();
        try{
            tx.commit();
        }catch (Exception e){
            tx.rollback();
        }finally {
            em.close();
        }

    }
}

 

✅로그

Hibernate: 
    create table member (
        id bigint not null,
        age integer,
        createdDate timestamp(6),
        description clob,
        lastModifiedDate timestamp(6),
        roleType varchar(255) check (roleType in ('USER','ADMIN')),
        name varchar(255),
        primary key (id)
    )

 

 

✅실행 결과(DB)

Member클래스에 컬럼 매핑을 한 그대로 스키마 생성이 완료되었다.

 

 

2. @Column 의 옵션들

옵션 설명 기본값
name DB 컬럼명 지정  객체 필드명
nullable 컬럼의 NULL 허용 여부 지정  true
unique 컬럼 값이 유니크(중복되지 않음)해야 하는지 지정.
*유니크 키의 이름이 랜덤으로 지정되기 때문에 이름 반영이 어렵다.
false
length 문자열 타입의 컬럼 길이 지정 255
insertable 엔티티 저장 시, 컬럼 포함 여부 지정 true
updatable 엔티티 업데이트 시, 컬럼 포함 여부 지정 true
columnDefinition DB의 컬럼 정의를 직접 기술  
precision 소수점 포함한 전체 자릿수 지정, BigDecimal, BigInteger 타입에서 사용된다. 정밀한 소수를 다룰 때만 사용!  
scale 소수점 이하 자리수 지정.(BigDecimal, BigInteger타입에서 사용가능)  

 

💡unique 옵션을 쓰면 이름이 랜덤으로 지정되기 때문에 원하는 이름을 반영하기가 어렵다.

그래서 unique 옵션은 @Table(uniqueConstraints="UK name") 으로 지정하는 방식을 권장한다.

 

 

 

 

728x90