백엔드 개발자
JPA 기본 정리 #1 본문
기존 데이터 연동 방식
- 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