섭섭한 개발일지

[필기용] 자바 ORM 표준 JPA 프로그래밍 Ch04 본문

프로그래밍/JPA

[필기용] 자바 ORM 표준 JPA 프로그래밍 Ch04

Seop 2023. 1. 30. 12:00

git : https://github.com/Dev-Chaee/Java_JPABook/tree/ch04-jpa

CHAPTER 04

[ 엔티티 매핑 ]

  • @Entity :
    • JPA를 사용해 테이블과 매핑할 클래스는 반드시 이 어노테이션을 사용해야 한다.
      • 속성
        • name : 사용할 엔티티 명을 지정한다. 설정하지 않은 경우 클래스명으로 정해진다.
      • 기본생성자는 필수, 저장할 필드에 final을 사용하면 안된다.
  • @Table :
    • 엔티티와 매핑할 테이블을 지정하는 어노테이션이다. 생략할 경우 매핑한 엔티티 이름을 테이블 이름으로 사용한다.
      • 속성
        • name : 매핑 테이블 이름
        • catalog : catalog 기능이 있는 데이터베이스에서 catalog 를 매핑한다.
        • schema : schema 기능이 있는 데이터베이스에서 schema 를 매핑한다.
        • uniqueConstraints : DDL 생성 시에 유니크 제약조건을 만든다. 2개 이상의 복합 유니크 제약조건도 만들 수 있다. 이 기능은 스키마 자동 생성 기능을 사용해서 DDL을 만들
          때만 사용된다.
  • @Enumerated :
    • 이넘 타입을 사용하기 위해서는 해당 어노테이션을 선언해야 한다.
      • 속성
        • STRING : 값을 enum에 있는 자체(문자)로 저장한다.
        • ORDINAL : 값을 저장할때 순번으로 저장을 한다. (보통 사용하지 않는다.)
  • @Temporal :
    • 자바의 날짜 타입은 위 어노테이션을 붙여서 사용한다.
  • @Lob :
    • 문자열 제한 없이 디비에 저장을 하기 위해서는 VARCHAR가 아닌 CLOB로 저장해야하여 위와 같은 어노테이션을 사용한다.
      Lob을 사용하면 CLOB, BLOB 타입으로 매핑할 수 있다.
  • ddl auto
    • create : 기존 테이블을 삭제하고 새로 생성한다.
    • create-drop : create의 기능에서 앱이 종료될 때 생생한 DDL을 제거하는 기능 추가
    • update : 데이터베이스 테이블과 엔티티 매핑정보를 비교해서 변경 사항만 수정한다.
    • validate : 테이터베이스 테이블과 엔티티 매핑정보를 비교해서 차이가 있으면 경고를 남기고 앱을 실행하지 않는다.
    • none : 자동 생성 기능을 사용하지않게 한다. 보통은 그냥 ddl auto 속성 자체를 삭제한다고 한다.
    • 개발환결별 추천 속성 (JPA2.1부터는 update와 validate 옵션을 지원하지 않는다고 한다)
      • 개발 초기 단계 : create, update
      • 초기화 상태로 테스트를 진행하는 환경 : create, create-drop
      • 테스트 서버 : update, validate
      • 스테이징과 라이브 서버 : validate, none
  • 이름 매핑 전략
    • 카멜 표기법을 언더스코어 표기법으로 변경, 하이버네이트 5에서는 아래 명령어로 가능하다.
      <property name="hibernate.physical_naming_strategy" value="org.hibernate.boot.model.naming.CamelCaseToUnderscoresNamingStrategy"/>
  • 제약조건
    • @Column 속성에 다양한 제약 조건을 추가할 수 있다.
      • nullable = false : NOT NULL
      • length : 길이 제한
    • @Table에 유니크 제약 조건 주는 방법
    • @Table(name = "MEMBER", uniqueConstraints = {@UniqueConstraint( name = "NAME_AGE_UNIQUE", columnNames = {"NAME", "AGE"} )})
  • 기본 키
    • 기본키는 직접할당과 자동할당 크게 두가지로 나뉘어져 있다.
    • 자동 할당 전략으로 변경하기 위해 persistence.xml에 아래의 속성을 true로 해주어야 한다.
      하이버네이트는 JPA 규격에 맞는 키생성 전략을 개발했는데 과거의 버전과의 호환성을 맞추기 위하여 아래 속성의 기본 값을 false로 두었다.
      • 기본 키 자동 생성 전략
        • IDENTITY : 기본 키 생성을 데이터베이스에 위임한다.
          • 주로 MySQL, PostgreSQL,SQL Server, DB2에서 사용한다. 이 전략은 AUTO_INCREMENT 와 같은 것이다.
          • 이 전략은 INSERT가 된 후에 ID값을 조회할 수 있다. 그렇기에 JPA가 데이터베이스를 추가로 조회를 해야 값을 알 수 있다는 것이다.
            JDBC3에 추가된 getGeneratedKeys() 를 사용하면 데이터를 저장하면서 동시에 생성된 기본 키를 얻어올 수 있다.
            하이버네이트는 이 메소드를 사용해서 데이트베이스와 한번만 통신을 한다.
          • 엔티티는 영속 상태가 되기 위해서는 기본키 값이 있어야 한다. 이 전략의 경우 persist를 함과 동시에 DML이 전송되므로 트랜잭션이 지원하는 쓰기 지연이 동작하지 않는다.
        • SEQUENCE : 데이터베이스 시쿼스를 사용해서 기본 키를 할당한다.
          • 시퀀스는 유일한 값을 순서대로 생성한다.
          • 이는 오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용한다.
          • @Entity @SequenceGenerator( name = "BOARD_SEQ_GENERATOR", sequenceName = "BOARD_SEQ", initialValue = 1, allocationSize = 1 ) public class Board { @Id @GeneratedValue(strategy = GenerationType.SEQUENCE) private Long id; }
        • 시퀀스 전략은 IDENTITY와는 조금 다르다. 시퀀스 전략은 persist를 호출할 때 먼저 데이터베이스 시퀀스를 사용해서 식별자를 조회한다
          그리고 조회한 식별자를 엔티티에 할당한 후에 엔티티를 영속성 컨텍스트에 저장한다. 이후 트랜잭션을 커밋해서 플러시가 일어난다.
        • 속성
          • name : 식별자 생성기 이름
          • sequenceName : 데이터베이스에 등록되어 있는 시퀀스 이름
          • initialValue : DDL 생성 시에만 사용됨, 시퀀스 DDL을 생성할 때 처음 시작하는 수를 지정한다
          • allocationSize : 시퀀스 한 번 호출에 증가하는 수
          • catalog, schema : 데이터베이스 catalog, schema 이름
    • <!-- 키 생성 전략 --> <property name="hibernate.id.new_generator_mappings" value="true"/>
    • TABLE : 키 생성 테이블을 사용한다.
      • 테이블 전략은 키 생성 전용 테이블을 하나 만들고 여기에 이름과 값으로 사용할 컬럼을 만들어 시쿼스를 흉내내는 전략이다.
        이 전략은 테이블을 사용하므로 모든 데이터베이스에서 적용할 수 있다.
      • 속성
        • name : 식별자 생성기 이름
        • table : 키생성 테이블명
        • pkColumnName : 시퀀스 컬럼명
        • valueColumnName : 시퀀스 값 컬럼명
        • pkColumnValue : 키로 사용할 값 이름
        • initialValue : 초기 값, 마지막으로 생성된 값이 기준이다.
        • allocationSize : 시퀀스 한 번 호출에 증가하는 수
        • catalog, schema : 데이터베이스 catalog, schema 이름
        • uniqueConstraints(DDL) : 유니크 제약 조건을 지정할 수 있다.
    • AUTO 전략
      • 데이터베이스 종류도 많고 기본 키를 만드는 방법도 다양하다. Auto 속성은 데이터베이스에 따라 전략을 자동으로 선택한다.
      • strategy의 기본 속성이 auto이다.
    • 정리
      • 영속성 컨텍스트는 엔티티를 식별자로 구분하므로 영속상태로 만들려면 식별자 값이 있어야 한다.
      • 권장 식별자 선택 전략
        • 기본 키 값 조건
          • NOT NULL
          • UNIQUE
          • 불변
      • 테이블의 기본키를 선택하는 전략은 크게 2가지가 있다.
        • 자연키
          • 비즈니스에 의미가 있는 키
            • 예 : 주민등록번호, 이메일, 전화번호
        • 대리키
          • 비즈니스와 관련 없는 임의로 만들어진 키, 대체 키로도 불린다.
            • 예 : 오라클 시퀀스, AUTO_INCREMENT, 키생성 테이블 사용
    • 자연키보다는 대리키를 권장한다.
  • 필드와 컬럼 매핑 레퍼런스 정리한 내용이 책ㄱ 145p에 있으므로 필요한 매핑이 있을 때 찾아서 자세히 읽어보는 것을 권장한다.
Comments