자바 ORM 표준 JPA 프로그래밍 4장

04 엔티티 매핑

@Entity

JPA를 사용해 테이블과 매핑할 클래스

  • @Entity가 붙은 클래스는 JPA가 관리한다.
  • 기본 생성자는 필수다.
    • JPA가 엔티티 객체를 생성할 때 기본 생성자를 사용하기 때문
  • final 클래스, enum, interface, inner 클래스에는 사용할 수 없다.
  • 저장할 필드에 final을 사용하면 안된다.

@Table

엔티티와 매핑할 테이블을 지정

  • 생략하면 매핑한 엔티티 이름을 테이블 이름으로 사용한다.

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

JPA는 클래스의 매핑 정보와 데이터베이스 방언을 사용해 데이터베이스 스키마를 생성한다.

  • 개발자가 테이블을 직접 생성하는 수고를 덜 수 있다.
  • 스키마 자동 생성 기능이 만든 DDL은 운영 환경에서 사용할 만큼 완벽하지 않다.
    • 개발 환경에서 사용하거나 매핑을 어떻게 해야 하는지 참고하는 정도만 사용하는 것이 좋다.
  • spring.jpa.hibernate.ddl-auto 종류
    • create: 기존 테이블을 삭제하고 새로 생성 (DROP + CREATE)
    • create-drop: create 속성에 추가로 애플리케이션을 종료할 때 생성한 DDL을 제거 (DROP + CREATE + DROP)
    • update: 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정
    • validate: 데이터베이스 테이블과 엔티티 매핑정보를 비교해 차이가 있는 경우 경고를 남기고 애플리케이션을 실행하지 않는다. DDL을 수정하지 않는다.
    • none: 자동 생성 기능을 사용하지 않는다.

기본 키(Primary Key) 매핑

  1. 직접 할당
    • 기본 키를 애플리케이션에서 직접 할당한다.
    • @Id만 사용한다.
      • 자바 기본형이나 자바 Wrapper형만 적용 가능하다.
    • em.persist()를 호출하기 전에 애플리케이션에서 직접 식별자 값을 할당해야 한다.
  2. 자동 생성
    • 대리 키 사용 방식
    • @Id와 @GeneratedValue를 사용한다.
    • 종류
      1. IDENTITY
        • 기본 키 생성을 데이터베이스에 위임한다.
        • 주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용한다.
        • 데이터베이스에 값을 저장하고 나서야 기본 키 값을 구할 수 있다.
        • 영속 상태가 되기 위해서는 식별자가 필요하기 때문에, em.persist()를 호출하는 즉시 INSERT SQL이 데이터베이스에 전달된다.
      2. SEQUENCE
        • 데이터베이스 시퀀스를 사용해 기본 키를 할당한다.
        • 시퀀스를 지원하는 오라클, PostgreSQL, DB2, H2에서 사용할 수 있다.
        • em.persist()를 호출할 때 먼저 데이터베이스 시퀀스를 사용해 식별자를 조회한다. 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다. 이후 flush가 일어나면 엔티티를 데이터베이스에 저장한다.
          • 시퀀스에 접근하는 횟수를 줄이기 위해 @SequenceGenerator.allocationSize를 사용한다. 설정한 값만큼 한 번에 시퀀스 값을 증가시키고 나서 그만큼 메모리에 시퀀스 값을 할당한다.
      3. TABLE
        • 키 생성 테이블을 사용한다.
        • 모든 데이터베이스에 적용할 수 있다.
        • 시퀀스 대신 테이블을 사용한다는 것만 제외하면 SEQUENCE 전략과 내부 동작방식이 같다.
      4. AUTO
        • 선택한 데이터베이스 방언에 따라 IDENTITY, SEQUENCE, TABLE 전략 중 하나를 자동으로 선택한다.
        • 데이터베이스를 변경해도 코드를 수정할 필요가 없다.

Tags:

Categories:

Updated: