[JPA] Entity 매핑

Woo Yong·2024년 1월 23일
0

JPA

목록 보기
3/7
post-thumbnail

이전 글에서는 실습 프로젝트를 다운받아서 JPA를 사용하는 방법에 대해 공부했다.
하지만 객체와 테이블을 매핑하는 방법에 대해서는 공부하지 못했다.

그리고 JPA를 사용하기 위해서는 객체와 테이블이 정확하게 매핑이 이루어져야한다.
이번 글에서는 객체(자바 클래스)와 테이블을 매핑하는 방법에 대해 작성해보려고한다.

Entity 매핑과 관련된 대표 어노테이션

  • 객체와 테이블 매핑 : @Entity, @Table

  • 기본 키 매핑 : @Id

  • 필드와 컬럼 매핑 : @Column

@Entity

@Entity는 클래스와 테이블을 매핑하기 위해 사용되는 어노테이션이며 JPA가 관리하게된다.
따라서, 테이블과 매핑할 클래스 위에는 필수적으로 붙여야하는 어노테이션이며, 해당 클래스가 Entity임을 명시하는 역할을 한다.

그리고 JPA가 해당 클래스를 사용할 때 사용하는 이름을 지정하기 위해서는 name 속성 값을 통해서 명시적으로 설정할 수 있다. 만약에 name 속성을 설정하지 않으면 클래스 이름을 사용한다.

예시

@Entity
public class Member { }

Entity 생성 시 유의사항

Entity 클래스를 정의할 때 몇가지 유의사항이 있다.
1. 기본 생성자 필수
2. 매핑할 필드는 final 사용 x
3. final, enum, interface, inner 클래스 사용 x

Entity 객체는 JPA가 관리하는 객체라고 했다. JPA가 Entity 객체를 생성할 때, 기본 생성자를 이용한다.
그렇기 때문에 Entity 클래스를 정의할 때는 반드시 기본 생성자를 만들어주어야한다.

@Table

@Table은 Entity와 매핑할 테이블을 지정한다.
해당 어노테이션은 생략이 가능하고 생략 시, 엔티티 이름을 테이블의 이름으로 사용한다.

예시

@Entity
@Table(name="MEMBER")
public class Member { }

실습

✅ 요구사항
1. 회원은 일반 회원과 관리자로 구분해야한다.
2. 회원 가입일과 수정일이 있어야한다.
3. 회원을 설명할 수 있는 필드가 있어야한다. 이 필드는 길이 제한이 없다.

@Entity
@Table(name="MEMBER")
public class Member {
	@Id
    @Column(name="ID")
    private String id;
    
    @Column(name="NAME")
    private String username
    
	@Enumerated(EnumType.STRING)
    private RoleType roleType;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date createDate;
    
    @Temporal(TemporalType.TIMESTAMP)
    private Date updateDate;
    
    @Lob
    private String desc;
}

public enum RoleType {
	ADMIN, USER
}

1번 요구사항

필드를 매핑하는데 할때 특정한 경우에는 Enum타입을 이용할 수 있습니다.

  • 고정된 값
    성별, 주문상태, 역할 등과 같이 여러 선택지 중 하나를 나타내는 경우에 사용할 수 있습니다.
public enum Gender {
    MALE, FEMALE, OTHER
}

@Entity
public class Person {

    @Enumerated(EnumType.STRING)
    private Gender gender;
    
}
  • 상태 표현
    특정 속성이 여러 상태 중 하나 일 때 사용할 수 있습니다.
public enum OrderStatus {
    NEW, PROCESSING, SHIPPED, DELIVERED, CANCELLED
}

@Entity
public class Order {

    @Enumerated(EnumType.STRING)
    private OrderStatus status;

}

이처럼 일반 회원과 관리자를 구분하기 위해 고정된 값을 설정하고 데이터베이스 값에 매핑을 하기 위해서 Enum타입을 이용하였다.

2번 요구사항

자바에서 날짜를 나타내는 타입은 Date, Calendar가 있다.
@Temporal어노테이션을 이용하여 매핑할 수 있다.

  • @Temporal 속성
    • TemporalType.DATE : Date 타입과 매핑 ( 예시 : 2024-10-11)
    • TemporalType.TIME : Time 타입과 매핑 ( 예시 : 11:11:11 )
    • TemporalType.TIMESTAMP : timestamp타입과 매핑 ( 예시 : 2024-10-11 11:11:11 )

@Temporal을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의된다.

3번 요구사항

@Lob 어노테이션은 Large Object의 약자로, 필드나 속성이 매우 큰 데이터를 저장하는 데 사용될 때 엔터티 클래스에서 해당 필드를 지정하는 데에 쓰인다.

@Lob 어노테이션의 경우 지정할 수 있는 속성이 없다.
만약 매핑할 필드 타입이 문자면 CLOBㅇ로 매핑하고 나머지는 BLOB으로 매핑한다.

  • CLOB : String, char[], java.sql.CLOB
  • BLOB : byte[] , java.sql.BLOB

애플리케이션 실행 시, 출력된 DDL

Hibernate: 
    drop table MEMBER if exists
Hibernate: 
    create table MEMBER (
        ID varchar(255) not null,
        age integer,
        NAME varchar(255),
        primary key (ID)
    )

생성될 create문

CREATE TABLE MEMBER (
    ID VARCHAR(255) PRIMARY KEY,
    NAME VARCHAR(255),
    ROLE_TYPE VARCHAR(255),
    CREATE_DATE TIMESTAMP,
    UPDATE_DATE TIMESTAMP,
    DESC CLOB
);
profile
Back-End Developer

0개의 댓글

관련 채용 정보