2022/12/27 TIL | JPA (1) JPA, Entity 매핑
💭 오늘의 학습 전략
# JPA란
◼️ Hibernate ORM
◻️ Data access 계층에서 JPA 위치
◼️JPA 동작 방식
◾Persistence Context
◼️ JPA API
# Entity 매핑
◼️ Entity-테이블 매핑
◾@Entity
◾@Table
◼️ 기본키 매핑
◾생성 전략
◼️ 필드(멤버 변수) - 컬럼 매핑
◾@Column
◽@Temporal
◽@Trasient
◾@Enumerate
🌼 학습한 것들
◾ JPA(Java Persistence API)
▪️ 자바 ORM 기술 표준 사양
▪️ 구현체
- Hibernate ORM, EclipseLink, DataNucleus 등
▪️ 데이터 액세스 계층에서 JPA 위치
- JPA를 거쳐 Hibernate ORM을 통해 데이터 작업
- Hibernate는 내부 JDBC API를 이용해 DB 접근
◾ 영속성 컨텍스트 Persistence Context
▪️ 테이블과 매핑되는 Entity 객체 정보를 영속성 컨텍스트에 보관해서 앱 내에서 지속 관리
▪️ 보관된 정보를 DB CRUD에 사용
▪️ 1차 캐시 영역
- Entity 정보 저장
▪️ 쓰기 지연 SQL 저장소
- 실행될 쿼리 저장
▪️ commit 실행 시(flush) DB에 반영되고 해당 쿼리는 쓰기 지연 SQL 저장소에서 삭제
◾ JPA API
▪️ EntityManagerFactory.createEntityManger -> 영속성 컨텍스트 관리 객체 EntityManager(em) 얻어오기
▪️ em.getTransaction => 트랜잭션 객체(tx) 얻어오기
▪️ em.persist() => 영속성 컨텍스트에 객체 정보 저장 (DB INSERT가 아님)
▪️ tx.begin() => 트랜잭션 시작
em.persist()
tx.commit() => 실제 DB 작업
▪️ em.find() => 영속성 컨텍스트 1차 캐시 영역에서 먼저 탐색 후 없으면 별도 SELECT 쿼리 실행
▪️ 수정(set) 후 commit 시 find한 snapshot과 비교 후, 변경된 값이 있으면 저장소에 UPDATE 쿼리 등록 -> UPDATE 실행
◾ Entity 매핑_Entity와 테이블 간의 매핑
▪️ @Entity: JPA의 관리 대상이 된다. @Id와 함께 사용하기
- name: Entity 이름 설정, 기본값은 클래스명
▪️ @Table: Entity와 매핑할 테이블 지정
- name: Table 이름 설정, 기본값은 클래스명
- Optional. 주로 테이블 이름과 클래스 이름이 다를 때만 사용
▪️ 기본생성자 꼭 생성. 습관적으로 쓰기
◾ Entity 매핑_기본키 매핑 ▪️ 기본키 직접 할당 ▪️ 기본키 자동 생성 (별도의 기본키 값 할당 X)
- @GeneratedValue(strategy=GenerateType.IDENTITY)
대표 방식은 MySQL AUTO_INCREMENT 등
- @GeneratedValue(strategy=GenerateType.SEQUENCE)
insert 전 시퀀스 값 조회 실행
- @GeneratedValue(strategy=GenerateType.AUTO)
JPA가 DB Dialect에 따라 적절한 전략 선택
- @GeneratedValue(strategy=GenerateType.TABLE)
별도의 키 생성 테이블 사용. 성능 면에서 좋지 않다
◾ Entity 매핑_필드와 컬럼 간의 매핑
▪️ @Column
- nullable (defualt = true)
- updatable (defualt = true)
- unique (defualt = false)
- name, length 등 ...
- 주의: @Column 없을 시 원시 타입은 기본적으로 nullable이 false임 (NOT NULL)
=> NOT NULL 컬럼인 경우 아예 쓰지 않거나 nullable = false 꼭 명시(권장): default가 true이기 때문
▪️ @Temporal
- Java의 Date, Calendar 타입 사용 시 달아주기
- LocalDateTime(DB - timestamp) 타입은 생략 가능
▪️ @Transient
- 매핑하지 않겠다. 메모리 상에서 임시로 사용하기 위한 용도
▪️ @Enumerate
- Enum 타입 사용 시 달아주기
- EnumType
ORDINAL: Enum 순서(숫자). 중간에 새 값 추가하면 기존 데이터 불일치 문제 가능성
STRING: Enum 이름. 권장
💨 하루를 마치며
1. JDBC보다 쉽고 재미있었다. (뒤로 가면 너도 어렵겠지...) 오늘 내용에서는 딱히 어려운 부분은 없었던 것 같다!
2. 몰랐던 애너테이션이나 애너테이션 속성에 대해 알게 되었다.
3. 아 영속성 컨텍스트 동작을 구체적으로 알 수 있어서 너무 좋았다.
4. 실습을 통해서 JPA 동작 방식을 잡고 시작할 수 있는 느낌이라서 좋당