[데브코스] JPA - 단일 Entity Mapping

Updated: Categories:

W8D2 Part2 - Entity 관련 어노테이션과 단일 Entity Mapping에 대해 알아보자

JPA 설정

application.yaml
spring:
  h2:
    console:
      enabled: true
  jpa:
    generate-ddl: true
    database: H2
    show-sql: true
    open-in-view: false
    properties:
      hibernate:
        dialect: org.hibernate.dialect.H2Dialect
        query.in_clause_parameter_padding: true
        hbm2ddl:
          auto: create-drop
  • h2.console : localhost:8080/h2-console 접속시 h2 콘솔 사용가능

hibernate.hbm2ddl

  • auto : App Context가 생성될때 자동으로 엔티티 기반 테이블이 생성되게(마이그레이션) 할 수 있다.
    • 5가지 옵션이 존재
  • 보통 개발/테스트 환경에서만 사용한다.
  • 운영환경에서는 안전하게 validate 속성 사용
옵션 설명
create 기존 테이블을 삭제하고 새로 테이블을 생성한다. (DROP + CREATE)
create-drop 어플리케이션 종료시 생성한 DDL 을 제거한다. (DROP + CRATE + DROP)
update 테이블, 엔티티 매핑정보를 비교하여 변경사항을 수정한다.
validate 테이블, 엔티티 매핑정보를 비교해서 차이가 있으면 경도를 남겨 어플리케이션을 실행하지 않는다.
none 자동 생성 기능을 사용하지 않는다.


@Entity

  • name 지정시 : 엔티티 별명 지정
  • name 생략시 : 클래스명으로 자동 지정
@Entity
@Entity(name = "엔티티명")


@Table

  • 특정 테이블과 엔티티 객체를 매핑해주는 어노테이션
  • 생략 가능하며 생략시 엔티티의 이름과 동일한 테이블이 매핑된다.
@Table(name = "매핑할 테이블명")


@Column

  • 엔티티 객체 내에서 DDL 옵션을 정의할 수 있다.
  • 해당 컬럼의 자세한 속성을 써준다고 생각하면 됨
  • 생략시 DB를 기준으로 엔티티를 생성한다.
  • 실제 서비스 환경에서는 엔티티를 참조해서 테이블을 만드는 경우는 없지만(PC 생성시 DB를 변경하는 경우) 테이블 속성을 알기 위해 써주기도 함
예시
// 엔티티 객체
public class Entity {
  ...
  @Column(name = "컬럼명", nullable = , length = , unique = , )
  필드
  ...
}
속성 기능 Default
name 필드와 매핑할 테이블의 컬럼이름 객체의 필드이름(카멜->스네이크로 변경)
insertable 엔티티 저장시 필드도 같이 수정한다. false 이면 읽기 전용으로 사용한다. true
updateable 엔티티 수정시 필드도 같이 수정한다. false 이면 읽기 전용으로 사용한다. true
nullable (DDL) null 값 허용 여부를 설정한다. false 이면 not null 제약조건이 추가된다. true
unique (DDL) 해당 컬럼의 유니크 제약조건을 추가한다.  
length (DDL) 문자 길이 제약조건으로 사용된다 (String 타입에만 사용) 255

columnDefinition

  • 테이블 속성을 연달아 정의할 수 있음
public class Entity {
  @Column(columnDefinition = "varchar(255) ...")
  필드

  // 다른 속성과 함께 사용가능
  @Column(name = "", length = ,columnDefinition = "TIMESTAMP")
  필드
}


@Id

  • 해당 필드를 PK와 매핑한다.
  • 5가지의 기본키 생성 전략이 존재

직접 할당

  • 영속화하기 전에 필드에 직접 PK 컬럼을 매핑한다
@Id
@Column(name = "컬럼명")
필드

Sequence Strategy

  • ORACLE, H2, PostgreSQL에서만 사용할 수 있는 시퀀스를 사용한 전략
  • DB 시퀀스 생성용 테이블에서 식별자 값을 획득 후 영속화한다.
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE)
필드

Table Strategy

  • DB 시퀀스 생성용 테이블에서 식별자 값을 획득한 후 영속화 (??)
  • 거의 사용하지 않는다.

Identity Strategy

  • MySQLauto_increment와 동일한 기능
  • 엔티티를 영속화하는 시점에 식별자를 삽입하는 insert 쿼리가 수행된다.
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
필드

Auto Strategy

  • DB 방언(dialect)에 따라서(DB 종류와 상관없이) 자동으로 전략을 선택한다.
    • H2 : Sequence 전략 선택
    • MySQL : Identity 전략 선택
  • 보통 Auto 전략을 사용.
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
필드
// 전략을 생략하면 자동으로 Auto 적용
@Id
@GeneratedValue
필드


기타 정의 어노테이션

@Enumerated

  • EnumType을 사용하고 싶을때 사용한다
public class Entity {
  @Enumerated(EnumType.STRING)
  필드
}

@Lob

  • 긴 Text(long-text)를 저장하고 싶을때 사용
public class Entity {
  @Lob
  필드
}