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 |