[데브코스] 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
필드
}