JPA 사용에 있어 가장 중요한 것은 엔티티와 테이블을 정확하게 매핑하는 것이다. 이 때 JPA는 다양한 Annotation
을 크게 4가지 분류로 지원하는데 아래와 같다.
매핑종류 | 대표 어노테이션 |
---|---|
객체와 테이블 매핑 | @Entity, @Table |
기본키 매핑 | @Id |
필드와 컬럼 매핑 | @Column |
연관관계 매핑 | @ManyToOne, @JoinColumn 등 |
기본 생성자
가 필수이다.protected
로 하는 것이 좋다.)final 클래스
, enum
, interface
, inner 클래스
에는 사용 불가하다.final
사용 불가능하다.📍 Property name
: Default. Class Name
이다. 다른 패키지에 동일한 클래스명을 가지는 엔티티가 있는 경우 지정해주어야 충돌하지 않는다.
📍 Property name
매핑할 Table이름. Default. Entity name
📍 Property catalog
catalog
기능이 있는 DB에서 매핑한다.
📍 Property schema
schema
기능이 있는 DB에서 매핑한다.
📍 Property uniqueConstraints(DDL)
유니크 제약 조건 생성.스키마 자동 생성 기능을 사용해서 DDL을 만들 때 사용
암시적 명칭 : 명시적으로 name
이 지정되지 않은 Entity
들의 명칭을 만들어주는 방식이다.
📍 @Table, @Column 등의 방법으로 명칭을 미리 지정한 경우에는 본 전략이 적용되지 않는다.
[Hibernate ORM Ver.5 ]
The ImplicitNamingStrategy would only be applied if an explicit name was not given.
물리적 명칭 : 기본값으로는 명시적, 암시적 명칭(logical_name)을 그대로 사용하며 이를 변경하려면 PhysicalNamingStrategy 인터페이스나 해당 자식들을 상속받아 정의하여야 한다.
spring:
jpa:
database-platform: org.hibernate.dialect.MySQL5InnoDBDialect
properties:
hibernate:
implicit_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringImplicitNamingStrategy
physical_naming_strategy: org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy
: JPA는 매핑 정보와 DB dialect
를 사용해서 DB Schema
를 자동으로 생성하는 기능을 지원한다.
이 기능을 사용하기 위해서는 아래의 속성을 추가해야한다.
📎 persistence.xml
추가하는 경우
<property name="hibernate.hbm2ddl.auto" value="create" />
📎 yml
추가하는 경우
spring:
jpa:
properties:
hibernate:
hbm2ddl.auto: update
옵션 | 설명 |
---|---|
create | - 기존 테이블을 삭제하고 새로 생성 - Drop table + Create Table |
create-drop | - create 속성 기능에 추가로 어플리케이션이 종료될 때 생성된 테이블을 제거 - DROP TABLE + CREATE TABLE + [어플리케이션 종료] DROP TABLE |
update | - DB 테이블과 Entity 매핑 정보를 비교하여 변경 사항만 반영 |
validate |
- DB Table과 Entity 매핑 정보를 비교해서 차이가 있으면 경고를 남기고, 어플리케이션 실행을 하지 않는다. - DDL 없음 |
none |
- Schema 자동생성 비활성화
- hibernate.hbm2ddl.auto 속성을 삭제하거나, 유효하지 않는 옵션 값 부여할 경우 |
🚨 HBM2DDL 주의사항
스키마 자동 생성은 데이터베이스의 테이블이나 컬럼을 삭제할 수 있으므로 운영 서버에서는 절대 사용해서는 안 된다.
개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍