JPA 소개

2022. 6. 28. 19:07·공부/JPA
반응형

출처 : 자바 ORM 표준 JPA 프로그래밍 인프런 강의

 

JPA 게시글은 대부분 인프런의 김영한님의 강의인 '자바 ORM 표준 JPA 프로그래밍' 기반으로 내용을 정리했습니다.

 

JPA 소개

JPA란?

  • Java Persistence API의 줄임말이다.
  • 자바 진영의 ORM 기술 표준이다.
    • Object-relational mapping(객체 관계 매핑)
    • 객체는 객체대로 설계
    • 관계형 데이터베이스는 관계형 데이터베이스대로 설계한다.
    • ORM 프레임워크가 중간에서 매핑
    • 대중적인 언어에서는 대부분 ORM 기술이 존재한다.

 

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

  • 동작 과정
    • JAVA 애플리케이션에서 JPA API 호출
    • JPA는 JDBC API 호출
    • JDBC는 SQL 생성 또는 실행
    • DB에서 결과를 반환 받음

 

JPA 동작 - 저장

이 동작 과정에서 제일 중요한 부분은 패러다임 불일치 해결 부분이다. 중요한 내용이므로 따로 후술한다. INSERT SQL은 개발자가 직접 작성하는게 아니고 JPA에서 작성해서 DB에게 명령을 내린다.

 

JPA 동작 - 조회

 

JPA는 표준 명세

  • JPA는 인터페이스의 모음이다.
  • JPA 2.1 표준 명세를 구현한 3가지 구현체
    • 하이버네이트, EclipseLink, DataNucleus
    • 대부분 하이버네이트를 많이 사용한다.

 

왜 JPA를 사용해야 할까?

  • 생산성
    • 저장 : jpa.persist(객체);
    • 조회 : 객체 = jap.find(조회할 아이디);
    • 수정 : 객체.setXXX("변경할 내용");
      수정의 경우는 위의 코드만 작성해도 알아서 update 쿼리를 DB에 보낸다.
    • 삭제 : jpa.remove(객체);
  • 유지보수
    • 기존에 사용하던 방법으로 필드 변경이 일어나면 모든 SQL을 직접 수정해주어야한다.
    • JPA를 사용하면(DB에 추가되거나 수정 된 컬럼이 있을 시) 클래스 필드만 추가해주면 SQL은 JPA가 처리해서 따로 SQL을 수정하거나 하는 번거로운 작업이 없어진다.
  • 패러다임의 불일치 해결
    • 상속
      • DB에서 객체 상속이 이루어진 테이블을 하나 저장할 때 원래대로라면 부모 테이블과 자식 테이블(명칭이 정확하진 않다.)을 따로따로 SQL문을 작성했어야하는데 JPA에서는 jpa.persist(자식테이블);만 적어주면 알아서 부모 테이블, 자식 테이블 INSERT 쿼리문을 두 개로 나누어 처리한다.
      • 조회도 마찬가지로 자식 테이블을 조회할 경우 JPA에서 알아서 부모와 자식을 JOIN해 SELECT 처리를 해준다.
    • 연관관계, 객체 그래프 탐색
      • 신뢰할 수 있는 엔티티, 계층
    • 비교하기
      • 자바 컬렉션과 같이 동일한 객체를 두 번 조회해서 이 둘을 비교하면 같다고 나온다.
      • member1 == member2; // (동일한 아이디로 조회해서 객체를 가져왔을 경우) 같다.
      • 즉, 동일한 트랜잭션에서 조회한 엔티티는 같음을 보장한다.
  • 성능
    • 1차 캐시와 동일성(identity) 보장
      • 같은 트랜잭션 안에서는 같은 엔티티를 반환한다. -> 사실상 아주 짧은 시간의 캐싱이라 약간의 조회 성능이 향상된다.
    • DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read 보장
    • 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
      • INSERT
        • 트랜잭션을 커밋할 때까지 INSERT SQL을 모음
        • JDBC BATCH SQL 기능을 사용해서 한번에 SQL 전송
          • transaction.begin() ~ transaction.commit(); 
    • 지연 로딩(Lazy Loading)
      • 지연 로딩 : 객체가 실제 사용될 때 로딩
        • 만약 A와 B 테이블이 외래키로 관계가 맺어져있을 경우 A만 조회했을 때 A 테이블 값만 조회하고, A와 연관된 B 테이블의 값을 꺼내오려할 때 그제서야 B 테이블에 있는 값을 조회해서 가져온다.
        • A a = aDAO.find(aId);  --> SELECT * FROM A
          B b = a.getB();
          String resultB = b.getB(); --> SELECT * FROM B
      • 즉시 로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회한다.
        • A와 B 테이블을 JOIN한 SELECT 결과를 반환한다.
  • 데이터 접근 추상화와 벤더 독립성
  • 표준

 

반응형
저작자표시 비영리 변경금지 (새창열림)
'공부/JPA' 카테고리의 다른 글
  • JPA 영속성 관리 - 내부 동작 방식 준영속 상태
  • JPA 영속성 관리 - 내부 동작 방식 플러시
  • JPA 영속성 관리 - 영속성 컨텍스트
  • JPA 시작하기 - Hello JPA 시작하기 (프로젝트 생성 및 개발)
데부한
데부한
어차피 할 거면 긍정적으로 하고 싶은 개발자
    반응형
  • 데부한
    동동이개발바닥
    데부한
  • 전체
    오늘
    어제
    • 분류 전체보기 (307)
      • 방통대 컴퓨터과학과 (27)
        • 잡담 (9)
        • 3학년1학기 (17)
      • 프로젝트 및 컨퍼런스 회고 (1)
        • 프로젝트 (4)
        • 한이음 프로젝트 (0)
        • 회고 (3)
      • 공부 (165)
        • Spring (37)
        • JPA (71)
        • 인프런 워밍업 클럽_BE (10)
        • Java (6)
        • React.js (27)
        • 넥사크로 (11)
        • 기타 (3)
      • 알고리즘 (85)
        • 알고리즘 유형 (10)
        • 알고리즘 풀이 (57)
        • SQL 풀이 (18)
      • 에러 해결 (13)
      • 잡담 (7)
        • 국비교육 (2)
        • 구매후기 (5)
        • 진짜 잡담 (0)
  • 블로그 메뉴

    • Github
    • Linkedin
    • 홈
    • 방명록
    • 글쓰기
    • 관리
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    방통대
    코딩테스트
    MSA
    SQL
    QueryDSL
    토비의스프링부트
    스프링부트
    Spring
    JPA
    백준
    react
    기출문제
    토이프로젝트
    IT
    운영체제
    Java
    oracle
    RESTful
    프론트엔드
    개발자
    알고리즘
    egov
    인프런
    프로그래머스
    SpringBoot를 이용한 RESTful Web Service 개발
    springboot
    자바스크립트
    전자정부프레임워크
    넥사크로
    에러해결
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
데부한
JPA 소개
상단으로

티스토리툴바