Entity Mapping

개발하는 도비·2023년 4월 27일

JPA

목록 보기
4/13
post-thumbnail

mapping 종류

  • 객체와 테이블 : @Entity, @Table
  • 필드와 컬럼 : @Column, @Temporal, @Enumerated, @Lob, @Transient
  • 기본 키 : @Id, @GeneratedValue
  • 연관관계 : @ManyToOne, @JoinColumn, insertable

객체와 테이블 mapping

@Entity

  • JPA가 관리하는 entity
  • 속성 : name
    • JPA에서 사용할 entity 이름 지정
    • default : 클래스 명

@Table

  • entity와 mapping할 table 지정
  • 속성
    • name
    • catalog
    • schema
    • uniqueConstraints (DDL)

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

  • hibernate.hbm2ddl.auto
  • 속성
    • create : 기존 table 삭제 후 생성
    • create-drop : create 같음 + 종료시점에 table 삭제
    • update : 변경 부분만 반영
    • validate : mapping이 정상적인지만 확인
    • none : 사용 x
  • 주의 사항
    • 개발 초기 : create or update
    • 테스트 : update or validate
    • 운영 : validate or none

필드와 컬럼 mapping

  • @Column : 컬럼 mapping
  • @Temporal : 날짜 타입 mapping
  • @Enumerated : enum 타입 mapping
  • @Lob : BLOB, CLOB mapping
  • @Transient : mapping 무시
    • DB에 저장하지 않고 memory에서만 관리하고 싶을 때 사용.

@Column

  • @Column 속성
    • name
      • table의 컬럼 이름
    • insertable
      • 등록 가능 여부
      • default : TRUE
    • updatable
      • 변경 여부
      • default : TRUE
    • nullable(DDL)
      • NULL 가능 여부
    • unique(DDL)
    • columnDefinition (DDL)
      • 컬럼 정보 직접 적용
    • length(DDL)
      • 길이
      • Strin에만 적용
      • defailt : 255
    • precision
      • 큰 값이나 소숫점에 사용.
      • default : 19
    • scale(DDL)
      • 큰 값이나 소숫점에 사용.
      • default : 2

@Enumerated

  • @Enumerated 속성
    • EnumType.ORDINAL : enum 순서를 저장
      • default 값
    • EnumType.STRING : enum 이름을 저장
  • EnumType.STRING의 사용의 필요성
    • enum이 업데이트 될 경우 순서를 저장하기에 값이 제대로 적용되지 않을 수 있음
    • 대부분 사용

@Temporal

  • @Temporal 속성
    • TemporalType.DATE : 날짜
      • ex) 2023–04–28
    • TemporalType.TIME : 시간
      • ex) 12:00:01
    • TemporalType.TIMESTAMP : 날짜와 시간
      • ex) 2023–04–28 12:00:01
  • 3개 중 하나를 반드시 mapping

@Lob

  • @Lob 속성
    • CLOB : String, char[], java.sql.CLOB
    • BLOB : BLOB: byte[], java.sql. BLOB
    • 자동 mapping

@Transient

  • mapping X
  • DB에 저장이나 조히 X
  • 메모리상에서 임시로 저장할 때 사용.

기본 키 mapping

  • @Id
  • @GeneratedValue

@Id

  • 직접 할당

@GeneratedValue

  • 자동 생성

  • @GeneratedValue

    • IDENTITY
      • 기본키 생성을 DB에 위임
      • MySQL, PostgreSQL, SQL Server, DB2
      • 예외적으로 commit()하기 전에 persist()만 하더라도 DB에 쿼리를 보냄.
    • SEQUENCE
      • 오라클, PostgreSQL, DB2, H2
      • persist()시에 DB에서 시퀀스를 먼저 가져와야함.
      • @SequenceGenerator로 시퀀스를 관리할 수 있음.
        • name : 이름
          • 필수 파라미터
        • sequenceName :
          • DB에 등록되어 있는 시퀀스 이름
          • default : hibernate_sequence
        • initialValue :
          • DDL 생성 시에만 사용
          • default : 1
        • allocationSize : 시퀀스 호출당 증가 수
          • default : 50
        • catalog : DB catalog 이름
        • schema : DB schema 이름
    • TABLE
      • 키 생성 전용 테이블을 만들어서 DB 시퀀스
      • table을 쓰다보니 성능 이슈 존재
      • @TableGenerator로 테이블을 관리할 수 있음.
        • name : 이름
          • 필수 파라미터
        • table : 키를 생성하는 테이블 명
          • default : hibernate_sequences
        • pkColumnName : 시퀀스 컬럼명
          • default : sequence_name
        • valueColumnNa : 시퀀스 값 컬럼명
          • default : next_val
        • pkColumnValue : 키로 사용할 값 이름
          • default : entity 이름
        • initialValue : 초기 값
          • default : 0
        • allocationSize: 시퀀스 호출당 증가 수
          • default : 50
        • catalog : DB catalog 이름
        • schema : DB schema 이름
        • uniqueConstraints(DDL) : 유니크 제약 조건
    • AUTO
      • DB 유형에 따라 알아서 생성
  • 식별자 전략 사항

    • 기본키 제약 조건 : NULL X, 유일한 값, 변함 X
    • 권장 : Long 타입 + 대체키 + 키
  • 성능위한 파라미터 allocationSize

      1. 처음 persist()시 식별자를 구하기 위해 DB의 시퀀스를 두 번 호출 -> 1, 1 + allocationSize
      • 1 ~ 1 + allocationSize는 JPA가 메모리에서 관리할 범위
      • 해당 범위에서는 시퀀스를 호출하지 않고 메모리해서 할당
      1. 할당 범위를 초과하는 시점에 다시 allocationSize만큼을 다시 DB 시퀀스 호출
    • 웹서버를 내리는 순간 메모리가 날아가 숫자의 구멍이 생김 -> 효율을 위해 무조건 크기를 늘릴 수 없음

참조

  • 인프런 : 자바 ORM 표준 JPA 프로그래밍 - 기본편
  • 링크
profile
도비의 양말을 찾아서

0개의 댓글