JPA/JPA 기본

3. JPA

sdafdq 2023. 10. 19. 07:29

Java Persistence API 자바 영속성 API

자바 진영의 ORM 기술 표준

 

Object-Relational Mapping 오브젝트 관계 매핑

말 그대로 오브젝트랑 관계형 DB 매핑 기술

 

패러다임 불일치 등 해결해 줌

대부분 대중적인 언어는 ORM 기술 존재

 

 

 

JPA도 결국 JDBC를 쓰는 거.

 

 

 

 

 

 

저장

저장 하면 (persist가 insert  하면서 저장시키는 거임)

 

JPA 내부에선

먼저 객체를 분석하고

그에 따라 insert 쿼리를 생성하고

그걸 JDBC를 통해 DB에 날림.

 

 

 

 

 

조회

find 하면

쿼리 생성하고

JDBC를 통해 DB에 쿼리 날림

DB에서 결과 반환된 걸 JDBC로 받고, 

JDBC에서 받은 ResultSet JPA에서 지정한 엔티티와 매핑하고

돌려줌

 

 

 

 

 

JPA는 표준임.

아래가 구현체들.

보통 거의 Hibernate 많이 씀.

 

원래 JPA 자체가, 누군가 EJB빈 자바에서 제공해주는 DB와 소통하는 거 이게 너무 불편해서 자기가 뭐 구현해서 오픈소스로 만듦. 그게 Hibernate. 

그 개발자를 자바에서 데려와 만든 게 JPA임. 

그래서 JPA의 전신이 Hibernate니 그걸 많이 쓰는 듯.

 

결국 Hibernate도 JPA 표준에 맞추게끔 함.

 

 

 

JPA 사용해야 하는 이유

SQL 중심적 개발에서 객추 중심으로 개발 가능

패러다임 불일치 해결

성능

표준

SQL 직접 짤 필요 없는 둥 생산성

 

 

 

JPA의 CRUD

저장 : jpa.persist(member)

조회 : Member member = jpa.find(memberId)

수정 : member.setName(값)   <- 이러면 정말 DB에 반영됨. 도메인을 @Entity 해서 등록해놔서 그럼. 트랜잭션 안에서 조회 하면, 원래 상태를 캡쳐해 놨다가, 트랜잭션 끝날 시점에 원래 상태랑 바뀐 점 있는지 찾아본 다음 그걸 SQL쿼리로 만들어서 보냄. commit 시점 즈음에.

삭제 : jpa.remove(member)

 

그리고 만약 Member의 필드로 뭐 추가해도 우리기 일일이 쿼리 작성 할 필요 없어 유지보수에도 이점이 있음.

 

 

 

 

패러다임 불일치도 해결.

https://qwefdg3.tistory.com/686

여기에 이야기 해 놨음.

 

저것들을 JPA가 직접 해 주는 거임.

 

근데 우리가 앞서 말한 모두 join시켜서 가져오는건가?

이거는 성능최적화 고려해서 설계 했다고 함. 뒤에서 말한다고 함. 뭐 지연 로딩이라는 그런 게 있다고 함.

 

또, 동일한 트랜잭션 안에서 가져온 (find 한) 객체는 만약 같은 DB데이터를 가져온 거라면,

비교하면 같은 인스턴스 라고 함.

 

 

 

최적화

캐시, 동일성(위에 그 얘기임) 보장 : 그러니까 같은 객체 그냥 반환시켜서 DB에 쿼리 안날리니까. 일종의 캐시임. JPA가 그냥 Member[] members 해서 레퍼런스 가지고 있다가 걍 그 레퍼런스 반환해 주면 되니까. (객체니 레퍼런스로 가지고 있음.) 같은 트랜잭션에서만 가능

 

쓰기 지연 : 이렇게 중간에 낀건 모아서 반환해주는 버퍼와 저장해놓는 캐시 기능 이점을 살릴 수 있음.

옵션을 켜야 하긴 한데, 이것도 마찬가지로 같은 트랜잭션 안에서만 가능하고(JPA는 트랜잭션을 기본으로 씀) commit 시점까지 insert 쿼리 한번에 모았다가 한번에 보냄. betch SQL이었나? 그 기능 사용해서 보냄. 그냥 우리가 DB자체에 insert 3개 쓰고 실행하는 그런거랑 같은거인듯?

 

지연 로딩 : 객체가 실제 사용되는 시점에 쿼리를 날려 가져온 다고 함.

나중에 설명해 주신다고 함. 위랑 비슷하긴 할 듯. 뭐 생각으로는 첫 조회 시점에 (isFirst 이런 거 boolean으로 넣고) isFirst 저거 true 하면서

if(!isFirst)

쌓아놓은 sql문 전송

받기

isFirst = true

 

이런 식이지 않을까?

 

 

 

 

 

지연 로딩 : 객체가 실제 사용될 때 로딩

즉시 로딩 : join으로 한번에 연관된 객체까지 미리 조회

 

예를 들면 Member 사용하면 항상 Team을 같이 사용하면 

이런 건 즉시로딩으로 설정해 놓는 게 효율 적

JPA는 둘 다 지원함.

 

기본은 지연로딩이고, 저렇게 즉시하는 게 좋아보이는 것만 즉시로딩으로 설정하면 됨.

 

 

'JPA > JPA 기본' 카테고리의 다른 글

6. 영속성 컨텍스트  (0) 2023.10.20
5. 개발  (0) 2023.10.19
4. 프로젝트 생성  (0) 2023.10.19
2. 객체지향과 관계형DB  (0) 2023.10.18
1. JPA  (0) 2023.10.18