2 minute read

Spring - 12

  • JPA, Java Persistence API
  • @Query 애너테이션






JPA(Java Persistence API)

  • JPA(Java Persistence API)란?
    • 자바 어플리케이션에서 관계형 데이터베이스를 사용하는 방식을 정의한 인터페이스
    • 자바 ORM 기술에 대한 표준 API(자바에서 제공)

      ORM(Object Relation Mapping): 자바 클래스와 DB테이블을 매핑 (sql을 매핑하지 않음!!!)

  • 단점
    • (1) 복잡한 쿼리 처리 어려움

      Native SQL 써서 해결할 수 있지만, 그러면 특정 DB에 종속되는 문제

    • (2) 성능 저하 위험

      객체 간 매핑 설계 잘못하면 성능 저하 발생

    • (3) 학습시간, 오래 걸림



Mapper vs ORM

  • (1) SQL Mapper
    • SQL ← mapper → 자바 객체(Object 필드)
    • SQL문 명시하여 디비 조작(직접적)
    • 단순히 필드를 매핑시키는 것이 목적
    • ex. Mybatis, jdbcTemplate
  • (2) ORM(Object-Relation Mapping/객체-관계 매핑)
    • DB 테이블 ← ORM → 자바 객체(Object 필드)
    • 객체 간 관계를 바탕으로 SQL문 자동 생성(간접적)

      SQL 쿼리가 아니라 메서드로 데이터를 조작할 수 있다.

    • DB 데이터의 관계를 자바 객체에 반영하는 것이 목적
    • ex. JPA, Hibernate



JPA 동작 방식

  • 동작 흐름

    (1) Entity Manager Factory
    -> create 작업
    (2) Entity Manager
    -> operation 작업
    (3) Persistence Context(Entity1, Entity2…)

  • Entity: 데이터베이스의 테이블에 1 대응하는 클래스

    @Entity가 붙은 클래스는 JPA에서 관리

  • Entity Manager Factory: 엔티티 매니저 인스턴스를 관리하는 주체
    • 애플리케이션 실행 시 한 개만 생성
    • 사용자 요청이 오면, ‘Entity Manager’ 생성
  • Entity Manager: Persistence Context에 접근, Entity 대한 DB 작업 제공

  • Persistence Context(영속 컨텍스트): Entity를 영구 저장하는 환경



Entity 생명주기

  • (1) New(비영속)
    • New 키워드로 생성된 상태
  • (2) Managed(영속)
    • Entity가 Persistence Context에 저장된 상태
    • 트랜잭션, 커밋 시점에 데이터베이스에 반영됨
  • (3) detached(준영속)
    • 저장되었던 Entity가 분리된 상태
  • (4) removed(삭제)
    • Persistence Context와 DB에서 삭제된 상태

entityLifeCycle



  • 관련 메서드
    • find(): Persistence Context에서 Entity 검색

      없을 경우 DB에서 찾아서 Persistence Context에 저장

    • persist(): Entity를, Persistence Context에 저장
    • remove(): Entity를, Persistence Context에서 삭제
    • flush(): Persistence Context에 저장한 내용을 DB에 반영



Persistence Context 사용 장점

  • 버퍼링, 캐싱

    APP과 DB 사이에 중간 계층 생성 => 버퍼링, 캐싱 가능

firstLevelCache



  • (1) 1차 캐시

    1차 캐시로 존재, Map<key, value> 형식으로 저장

  • (2) 동일성 보장(트랜잭션)

    항상 특정 키 값에 매핑된 특정 엔티티 조회됨

  • (3) 트랜잭션을 지원하는 ‘쓰기 지연’

lazyWrite



  • (4) 변경 감지
    • 1차 캐시, 처음 불러온 엔티티의 스냅샷 갖고 있음
    • => 1차 캐시에 저장된 내용과 스냅샷 비교
    • => 변경 내용 있을 시, Update SQL문을 쓰기 지연 SQL 저장소에 보관
    • => 커밋 시점에 변경 내용을 자동 반영



Spring DATA JPA @Query

  • @Query 애너테이션 사용
    • JPQL(Java Persistence Query Language)라는 객체지향 쿼리 사용

      SQL과 비슷

  • 특징
    • 테이블이 아닌 객체를 대상으로 검색하는 객체지향 쿼리
    • SQL을 추상화해서 사용하기 때문에, 특정 DB에 종속되지 않음
    • JPQL로 작성했다면, DB가 변경되어도 애플리케이션에 영향없음
  • 단점
    • 해당 쿼리문에 오타가 생겨도, 컴파일 오류 잡아내지 못함
  • Spring Data JPA Querydsl
    • @Query 단점 보완을 위한 기능






nice!

Updated: