[Spring]/JPA 프로그래밍 - 기본편

JPA 소개

응파카 2023. 3. 27. 14:53

ORM( Object Relational Mapping )이란

  • 객체 관계 매핑
  • 객체 ↔ RDB 간 패러다임의 불일치를 해결할 수 있다.
  • 객체는 객체대로, RDB는 RDB대로 설계 한다.
  • 그 과정을 프레임워크가 중간에서 매핑한다.

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

JPA는 자바 진영의 ORM 표준이다.

 

 

  • 저장 프로세스
    • Entity 객체 저장을 요청한다.
    • JPA가 Entity 에 대해서 분석하고 INSERT SQL문까지 생성해준다.
    • JDBC API를 사용해 INSERT 쿼리를 날려 DB에 저장
    • 패러다임 불일치 해결
  • 조회 프로세스
    • id를 통해 Entity 객체를 찾아달라고 요청한다
    • JPA가 SELECT SQL문을 생성해준다.
    • JDBC API를 사용한다.
    • ResultSet을 매핑해준다.
    • Entity 객체를 반환한다.
    • 패러다임 불일치 해결

 


JPA 자바 표준 탄생

  • EJB(엔티티 빈 - 자바 표준) 의 불편함, 비효율성으로 인해
  • Hibernate (오픈 소스) 가 생겨남
  • 이후 Hibernate 를 기반으로 자바 표준 JPA 탄생
  • JPA의 표준 명세를 구현한 구현체 종류
    • Hibernate
    • EclipseLink
    • DataNucleus

 


JPA를 사용해야 하는 이유

생산성 - JPA와 CRUD

  • Create → jpa.persist(member);
  • Read → jpa,find(memberId);
  • Update → member.setName(”새 이름”);
  • Delete → jpa.remove(member);

트랜잭션 끝나고 나면 해당되는 쿼리가 DB로 전달된다.

 

유지보수

  • 기존 방법 : 필드에 변경이 생기면 모든 SQL을 수정해 주어야 한다.
  • JPA 방법 : 필드만 추가하면 SQL 수정은 JPA가 처리한다.

 

JPA와 패러다임의 불일치 해결

상속

  • 추가를 하는 경우, 개발자가 할 일은 jpa.persist(album); 뿐이다.
  • 번거로웠던 매핑 과정을 JPA가 다 처리해준다. (부모 테이블과 자식 테이블 각각에 INSERT를 해준다.)
  • 조회를 하는 경우, Album album = jpa.find(Album.class, albumId);
  • 나머지 JOIN 등의 매핑 과정은 JPA가 처리해준다

 

연관관계, 객체 그래프 탐색

  • 기존 방법 : 외래키 값을 사용한다.
  • JPA 방법 : 연관관계 설정에 참조를 사용할 수 있다.

 

신뢰할 수 있는 엔티티, 계층

  • 자유로운 객체 그래프 탐색이 가능하다.
  • 지연 로딩 방법을 사용해 가능하다.

 

비교하기

  • 동일한 트랜잭션에서 조회한 Entity는 같음을 보장한다.

 

JPA의 성능 최적화 기능

  • 1차 캐시와 동일성 보장같은 트랜잭션 안에서는 같은 엔티티를 반환한다. → 조회 성능이 향상된다.
  • 처음 탐색에서는 SQL 쿼리가 실행되지만 두 번째는 같은 엔티티이므로 JPA 메모리 상에서 찾아와 반환한다. 즉, 검색은 두 번 했지만 SQL 구문은 1번만 실행된다.
  • Long memberId = 100; Member member1 = jpa.find(Member.class, memberId); //SQL 실행 Member member2 = jpa.find(Member.class, memberId); // 캐시 메모리 활용 System.out.println( member1 == member2 ); //true
  • 트랜잭션을 지원하는 쓰기 지연 (Transactional write-behind)
    • 트랜잭션을 COMMIT 할 때까지 INSERT SQL을 계속 모은다.
    • JDBC BATCH SQL 기능을 사용해서 한 번에 SQL을 전송한다.
    transaction.begin(); //트랜잭션 시작
    
    em.persist(memberA);
    em.persist(memberB);
    em.persist(memberC);
    //여기까지 DB에 SQL을 보내지 않는다.
    
    transaction.commit();
    //COMMIT하는 순간 SQL을 보낸다.
    

 

Member member = memberDAO.find(memberId);
Team team = member.getTeam();
String teamName = team.getName();
  • 지연 로딩 (Lazy Loading)
    • 지연 로딩 : 객체가 실제 사용될 때 로딩한다.
    • 즉시 로딩 : JOIN SQL로 한 번에 연관된 객체까지 미리 조회한다.
    예를 들어위와 같은 상황에서
    • 지연 로딩
      첫 번째 줄에서 SELECT * FROM MEMBER
      세 번째 줄에서 SELECT * FROM TEAM
    • 즉시 로딩
      첫 번째 줄에서 바로 SELECT M.*, T.* FROM MEMBER JOIN TEAM …

 


 

 

 

https://www.inflearn.com/course/ORM-JPA-Basic/dashboard

 

자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의

JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., - 강의 소개 | 인프런

www.inflearn.com

 

'[Spring] > JPA 프로그래밍 - 기본편' 카테고리의 다른 글

영속성 컨텍스트 1  (0) 2023.04.07
Hello JPA - 애플리케이션 개발  (0) 2023.03.28
Hello JPA - 프로젝트 생성  (0) 2023.03.27
SQL 중심적인 개발의 문제점  (0) 2023.03.27
강좌 소개  (0) 2023.03.27