JPA에서 사용하는 엔티티 매핑에 대해 알아보겠습니다.

  • 객체와 테이블 매핑 
  • 기본키 매핑
  • 필드와 컬럼 매핑 

객체와 테이블 매핑

  • @Entity
  • @Table

 

@Entity

  • 테이블과 매핑할 클래스에 @Entity를 붙입니다.

 

@Entity 속성

속성 기능 기본값
name JPA에서 사용할 엔티티 이름을 지정하고 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야합니다. 설정하지 않으면 클래스 이름 그대로 사용합니다.
@Entity
public class Jpa {
}

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

 

@Entity 적용 시 주의 사항

  • 접근 지정자가 public 또는 protected인 기본 생성자가 필수입니다.
  • final 클래스, enum, interface, inner 클래스에 사용이 불가능합니다.
  • 저장할 필드에 final을 사용하면 안 됩니다.

 

@Table

  • 엔티티와 매핑할 테이블을 지정합니다.
  • 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용합니다.
속성 기능 기본값
name 매핑할 테이블 이름 엔티티 이름을 사용합니다.
uniqueConstraints DDL 생성시 유니크 제약조건을 만들고 2개이 상의 복합 유니크 제약조건도 만들 수 있습니다. 스키마 자동생성 기능을 사용해서 DDL을 만들 때만 사용합니다.  
schema schema 기능이 있는 데이터베이스에서 schema를 매핑합니다.  
catalog catalog 기능이 있는 데이터베이스에서 catalog를 매핑합니다.  
@Entity
@Table(name = "JPA_TABLE")
public class Jpa {
}

 

 

기본키 매핑

@Id

  • 테이블에서 기본키로 사용할 필드에 @Id를 써줍니다.
@Entity
@Table(name = "JPA_TABLE")
public class Jpa {

    @Id
    private Long primaryKey;
}

 

필드와 컬럼 매핑

  • @Column
  • @Enumerated
  • @Temporal
  • @Transient

@Column

  • 객체의 필드를 테이블의 컬럼에 매핑합니다.
속성 기능 기본값
name 필드와 매핑할 테이블의 컬럼 이릅 객체의 필드 이름
insertable(거의 사용X) 엔티티 저장시 이 필드도 같이 저장됩니다. 기본값이 true인데 false로 설정할경우 저장이 안되고 읽기 전용일때 사용합니다. true
updatable(거의 사용X) 엔티티 수정시 이필드도 같이 수정됩니다. 기본값이 true인데 false로 할경우 수정이 안되고 읽기 전용일때 사용합니다. true
nullable null값의 허용 여부를 설정합니다. false로 설정하면 DDL 생성시에 not null 제약조건이 붙습니다. true
lentgh 문자 길이 제약조건이고 String 타입에만 사용합니다 255
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Entity
@Table(name = "JPA_TABLE")
public class Jpa {
    @Id
    private Long id;

    @Column(name = "USER_NAME", nullable = false, length = 10)
    private String name;
}

 

※ 결과 쿼리문

 

create table JPA_TABLE (
       id bigint not null,
        USER_NAME varchar(10) not null,
        primary key (id)
    )

 

  • @Column 생략 시 USER_NAME => name

 

@Enumerated

  • enum(열거형) 타입을 매핑할 때 사용합니다.
속성 기능 기본값
value - EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
- EnumType.STRING : enum 이름을 데이터베이스에 저장
EnumType.ORDINAL

 

public enum JpaEnum {
    ADMIN, GUEST
}
@Entity
@Table(name = "JPA_TABLE")
public class Jpa {
    @Id
    private Long id;

    @Column(name = "USER_NAME", nullable = false, length = 10)
    private String name;
    
    
    // 데이터베이스에 enum 순서대로 저장
    // 만약 ADMIN이면 1 GUEST이면 2
    @Enumerated(EnumType.ORDINAL)
    private JpaEnum jpaEnum;

    // 데이버테이스에 enum에 저장한 이름대로 저장
    // ADMIN, GUEST
    @Enumerated(EnumType.STRING)
    private JpaEnum jpaEnum;
}

 

※ @Enumerate를 사용할 때 주의사항 및 추천

 

EnumType.ORDINAL을 사용할 때는 조심해야 됩니다. 왜냐하면 enum 순서대로 데이터베이스에 저장되기 때문입니다.

만약 ADMIN, GUEST만 있던 상황에서 ADMIN을 데이터베이스에 저장할 경우 1로 저장됩니다.

그런데 만약 MANAGER, ADMIN, GUEST에서 ADMIN을 저장을 하면 데이터베이스에 처음과 다른 값인 2과 저장이 됩니다.

그래서 EnumType.ORDINAL보다는 EnumType.STRING를 사용하는 것을 추천드립니다. EnumType.STRING은 어떤 값이 들어와도 순서와 무관해서 데이터베이스에 원하는 값이 저장이 됩니다.

 

@Temporal

  • 날짜 타입을 매핑할 때 사용합니다.
속성 기능 기본값
value - TemporalType.DATE : 날짜를 나타내고 데이터베이스 date타입과 매핑을 합니다. (예 : 2022-01-25)

- TemporalType.TIME : 시간을 나타내고 데이터베이스의 time 타입과 매핑합니다. (예 : 00:25:11)

- TemporalType.TIMESTAMP : 날짜와 시간을 같이 나타내고 데이터베이스 timestamp 타입과 매핑합니다(예 : 2022-01-25 00: 25: 11)
TemporalType은 필수로 지정해야합니다.

 

@Transient

  • 객체에 임시로 어떤 값을 보관하고 싶을 때 사용하고 데이터베이스에 저장하지 않고 조회하지도 않습니다.
    @Transient
    private Long not;