백엔드 개발자

JPA 기본 정리 #1 본문

스프링/JPA

JPA 기본 정리 #1

임잠탱 2023. 8. 31. 10:45

기존 데이터 연동 방식

  • SQL 중심적인 개발
  • 객체를 테이블에 맞춰 작성

객체지향을 따르기 위해 객체답게 설계할 경우 SQL과 매핑하는 과정에서 많은 join과 복잡한 쿼리가 생기게 된다. 그리고 이를 해결해 주는 것이 JPA 이다.

JPA 란

  • ORM (Object relational mapping) 이다. → 객체 관계 매핑
  • JPA는 JAVA 애플리케이션과 JDBC 사이에서 동작한다.
  • 기존방식처럼 SQL 과 매핑하기 위해 테이블에 맞추지 않고 객체는 객체대로 설계하고
  • JPA가 이를 변환하여 JDBC 에 넘겨준다.

JPA 를 사용해야 하는 이유

  • 객체적인 설계 가능
  • 높은 생산성
  • 유지보수 → 객체 중심으로 객체만 변경하면 됨
  • 자유로운 객체 그래프 탐색 ( 기존: 모든 컬럼들을 모두 조인하여 사용하기에 어려움이 있었음 ⇒ jpa 가 모두 join하여 매핑해줌 해결)
  • 캐시 기능 제공
  • 트랜잭션 지원 쓰기 지연
    • 비니지스 로직 수행 동안은 DB 락을 걸지 않음
    • commit이 되기 전 sql문들을 모아두고 commit 할 때 쓰기 지연에 모아둔 sql문 실행됨.
  • 특정 데이터베이스에 종속되지 않음

@ 객체와 테이블 키 매핑

  • 객체를 만들고 테이블과 매핑이 될 수 있도록 어노테이션을 사용하여 알려줄 수 있다.
  • @Entity, @Table ⇒ 테이블로 사용될 객체
  • @Column ⇒ 테이블의 컬럼
  • @Id ⇒ primary key , @Generated
  • 등등 있다.

JPQL

객체를 대상으로 쿼리를 사용할 수 있다. ⇒ 객체 지향 쿼리 언어이다.

sql 문법과 비슷하고 jpa를 사용할 때 편리하게 사용할 수 있다.

기존 : select * from member(테이블 이름);

JPQL : select m from Member(객체 class) m;

⭐✨영속성 컨텍스트 💫🌟

JPA 에서 사용되는 아주 중요한 개념이다.

JPA 를 사용할 땐 Entity Manage(엔티티 매니저)를 통해 영속성 컨텍스트에 접근하게 된다.

  • 논리적인 개념이다.
  • DB에 저장되기 전 영속성 컨텍스트를 먼저 거치게 된다.
  • 1 차 캐시 역할을 한다.
  • 동일성을 보장한다.
  • 트랜잭션을 지원하는 쓰기 지연 ⇒ 데이터 무결성 보장
  • 변경 감지, 지연 로딩을 해준다.

엔티티의 생명주기

  • 비영속
    • 영속성 컨텐스트와 관계없는 상태
  • 영속
    • 객체를 저장하거나 JPA를 통한 작업을 할 경우 영속성 컨텍스트에 들어가 관리된다.
  • 준영속
    • 영속 상태의 엔티티가 영속성 컨텍스트에서 분리 된 상태
    • detach(), clear(), close() 명령어로 만들 수 있다.
  • 삭제
    • 삭제된 상태
    • remove

변경 감지 (dirty checking)

  • 영속성 컨텍스트 안에 엔티티가 저장될 때 처음 상태인 스냅샷이 저장된다.
  • commit 시점에 엔티티를 스냅샷과 비교하여 변경이 있을 경우 변경을 감지하여 업데이트 해준다.
  • 이것 덕분에 jpa에서는 따로 변경 내용을 다시 update 쿼리 같은 것을 날릴 필요가 없다.

영속성 컨텍스트에 있는 내용들은 언제 DB에 반영이 될까?

  • 기본적으로 엔티티 매니저의 flush() 를 하여 DB에 반영시킬 수 있다.
  • flush 는 영속성 컨텍스트의 내용을 DB 에 동기화하는 작업이다.
    • 영속성 컨텍스트의 내용을 비우는 것이 아니다. 변경 내용만 DB에 반영시킨다.
  • 자동으로 반영 되는 경우도 있는데
    • 트랜잭션 커밋될 경우
    • JPQL 쿼리 실행할 경우 - db 를 조회하는데 기존 변경내용이 db에 반영이 되어야 하기 때문
  • flush() 가 될 경우 쓰기 지연에 저장된 sql 쿼리문들, 변경 감지 된 엔티티들이 반영된다.

- 인프런 김영한님의 JPA 기본편을 듣고 정리한 내용입니다 -

'스프링 > JPA' 카테고리의 다른 글

JPA 기본 정리 #4  (0) 2023.09.03
JPA 기본 정리 #3  (0) 2023.09.03
JPA 기본 정리 #2  (0) 2023.09.03
Comments