[JPA] Entity Mapping #1

Harry park·2022년 6월 15일
0

JPA

목록 보기
2/8
post-thumbnail

엔티티 매핑

JPA 사용에 있어 가장 중요한 것은 엔티티와 테이블을 정확하게 매핑하는 것이다. 이 때 JPA는 다양한 Annotation을 크게 4가지 분류로 지원하는데 아래와 같다.

매핑종류 대표 어노테이션
객체와 테이블 매핑 @Entity, @Table
기본키 매핑 @Id
필드와 컬럼 매핑 @Column
연관관계 매핑 @ManyToOne, @JoinColumn 등

객체와 테이블 매핑

@Entity

  • JPA로 관리할 클래스는 @Entity 를 필수로 붙여야 하며, Entity 라 부른다.

@Entity 사용시 주의사항

  • 기본 생성자가 필수이다.
    (private을 사용하면 접근을 못하므로, protected로 하는 것이 좋다.)
  • final 클래스, enum, interface, inner 클래스에는 사용 불가하다.
  • 저장할 필드에 final 사용 불가능하다.

📍 Property name
: Default. Class Name이다. 다른 패키지에 동일한 클래스명을 가지는 엔티티가 있는 경우 지정해주어야 충돌하지 않는다.

@Table

  • @Table은 엔티티와 매핑할 테이블을 지정한다.
  • 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

📍 Property name
매핑할 Table이름. Default. Entity name
📍 Property catalog
catalog기능이 있는 DB에서 매핑한다.
📍 Property schema
schema기능이 있는 DB에서 매핑한다.
📍 Property uniqueConstraints(DDL)
유니크 제약 조건 생성.스키마 자동 생성 기능을 사용해서 DDL을 만들 때 사용

Naming Strategy

ImplicitNamingStrategy

암시적 명칭 : 명시적으로 name이 지정되지 않은 Entity들의 명칭을 만들어주는 방식이다.
📍 @Table, @Column 등의 방법으로 명칭을 미리 지정한 경우에는 본 전략이 적용되지 않는다.

[Hibernate ORM Ver.5 ]
The ImplicitNamingStrategy would only be applied if an explicit name was not given.

PhysicalNamingStrategy

물리적 명칭 : 기본값으로는 명시적, 암시적 명칭(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 주의사항
스키마 자동 생성은 데이터베이스의 테이블이나 컬럼을 삭제할 수 있으므로 운영 서버에서는 절대 사용해서는 안 된다.


개인적으로 공부하며 기록한 내용으로, 틀린 내용이 있는 경우 덧글을 달아주시면 감사하겠습니다. 😍

profile
Jr. Backend Engineer

0개의 댓글