[데브코스] JPA - 단일 Entity Mapping
Updated: Categories: TILW8D2 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
MySQL의auto_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
  필드
}