이번 글에서는 객체와 테이블 매핑, 데이터베이스 스키마 자동 생성에 대해 알아보겠습니다.
이 시리즈 글은 김영한 님의 강의, 을 보고 적은 것임을 알려드립니다. (강추)

엔티티 매핑


JPA를 사용하는 데 가장 중요한 일은 엔티티와 테이블을 정확하게 매핑하는 것입니다.
따라서 매핑 어노테이션을 숙지하고 사용해야 합니다. JPA는 다양한 매핑 어노테이션을 지원하는데 크게 4가지로 분류할 수 있습니다.

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

객체와 테이블 매핑


@Entity

  • JPA를 사용해서 테이블과 매핑할 클래스는 @Entity 어노테이션을 필수로 붙여야 합니다.
  • @Entity가 붙은 클래스는 JPA가 관리하고, 엔티티라 부릅니다.
  • @Entity 적용 시 주의사항
    • 기본 생성자가 필수(파라미터가 없는 public 또는 protected 생성자)
    • final 클래스, enum, interface, inner 클래스에는 사용 불가
    • 저장할 필드에 final 사용 불가

@Entity 속성 정리

속성 기능 기본값
name JPA에서 사용할 엔티티 이름을 지정한다. 보통 기본값인 클래스 이름을 사용한다. 만약 다른 패키지에 이름이 같은 엔티티 클래스가 있다면 이름을 지정해서 충돌하지 않도록 해야 한다. 설정하지 않으면 클래스 이름을 그대로 사용

@Table

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

@Table 속성 정리

속성 기능 기본값
name 매핑할 테이블 이름 엔티티 이름을 사용
catalog catalog 기능이 있는 데이터베이스에서 catalog를 매핑한다
schema schema 기능이 있는 데이터베이스에서 schema를 매핑한다
uniqueConstraints (DDL) DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 참고로 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들 때만 사용된다.

데이터베이스 스키마 자동 생성


JPA는 데이터베이스 스키마를 자동으로 생성하는 기능을 지원합니다. (애플리케이션 실행 시점에 자동 생성)
JPA는 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL을 생성합니다.
하지만 이렇게 생성된 DDL은 개발 장비에서만 사용해야 합니다. 생성된 DDL은 운영서버에서는 사용하지 않거나, 적절히 다듬은 후에 사용해야 합니다.

hibernate.hbm2ddl.auto 속성

옵션 설명
create 기존 테이블을 삭제하고 새로 생성한다. DROP + CREATE
create-drop create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거한다. DROP + CREATE + DROP
update 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다.
validate 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 애플리케이션을 실행하지 않는다. 이 설정은 DDL을 수정하지 않는다.
none 자동 생성 기능을 사용하지 않으려면 hibernate.hbm2ddl.auto 속성 자체를 삭제하거나 유효하지 않은 옵션 값을 주면 된다(참고로 none은 유효하지 않은 옵션 값)

사용 방법

persistence/xml에 다음 속성을 추가하면 됩니다. value에는 create, create-drop, update, validate 등의 옵션을 넣어주면 됩니다.

<property name="hibernate.hbm2ddl.auto" value="여기에 옵션" />

주의사항

  • 운영 장비에는 절대 create, create-drop, update를 사용하면 안됩니다.
    이 옵션들은 운영 중인 데이터베이스의 테이블이나 컬럼을 삭제할 수 있기 때문입니다.
  • 개발 초기 단계는 create 또는 update
  • 테스트 서버는 update 또는 validate
  • 스테이징과 운영 서버는 validate 또는 none