Spring/Spring Data JPA

[자바 ORM 표준 JPA 프로그래밍] 4. 엔티티 매핑

noahkim_ 2023. 11. 28. 12:36

김영한 님의 "자바 ORM 표준 JPA 프로그래밍" 책을 정리한 포스팅 입니다.

 

4. 엔티티 매핑

@Entity

  • 테이블과 매핑할 엔티티에 붙이는 어노테이션 입니다.

 

주의사항
  • 기본 생성자 필수
  • final class, inner class, enum, interface 사용 불가
  • final 키워드 사용 불가

 

@Table

  • 엔티티와 매핑할 테이블 지정 (생략 시, 엔티티 이름과 동일한 테이블)

 

속성
name 매핑할 테이블 이름
catalog catalog 기능이 있는 데이터베이스에서 catalog를 매핑함
schema schema 기능이 있는 데이터베이스에서 schema를 매핑함
uniqueConstraints  DDL 생성 시에 유니크 제약조건을 만듬

 

@Column

  • 컬럼 제약조건 설정

 

속성
name 컬럼 이름
nullable null값 허용 여부
unique unique constraint 설정
columnDefinition 컬럼 정보를 전달합니다.
length 문자 길이 제약 조건
precision 유효소수점: 소수점을 포함한 전체 자리수
scale 유효소수점: 소수의 자리수

 

기타 컬럼 매핑

@Enumerated enum 타입을 매핑할 때 사용합니다.
- 해당 타입의 값을 어떤 타입으로 데이터베이스에 저장할 것인지 결정합니다.
EnumType.ORDINAL
EnumType.STRING
@Temporal 날짜 타입을 매핑할 때 사용합니다. TemporalType.DATE
TemporalType.TIME
TemporalType.TIMESTAMP
@LOB 대용량 문자열 타입을 매핑할 때 사용합니다.  BLOB or CLOB
@Transient 테이블에 매핑하지 않을 필드를 표시합니다.  
@Access JPA가 엔티티에 접근하는 방식을 지정합니다.  AccessType.FIELD (필드 접근)
AccessType.PROPERTY (메서드 접근)

 

스키마 자동 생성

spring:
  jpa:
    hibernate:
      ddl-auto: create

 

속성
create 새로 생성
create-drop 애플리케이션 종료 시, create 속성으로부터 생성된 테이블 제거
update (테이블-엔티티 비교) 변경 사항만 수정
validate  테이블 구조와 엔티티 정보간의 불일치 여부 (일관성 검증)
- 에러 (애플리케이션 실행 X)
none 자동 생성 기능을 사용하지 않습니다.

 

@ID

  • 데이터베이스의 기본 키를 매핑합니다.

 

직접 할당
  • 사용자가 직접 할당합니다.

 

자동 할당 (@GeneratedValue)
  • 대리키 사용
  • 데이터베이스 벤더에게 위임합니다.

 

속성 (GenerationType)
AUTO 특정 데이터베이스에 적합한 키 생성 전략을 자동으로 선택합니다.
- 데이터베이스 벤더에 독립적으로 코드를 작성할 수 있습니다.
 
IDENTITY 기본 키 생성을 데이터베이스 벤더에게 위임합니다.
- ID 컬럼을 비워두면 데이터베이스가 자동으로 값을 채웁니다.
- 기본키 값을 가져오기 위해 데이터베이스에 추가로 조회 쿼리를 질의합니다.
MySQL
PostgreSQL
DB2
SQL Server
SEQUENCE 데이터베이스 시퀀스를 사용해서 기본키를 할당합니다.
- 유일한 값을 순서대로 생성하는 오브젝트 입니다.
ORACLE
PostgreSQL
DB2
H2
TABLE 키 생성 테이블을 사용합니다.  
@SequenceGenerator(
		name = "BOARD_SEQ_GENERATOR",
		sequenceName = "BOARD_SEQ",
		initialValue = 1, allocationSize = 1)

@TableGenerator(
		name = "BOARD_SEQ_GENERATOR",
		table = "MY_SEQ",
		pkColumnValue = "BOARD_SEQ", allocationSize = 1)
)

@GeneratedValue(strategy = GenerationType.______, generator = "BOARD_SEQ_GENERATOR")