Free Lines Arrow
본문 바로가기
DataBase/JPA

[JPA] JPA 란?

by skahn1215 2021. 7. 28.
728x90
반응형

JPA 란?

  • Java Persistence API 의 약자이다.
  • 자바 진영 표준 ORM

 

 

ORM 이란?

  • Object-relational mapping 객체관계 매핑
  • 객체는 객체대로 설계 한다.
  • 관계형 데이터 베이스는 관계형 데이터베이스대로 설계한다.
  • ORM 프레임 워크가 객체와 데이터베이스를 중간에서 매핑해준다.
  • 대중적인 안에는 대부분 ORM 기술이 존재

 

 

 

JPA의 역사

  • 과거에는 EJB 라는 ORM이 있었는데 문제가 많았다.
    성능 문제, 복잡성 등등 
  • 그래서 개발자가 하이버네이트를 만들었다.
  • 하이버네이트를 좀더 개선한 것이 JPA 이다.

 

 

 

JPA의 구조

  • JPA 의 코드는 대부분 인터페이스 이다.
  • 그래서 상속받아서 구현한 것을 써야한다.
  • 보통 Hibernate를 많이 사용한다.

 

 

 

JPA의 동작

기본동작

JPA 는 JDBC API로 DB 에 SQL 문을 날려준다.

 

 

 

 

JPA 동작 - 저장

  • 저장할 객체를 JPA에게 넘겨준다.
  • JPA 는 넘어온 객체를 분석한다.
  • SQL 문을 생성한다.
  • JDBC API 를 통해 Insert 문을 수행한다.

 

 

 

 

JPA 동작 - 조회

 

 

 

 

 

JPA를 사용해야 되는 이유

SQL 중점에서 객체중심으로 개발

SQL 중점에서 이제 객체를 직접 저장하고 조회 할수 있다.

 

 

 

 

생산성

반복적인 CRUD를 그만해도된다.

  • 저장: jpa.persist(member)

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

  • 수정: member.setName("변경이름")
    - 수정이 좀 중요하다 영속성 준영속성을 뒤에 배우는데
    영속성일때 즉 JPA가 관리하는 객체일때 객체의 속성을 변경하면 알아서 update 문이 나간다.

  • 삭제: jpa.remove(member)

 

 

유지보수

새로운 tel 이 추가 되면 SQL 문을 수정할 필요가 없다

애초에 SQL 문을 사용하지 않고 객체를 저장하기 때문이다.

public class Member {
    private String memberId;
    private String name;
    private String tel; // 새로운 필드 추가
}

 

 

패러다임의 불일치 해결

아래와 같은 구조일때 저장과 조회를 객체기준에 맞게 할 수 있다.

저장

 

조회

 

비교

  • 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
  • 캐싱기능을 사용한다.
  • 원리는 다음과 같다.
    member2를 찾을때 key 값이 동일하면 
    member1을 반환해 준다.
    그렇기 때문에 비교 연산이 가능해진다.
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId); //SQL문 수행
Member member2 = jpa.find(Member.class, memberId); //캐시
member1 == member2; //같다.

 

 

JPA의 성능 최적화 기능

 

1차 캐시와 동일성 보장

  • 위 예제에서 처럼 캐시를 사용한다.
  • 그렇게 되면 SQL 문을 한번만 실행한다.
String memberId = "100";
Member member1 = jpa.find(Member.class, memberId); //SQL문 수행
Member member2 = jpa.find(Member.class, memberId); //캐시
member1 == member2; //같다.

 

 

 

 

트랜잭션을 지원하는 쓰기 지연

  • 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
  • JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
transaction.begin(); // [트랜잭션] 시작
em.persist(memberA);
em.persist(memberB);
em.persist(memberC);
//여기까지 INSERT SQL을 데이터베이스에 보내지 않는다.
//커밋하는 순간 데이터베이스에 INSERT SQL을 모아서 보낸다.
transaction.commit(); // [트랜잭션] 커밋

 

 

 

지연 로딩과 즉시 로딩

지연로딩

  • 지연로딩은 다음과 같이 수행된다.
  • 개발자가 객체를 사용할때 SQL 문이 각각 수행된다.
Member member = memberDAO.find(memberId); // member에 대한 select 문 실행
Team team = member.getTeam();
String teamName = team.getName(); // Team에 대한 select 문 실행

 

즉시로딩

  • 미리 다 조회 해둔다.
  • SELECT M.*, T.*  FROM MEMBER JOIN TEAM …
Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName();

 

 

 

 

참고:

https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21683?speed=1&tab=note 

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 학습 페이지

지식을 나누면 반드시 나에게 돌아옵니다. 인프런을 통해 나의 지식에 가치를 부여하세요....

www.inflearn.com

 

728x90
반응형

'DataBase > JPA' 카테고리의 다른 글

[JPA] 영속성 컨텍스트  (0) 2021.07.30
[JPA] JPA CRUD 기본  (0) 2021.07.30
[JPA] JPA 환경설정  (0) 2021.07.29
[JPA] JPA를 사용하는 이유  (0) 2021.07.27
[JPA] JPA를 배워야 하는이유  (0) 2021.07.27

댓글