백엔드/Spring

[Spring] JPA 엔티티 매핑

kwang2134 2024. 9. 9. 15:44
728x90

엔티티 매핑 Entity Mapping

  • 데이터베이스 테이블과 자바 객체 간의 관계를 정의하는 과정

객체와 테이블 매핑

  • @Entity 어노테이션을 사용하여 클래스가 엔티티임을 표시
  • 기본 생성자가 필수로 존재
  • abstract 클래스 사용 가능
  • final 클래스, enum, interface, inner 사용불가
  • 내부 필드 변수 final 사용 불가

@Entity

  • 해당 클래스를 엔티티로 사용
  • 속성
    • name: JPA에 사용할 엔티티 이름 정의(기본값 클래스 이름)

@Table

  • 엔티티와 매핑할 테이블 지정
  • 속성
    • name: 매핑할 테이블 이름 설정, (기본값 엔티티 이름)
    • catalog: 데이터베이스 카탈로그를 지정
    • schema: 데이터베이스 스키마를 지정
    • uniqueConstraints(DDL): DDL 생성 시에 유니크 제약 조건 생성

@Entity와 @Table을 통한 DDL 자동 생성

  • 매핑된 어노테이션을 기반으로 애플리케이션 실행 시점 DDL 자동 생성
  • 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
  • 자동 생성 속성 - spring.jpa.hibernate.ddl-auto
    • create: 기존테이블 삭제 후 다시 생성 (DROP + CREATE)
    • create-drop: create와 같으나 종료시점에 테이블 DROP
    • update: 기존 데이터베이스 스키마를 업데이트하여 엔티티 클래스와 매핑
    • validate: 데이터베이스 스키마가 엔티티와 일치하는지 검증만 수행
    • none: 아무런 작업도 수행하지 않음
  • @Column: 제약 조건 추가에 사용
    • 속성
    • name: 데이터베이스 테이블의 컬럼 이름을 지정
    • insertable, updatable: 삽입 변경 가능 여부 지정(기본값 true)
    • length: 문자열 타입의 컬럼 길이를 지정(기본값 255)
    • nullable: 컬럼이 NULL 값을 허용하는지 여부를 지정(기본값 true)
    • unique: 컬럼의 값이 유일해야 하는지 여부를 지정(기본값 false)
    • precision: 숫자 타입의 컬럼에 대한 전체 자릿수(소수점 포함)를 지정, 주로 BigDecimal 타입에 사용
    • scale: 숫자 타입의 컬럼에 대한 소수점 이하 자릿수를 지정 , 주로 BigDecimal 타입에 사용
  • @Temporal: 날짜 타입 매핑
    • 속성
    • value: 날짜와 시간의 형식 지정
    • TemporalType.DATE: 날짜(연, 월, 일)
    • TemporalType.TIME: 시간(시, 분, 초)
    • TemporalType.TIMESTAMP: 날짜와 시간 모두
    • LocalDate, LocalTime, LocalDateTime 사용시 어노테이션 불필요
  • @Enumerated: Enum 타입 매핑
    • 속성
    • value: Enum Type 설정
    • EnumType.ORDINAL: 열거형 값의 순서(정수)가 저장(기본값) -> 순서 변경시 데이터 불일치 가능성 큼
    • EnumType.STRING: 열거형 값의 이름이 저장(권장)
  • @Lob: BLOB, CLOB 대용량 객체 매핑
  • @Transient: 해당 필드를 컬럼에 매핑하지 않음

기본키 매핑

  • 데이터베이스의 Primary Key에 해당하는 필드를 매핑

@Id

  • 해당 필드를 Primary Key로 지정
  • @Id만 사용하는 경우 해당 필드를 자연키로 직접 할당

@GeneratedValue

  • 자동으로 생성되는 값을 Primary Key로 사용
  • @Id와 함께 사용되는 필드는 직접 기본키 값을 할당하지 않고 자동으로 증가되는 대리키가 할당
  • 속성
    • strategy: 기본키 생성 전략을 지정

@GeneratedValue 전략

  • IDENTITY
    • 기본키 생성을 데이터베이스에 위임
    • MySQL의 AUTO_ INCREMENT 같은 방식
    • 특징: 트랜잭션 커밋 시점이 아닌 persist() 시점에 즉시 insert 쿼리 실행
      • 트랜잭션 커밋전 엔티티는 연속성 컨텍스트의 1차 캐시에 보관됨
      • 1차 캐시에 보관되기 위해선 PK 값이 필요
      • IDENTITY 전략은 데이터베이스에 저장되기 전까지 PK 값을 알 수 없음
      • persist() 시점 즉시 insert 쿼리가 실행되고 PK를 받아 1차 캐시에 저장됨
      • 쓰기 지연이 불가능
  • SEQUENCE
    • 데이터베이스의 시퀀스를 생성하여 기본키로 사용
    • 오라클의 시퀀스를 기본키로 사용하는 방식
    • @SequenceGenerator 속성
      • name: 식별자 생성기 이름을 지정(필수값)
      • sequenceName: 데이터베이스에 등록되어 있는 시퀀스 이름
      • initialValue: DDL 생성 시에만 사용, 시퀀스의 시작 값 지정
      • allocationSize: 시퀀스 한 번 호출에 증가하는 수
      • catalog, schema: 데이터베이스 catalog, schema 이름
    • 특징: persist() 순간 데이터베이스에 시퀀스 값을 호출하여 받은 후 1차 캐시 저장
      • 시퀀스 값을 받아오기 때문에 실제 insert는 트랜잭션 커밋 시점 실행
      • 쓰기 지연 가능 
      • 여러번 호출이 있는 경우 allocationSize를 설정하여 최적화
        • allocationSize가 50인 경우
        • 한 번 호출 시 데이터베이스의 시퀀스 값이 50 증가(ex 1 -> 51)
        • 51번 시퀀스가 될 때까지 추가 호출없이 메모리를 사용
        • 할당 받은할당받은 마지막 시퀀스 값에 도달하면 다시 호출하여 50개의 값을 미리 할당받은 뒤 사용
        • 데이터베이스에 호출하는 횟수가 줄어들고 동시성 문제가 거의 없음
        • 그러나 서버 재시작 시 할당 받았던 값들이 사라져 값에 낭비가 될 수 있음
  • TABLE
    • 키 생성 전용 테이블을 하나 만들어서 데이터베이스 시퀀스를 모방
    • @TableGenerator - 속성
      • name: 식별자 생성기 이름 지정(필수값)
      • table: 키생성 테이블명
      • pkColumnName: 시퀀스 컬럼명
      • valueColumnName: 시퀀스 값 컬럼명
      • initialValue: 초기값, 마지막으로 생성된 값 기준
      • allocationSize: 시퀀스 한 번 호출에 증가하는 수
      • catalog, schema: 데이터베이스 catalog, schema 이름
      • uniqueConstraint s(DDL): 유니크 제약조건 지정
    • 특징: 모든 데이터베이스에 사용 가능한 전략이나 테이블을 사용하게 되어 성능이 좋지 않음

자바 ORM 표준 JPA 프로그래밍 - 기본편 강의 | 김영한 - 인프런 (inflearn.com) 강의 내용 참고

728x90

'백엔드 > Spring' 카테고리의 다른 글

[Spring] JPA 프록시  (0) 2024.09.11
[Spring] 연관관계 매핑  (0) 2024.09.10
[Spring] 영속성 컨텍스트 (Persistence Context)  (0) 2024.09.08
[Spring] JPA 개요  (1) 2024.09.07
[Spring] 변경 감지 & 병합  (0) 2024.09.06