본문 바로가기
Study/JPA

[JPA] Entity 필드, 컬럼 매핑

by DevJaewoo 2022. 3. 5.
반응형

JPA Hibernate LOGO

Intro

JPA에서 영속성 컨텍스트와 함께 가장 중요한 개념인 엔티티 매핑이다.

Java의 클래스와 DB의 테이블을 변환해주고, 옵션을 설정하기에 따라 테이블을 자동으로 생성해주기도 한다.

 

아래의 간단한 클래스를 테이블로 매핑해보자.

Entity의 경우 protected 또는 public기본 생성자반드시 있어야 하며, 클래스 또는 저장할 필드에 final을 붙이면 안된다.

 

@Getter
@Setter
@NoArgsConstructor
public class Member {
    private Long id;
    private String name;
    private String password;
}

@Entity, @Table

우선 "이 클래스가 엔티티이며, JPA에서 관리하도록 하겠다" 라는 의미를 부여하기 위해 @Entity 어노테이션을 추가해야 한다.

만약 DDL 생성 옵션이 켜져있으면 클래스 이름 그대로 테이블이 생성되지만,

@Table 어노테이션을 추가해 테이블 명을 명시적으로 지정해줄 수 있다.

@Table의 속성 종류는 아래와 같다.

@Table 속성 종류

@Entity
@Table(name="member_table")
@Getter
@Setter
@NoArgsConstructor
public class Member {
    private Long id;
    private String name;
    private String password;
}

@ID, @GeneratedValue

Entity에는 ID 컬럼이 반드시 들어가야 한다.

ID로 설정하고 싶은 컬럼에는 @Id 어노테이션을 추가해주면 된다.

또한 ID 컬럼에는 고유한 값을 자동으로 생성해주는 @GeneratedValue 어노테이션을 붙일 수 있다.

@GeneratedValue 어노테이션이 있으면 값이 자동 생성되기 때문에 ID 값을 주지 않아도 된다.

 

ID는 DB 생성 시 Primary Key로 생성되는데, PKNOT NULL, 유일 (Unique), 불변 (Immutable)의 제약조건을 갖고 있다. 미래까지 위의 3가지 제약조건을 만족하는 자연키를 찾기 힘들기 때문에, Long형 키를 자동으로 생성하여 사용하는 방법이 권장된다.

 

@Entity
@Table(name="member_table")
@Getter
@Setter
@NoArgsConstructor
public class Member {
    @Id @GeneratedValue
    private Long id;
    private String name;
    private String password;
}

@Column

namepassword의 경우 현재 아무런 설정이 되어있지 않다.

이 상태에선 변수명 그대로의 컬럼으로 매핑되는데, 만약 컬럼명을 바꾸고 싶을 경우 @Column 어노테이션을 통해 원하는 이름으로 바꿀 수 있다.

namemember_name으로, passwordmember_password로 바꿔보자.

 

@Column의 속성 종류는 아래와 같다.

@Column 속성 종류

@Entity
@Table(name="member_table")
@Getter
@Setter
@NoArgsConstructor
public class Member {
    @Id @GeneratedValue
    private Long id;
    
    @Column(name="member_name")
    private String name;
    
    @Column(name="member_password")
    private String password;
}

 

아래와 같이 컬럼명이 바뀌는것을 볼 수 있다.

컬럼명 변경 결과


@Enumerated

JavaEnum 타입도 @Enumerated 어노테이션을 통해 매핑할 수 있다.

@Enumerated의 경우 2가지 타입이 있는데, Enum 순서를 DB에 저장하는 ORDINALEnum 이름을 DB에 저장하는 STRING이 있다.

EnumType.ORDINAL의 경우 Enum의 값이 달라지면 기존 DB에 있던 값의 의미가 달라지므로 사용하지 않는것을 권장한다.

 

@Enumerated(EnumType.ORDINAL)
private RoleType roleType;
//또는
@Enumerated(EnumType.STRING)
private RoleType roleType;

@Temporal

JavaDateCalendar를 매핑할 때 사용한다.

Date, Calendar는 날짜와 시간을 모두 포함하지만, DB는 DATE, TIME, TIMESTAMP로 구분되어있기 때문에 어떤 타입인지 명시해줘야 한다.

LocalDate, LocalDateTime을 사용할 때는 @Temporal을 생략해도 된다.

LocalDateDATE, LocalDateTimeTIMESTAMP로 매핑된다.

 

@Temporal(TemporalType.DATE)
private Date date;
//또는
@Temporal(TemporalType.TIME)
private Date date;
//또는
@Temporal(TemporalType.DATETIME)
private Date date;

//Temporal 생략 가능
private LocalDate date;
private LocalDateTime datetime;

@Lob

VARCHAR(255), CHAR(50) 들과는 다르게 길이를 명시할 수 없는 긴 데이터를 매핑할 때 사용한다.

String에 매핑할 경우 CLOB, byte[]에 매핑할 경우 BLOB으로 매핑된다.

 

//CLOB
@Lob
private String description;

//BLOB
@Lob
private byte[] token;

@Transient

DB에 매핑하지 않고 그냥 클래스의 변수로만 사용하고 싶을 때 @Transient 어노테이션을 추가하면 된다.

 

@Transient
private String temporal;

출처

반응형

'Study > JPA' 카테고리의 다른 글

[JPA] 상속관계 매핑  (0) 2022.08.26
[JPA] 연관관계 매핑  (0) 2022.08.25
[JPA] 영속성 컨텍스트  (0) 2022.03.05
[JPA] DB에 데이터 넣어보기  (0) 2022.02.26
[JPA] JPA 프로젝트 설정  (0) 2022.02.26