ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [JPA] 1. JPA 소개 - JPA 소개
    ComputerScience/JPA 2022. 6. 5. 20:42

    이전 글에서는 JPA 이전의 SQL 주도 개발의 문제점에 대해 알아봤습니다.

    반복적인 CRUD 개발, 패러다임의 불일치 등 많은 문제점으로부터 ORM 개발이 나오게 됐고 Java 진영의 표준이 JPA라는 것까지 알게 됐습니다. 이번 장에서는 JPA가 무엇인지 간단하게 알아보도록 하겠습니다.

     

    JPA?

    • Java Persistence API의 줄임말
    • 자바 진영의 ORM 기준 표준

     

    ORM?

    그렇다면 ORM은 무엇일까?

    • Object-relational mapping(객체 관계 매핑)
    • 객체객체대로 설계
    • 관계형 데이터베이스는 관계형 데이터베이스대로 설계
    • ORM 프레임워크가 중간에서 매핑
    • 대중적인 언어는 대부분 ORM이 존재

     

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

    JPA는 사실 애플리케이션과 JDBC 중간에서 동작하며 애플리케이션의 코드를 바탕으로 JDBC 쿼리를 만들어서 DB에 접근한다.

     

    JPA는 표준 명세이다.

    • JPA는 실제 구현체가 아닌 인터페이스의 모음입니다.
    • Hibernate, EclipseLink, DataNucleus와 같은 구현체들이 있으며 우리는 이중에서 Hibernate를 사용하게 됩니다.

    그렇다면 JPA를 왜 사용해야 하는가?

    • SQL 중심적인 개발에서 객체 중심으로 개발
    • 생산성
    • 유지보수
    • 패러다임의 불일치 해결
    • 성능
    • 데이터 접근 추상화와 벤더 독립성
    • 표준

    이 중 몇가지 특성을 조금 더 자세히 알아보도록 하겠습니다.

     

     

    생산성

    JPA는 기본적인 CRUD 코드가 다 설정되어 있기 때문에 쉽게 자바 컬렉션에서 코드를 사용하듯 사용할 수 있습니다.

    1. 저장 : jpa.persist(member)
    2. 조회 : Member member = jpa.find(memberId)
    3. 수정 : member.setName("변경할 이름")
    4. 삭제 : jpa.remove(member)

     

    유지보수

    기존의 SQL중심의 개발은 기존 필드를 변경시 모든 SQL 찾아서 수정해줘야 했습니다.

     

     

    하지만 JPA에서는 필드만 추가해주고 SQL은 JPA가 직접 처리해줍니다. 이러한 특성 때문에 유지보수가 용이해집니다.

     

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

    JPA를 사용하면 객체지향과 RDB간의 패러다임의 불일치가 발생하는 것을 해결해줄 수 있습니다.

     

    1. JPA와 상속

     

    JPA와 상속 - 저장

    개발자가 할 일
    - jpa.persist(album);

    나머지는 JPA가 처리
    - INSERT INTO ITEM ...
    - INSERT INTO ALBUM ...

    저번 글에서 Item과 그것들을 상속하는 객체/테이블 들이 있는 것들을 보셨습니다. 여기서 새로운 값을 저장하려고 할때, JPA 이전에서는 상속처리를 직접 개발자가 진행해줬어야 했습니다. 하지만 JPA를 이용하면 개발자는 한줄로 상속관계를 모두 포함한 저장을 할 수 있습니다.

     

    JPA와 상속 - 조회

    개발자가 할 일
    - Album album = jpa.find(Album.class, albumId);

    나머지는 JPA가 처리
    - SELECT I.*, A.*
    FROM ITEM I
    JOIN ALBUM A ON I.ITEM_ID = A.ITEM_ID

    조회도 자바컬렉션처럼 조회를 진행한다면 JPA에서 나머지 SELECT , JOIN을 진행해줍니다.

     

    2. JPA와 연관관계, 객체 그래프 탐색

    연관관계 저장도 객체 컬렉션의 동작처럼 간단한 코드로 진행할 수 있습니다.

    이전 장에서 연관관계를 보셨죠. 객체를 테이블에 맞게 모델링 하기 위해 복잡한 과정을 거쳤었지만 JPA에서는 간단한 코드로 연관관계 설정이 가능해집니다.

     

    연관관계 저장

    member.setTeam(team);

    jpa.persist(member);

     

    객체 그래프를 탐색할때도 SELECT문을 통해 탐색을 진행했지만 JPA서는 간단한 코드만으로 탐색이 가능합니다.

     

    객체 그래프 탐색

    Member member = jpa.find(Member.class, memberId);

    Team team = member.getTeam();

     

     

     

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

     

    모든 객체를 미리 로딩해야 하는 SQL 주도 개발에서는 객체 내 연관관계를 신뢰할 수 없었습니다. 연관관계를 미리 설정해주지 않는다면 객체를 참조하는 데 문제가 있었지만 JPA에서는 이런 문제점이 해결됐습니다.

    객체를 미리 설정해주고 JPA로 미리 연관관계를 설정해준다면 엔티티, 계층을 신뢰할 수 있고 객체 그래프 탐색이 자유로워집니다.

    class MemberService {
     ...
     public void process() {
     Member member = memberDAO.find(memberId);
     member.getTeam(); //자유로운 객체 그래프 탐색
     member.getOrder().getDelivery();
     }
    }

     

    4. JPA와 비교하기

    SQL주도 개발에서의 객체는 다른 값이지만(new 를 통한 객체 생성 때문) JPA에서 동일한 트랜잭션에서 조회한 엔티티는 같음을 JPA는 보장해줍니다.

     

     

    이와 같이 JPA를 사용하면 객체와 SQL의 패러다임 불일치를 해결해줄 수 있습니다.

     

    JPA의 성능 최적화 기능

    JPA를 잘만 사용한다면 성능은 오히려 상승할 수 있습니다. JPA의 성능 최적화 기능을 알아보겠습니다.

    1. 1차 캐시와 동일성(identity) 보장
    2. 트랜잭션을 지원하는 쓰기 지연(transactional write-behind)
    3. 지연 로딩(Lazy Loading)

     

    1. 1차 캐시와 동일성 보

     

    - 같은 트랜잭션 안에서는 같은 엔티티를 반환 - 약간의 조회 성능을 기대할 수 있습니다.

    - DB Isolation Level이 Read Commit이어도 애플리케이션에서 Repeatable Read을 보장한다

        Read Commit 단계의 고립단계는 한 트랜잭션 내에서 같은 읽기 수행의 결과가 다를 수 있습니다.(Unrepeatable Read) 그를 보완한 것이 Repeatable Read입니다. JPA에서는 애플리케이션 단에서 Repeatable Read를 보장하고 있습니다.

     

    2. 트랜잭션을 지원하는 쓰기 지원

     

    JPA에서는 트랜잭션을 지원하는 쓰기 지연을 제공하고 있습니다.

     

    INSERT 

    1. 트랜잭션을 커밋할 때까지 INSERT SQL을 모음

    2. JDBC BATCH SQL 기능을 사용해서 한번에 SQL을 모아서 전송

     

    UPDATE

    1. UPDATE, DELETE로 인한 로우(ROW)락 시간 최소화

    2. 트랜잭션 커밋 시 UPDATE, DELETE SQL 실행하고, 바로 커밋

     

     

     

    3. 지연 로딩과 즉시 로딩

    JPA는 지연 로딩과 즉시 로딩 기능을 설정만으로 간단하게 세팅할 수 있습니다.

    • 지연로딩 : 객체가 실제 사용될 때 로딩
    • 즉시로딩 : JOIN SQL로 한번에 연관된 객체까지 미리 조회

    Member와 Team이 연관관계가 있는 상태에서 지연 로딩을 사용하면 Member를 조회했을 때 SQL 한 번, Team을 조회했을 때 SQL 한 번 각각 수행됩니다. 즉, 실제 객체가 사용될 때만 로딩합니다.

    하지만 즉시 로딩은 연관관계가 있을 때, Member를 조회하면 그것과 연관된 Team까지 한번에 쿼리 한번에 넣어 수행하게 됩니다.

     

    개발명세에 따라 로딩 정책이 변경될 수 있습니다. SQL을 직접 코딩한다면 지연/즉시에 관한 쿼리를 전부 바꿔줘야 하는 번거로움이 생기지만 JPA를 이용한다면 세팅 한번으로 해당 정책을 변경할 수 있습니다.

     

    이처럼 JPA를 시작하기 앞서 JPA의 특징에 대해 간단하게 알아봤습니다. 다음장은 JPA를 직접 시작해보도록 하겠습니다.

     

     

    [해당 게시글은 인프런 김영한님의 자파 ORM 표준 JPA 프로그래밍을 기반으로 작성됐습니다]

    댓글

Designed by Tistory.