공부기록/TIL

2022/12/27 TIL | JPA (1) JPA, Entity 매핑

또리머 2022. 12. 29. 08:31
반응형

💭 오늘의 학습 전략

# 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 동작 방식을 잡고 시작할 수 있는 느낌이라서 좋당

반응형