<< JPA 의 핵심 >>
1. JPA 내부 동작 방식
2. Object - RDB : Mapping
* Entity Mapping *
1. 'Object - Table' Mapping
@Entity
@Entity가 붙은 클래스 == JPA에서 관리하는 클래스
※ 기본 생성자 필수 (피라미터가 없는 public, protected 생성자)
@Table : 엔티티와 매핑할 테이블 지정
2. 'Field - Column' Mapping
@Column : 컬럼 매핑
§주요 옵션
name : 필드와 매핑할 테이블의 컬럼 이름
nullable : null 값 허용 여부
unique : unique 제약 조건
columnDefinition : 데이터베이스 컬럼 정보를 직접 부여
@Enumerated : enum 타입 매핑
value = EnumType.STRING을 무조건 사용한다!
"EnumType.ORDINAL"은 enum의 순서를 DB에 저장한다. 이 경우 enum 타입의 순서가 변한다면, 전혀 다른 값이 매칭되는 참사가 일어난다.
반면 "EnumType.STRING" 은 그대로 enum의 이름을 저장하기 때문에 이러한 오류가 발생하지 않는다.
@Temporal : 날짜 타입 매핑
TemporalType.TIME : 시간
TemporalType.DATE : 날짜
TemporalType.TIMESTAMP : 날짜 + 시간
@Lob
별도로 지정할 수 있는 속성을 없다.
매핑하는 필드 타입이 문자이면 CLOB 매핑이 일어나고,
그외 나머지이면 BLOB 매핑이 일어난다.
@Transient
필드 매핑 X , DB 저장 X, 조회 X
=> 로컬 메모리에만 임시로 어떤 값을 보관하고 싶을 때 사용.
3. 'Primary-Key(PK)' Mapping
※ 숫자를 기본키로 설정한다면 어떤 TYPE?
int -> X , 0을 포함하기에 부적합
Integer -> X, 10억이 넘으면 다시 Reset, 부적합
Long -> O, 메모리 사용이 많을 것 같지만 미미하다. 적합
@Id
PK로 선언할 필드에 부착!
@GeneratedValue
옵션 : 기본키 자동 생성 전략 (strategy)
1. IDENTITY : 기본키 생성을 데이터베이스에 위임(MYSQL)
2. SEQUENCE : 데이터베이스 시퀀스 오브젝트 사용(ORACLE)
3. TABLE : 키 생성용 테이블 사용 (별도 테이블 생성) (모든 DB)
4. AUTO : DB 방언에 맞춰 1~3이 자유롭게 선택됨.
@GeneratedValue(strategy = GenerationType.IDENTITY)
[IDENTITY 전략]의 PK 부여 과정
1. 사용자가 Id 필드(DB의 PK)를 부여하지 않고, DB에 INSERT
2. DB에 INSERT 쿼리가 날라오면, 그때 DB에서 Id 필드(DB의 PK) 을 세팅 해준다.
<문제점>
해당 객체의 Id 값은 DB에 들어가야지 알 수 있음.
그런데, 영속성 컨텍스트에 관리 되려면 PK 값이 있어야 함.
<해결책>
'IDENTITY' 전략만 특이하게
em.persist()를 함과 동시에 DB에 INSERT 쿼리를 보낸다.
=> PK 값을 알아오기 위함.
트랜잭션 커밋 시점 전에, 영속성 컨텍스트에 객체를 올리는 시점인 em.persist()에 DB에 INSERT 쿼리를 보내는 것을 볼 수 있다.
@GeneratedValue(strategy = GenerationType.SEQUENCE)
[ SEQUENCE 전략]의 PK 부여 과정
em.persist() 시점 : DB 시퀀스 테이블에서 PK 값을 불러온다.
tx.commit() 시점 : 쓰기 지연 SQL 저장소에 쌓인 INSERT 쿼리를 DB로 보낸다.
'Spring > JPA' 카테고리의 다른 글
[JPA - 7] 다양한 연관관계 매핑 (0) | 2023.12.01 |
---|---|
[JPA - 6] 연관관계 매핑 (양방향 연관관계 / 연관관계의 주인 - 중점) (0) | 2023.11.26 |
[JPA - 4] 영속성 컨텍스트 (Persistence Context) - 내부 동작 방식 (0) | 2023.11.24 |
[JPA - 3] JPA 구동 방식 / 간단한 JPA를 이용한 데이터 조작 (1) | 2023.11.20 |
[JPA - 2] JPA 설정파일 : "persistence.xml" (0) | 2023.11.19 |