JPA

JPA 소개

희구 2021. 7. 28. 19:34

JPA소개

지금은 객체를 관계형 DB에 저장해야 한다.

데이터베이스는 SQL만 알아들을 수 있기 때문에 SQL중심적인 개발만 한다는 것이 문제가 된다.

  1. 무한 반복, 지루한 코드

테이블을 만들고 객체를 만들고 sql문장을 작성한다.

나중에 수정요청이 오면 하나하나 쿼리를 수정해야한다.

그러다 보면 중간중간 놓쳐서 오류가 발생할 수 있음.

  1. 패러다임의 불일치

객체 vs 관계형 디비

객체: 캡슐화

관계형: 자료를 정교화해서 보관하는게 목표

객체를 관계형 DB에 넣어려고 하니까 여러가지 문제가 생긴다.

그러려면 객체를 sql로 변환해서 저장해야한다.

sql로 변환은 누가해? 개발자가 함!

객체와 관계형 디비의 차이

  1. 상속 (객체는 상속관계가 있지만 관계형 디비는 없다)
  2. 연관관계 (객체는 참조를 가지고 한다, 디비는 pk와 fk로 join을 해서 필요한 데이터를 찾는다)테이블은 양 방향으로 왔다갔다 할 수 있다.
  3. 객체는 한 방향으로 밖에 왔다갔다 할 수 없는데

ORM?

  • Object- relational mapping(객체 관계 매핑)
    • 객체는 객체대로 관계형디비는 환계형 디비대로 설계후 orm 프레임워크가 중간에서 매핑을 해준다.
  • 객체는 객체대로 설계
  • 관계형 데이터베이스는 관계형 데이터베이스대로 설개
  • ORM 프레임워크가 중간에서 매핑
  • 대중적인 언어에는 대부분 ORM 기술이 존재

JPA는 애플리케이션과 JDBC 사이에서 동작한다.

![image-20210728190218835](https://raw.githubusercontent.com/heeseonyang/hello-spring/master/img/image-20210728190218835.png)

JPA 동작 - 저장

![image-20210728190328325](https://raw.githubusercontent.com/heeseonyang/hello-spring/master/img/image-20210728190328325.png)

-> dao에서 객체를 저장하고 싶으면 jpa에게 멤버 객체를 넘긴다.

jpa가 멤버 객체를 분석한다

jpa가 적절한 sql문을 생성하고 api를 사용해서 디비에 보내고 결과를 받는다.

JPA 동작 - 조회

![image-20210728190504597](https://raw.githubusercontent.com/heeseonyang/hello-spring/master/img/image-20210728190504597.png)

-> jpa는 db에 pk값만 넘긴다.

jpa가 멤버개체를 보고 적절한 select 쿼리를 만들어내고 api를 사용해서 db에 결과를 보내고 받는다.

받는 결과를 객체에 모두 맵핑해준다.

이 모든걸 jpa가 해결해준다.

★ JPA가 패러다임의 불일치를 해결해준다.

> JPA는 표준 명세

  • JPA는 인터페이스의 모음이다.

> JPA를 왜 사용해야 하는가?

  • SQL 중심적인 개발에서 객체 중심으로 개발
  • 생산성 - JPA와 CRUD
    • 저장 : jpa.persist(member)
    • 조회 : Member member = jpa.find(memberId)
    • 수정 : member.setName("변경할 이름")
    • 삭제 : jpa.remove(member)
  • 유지보수
    • 기존: 필드 변경시 모든 SQL을 수정해야한다.
    • JPA : 필드만 추가하면 된다. SQL은 JPA가 처리한다.
  • 패러다임 불일치 해결
    1. JPA와 상속예를 들어 album객체를 *****저장 ***** 하고 싶을 때 jpa가 sql문장을 두개로 나눠서
      • 개발자가 할 일 : jpa.persist(album);
      • 나머지는 JPA가 처리 : insert into team.. / insert into album ..
    2. item테이블과 album테이블에 모두 쿼리를 날린다.
    3. ![image-20210728191807677](https://raw.githubusercontent.com/heeseonyang/hello-spring/master/img/image-20210728191807677.png)
    4. JPA와 연관관계
    5. 연관관계 저장 member.setTeam(team) jpa.persist(member);
    6. JPA와 객체 그래프 탐색
    7. Member member = jpa.find(Member.class, memberId); Team team = member.getTeam();
    8. JPA와 비교하기
  • 성능
    1. 1차 캐시와 동일성 보장
      • 같은 트랜잭션 안에서는 같은 엔티티를 반환함 - 약간의 조회 성능 향상
      • DB Isloation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장String memberId = "100";Member m1 = jpa.find(Member.class, memberId); //캐시'''
      • SQL 한번만 실행
      • println(m1 == m2) //true
      • Member m1 = jpa.find(Member.class, memberId); //SQL
      • '''
    2. 트랜잭션ㅇㄹ 지원하는 쓰기 지연 -Insert
      • 트랜잭션을 커밋할 때까지 insert SQL을 모음
      • JDBC BATCH SQL 기증을 사용해서 한번에 SQL전송

  • 데이터 접근 추상화