[Springboot] JPA란? JPA를 사용하는 이유?

일단 해볼게·2023년 3월 7일
0

Springboot

목록 보기
19/26

JPA란?

  • Java Persistence API
  • 자바 진영에서 ORM(Object - Relational Mapping) 기술 표준으로 사용되는 인터페이스 모음
    • JPA를 구현한 라이브러리 예시 : Hibernate
    • JPA를 편하게 쓰기 위한 모듈 : Spring Data JPA
      • EntityManager가 아닌, Repository를 정의하여 사용하는 더 쉬운 방법 (Repository 내부적으로는 EntityManager을 사용)
  • 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크 (실제적으로 구현 X)

동작 과정

JPA 동작 과정 : JPA 내부에서 JDBC API를 사용하여 SQL 호출 및 DB와 통신

JPA를 사용해야 하는 이유

  • SQL 중심적인 개발에서 객체중심적인 개발이 가능하다.

  • 유지보수 및 리팩토링에 유리하다.

    • 기존 : 필드 변경시 모든 SQL 수정
    • JPA : 필드만 추가하면 된다. SQL은 JPA 가 처리한다.
  • Object와 RDB간의 패러다임 불일치 해결

    • 상속 / 연관관계 / 객체 그래프 탐색 / 비교하기 같은 패러다임 불일치(RDB에 객체를 저장하는 데 불일치가 발생함)를 해결한다.

      • 상속


        기존에는 Dtype 컬럼을 이용해 어떤 자식 테이블과 관계가 있는지 정의한다. 예를 들어 Dtype의 값이 MOVIE면 영화 테이블과 관계가 있다. JPA는 자바 컬렉션에 객체를 저장하듯이 JPA에게 객체를 저장하면 된다.

      • 연관관계

        • 테이블 : 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 조회

          • 외래키로 양방향 모두의 참조가 가능하다.
        • 객체 : 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체 조회
          - 참조가 있는 방향으로만의 참조가 가능(단방향)

          → JPA는 참조를 외래키로 변환 또는 외래키를 참조로 변환해서 적절한 SQL을 데이터베이스에 전달한다.

      • 객체 그래프 탐색

        • 객체가 참조를 사용해서 연관된 데이터를 찾는 것을 의미한다.
        • SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다.
          • Member와 Team을 join하면 두 테이블에 대한 정보만 얻을 수 있다. 여기서 getOrder()를 하면 Order에 연관된 객체 그래프를 탐색할 수 없다. 이처럼 어디까지 객체 그래프 탐색이 가능한지 알아보려면 DAO를 분석해서 SQL을 직접 확인해야한다.
          • 이를 해결하려면 Member와 연관된 모든 객체 그래프를 데이터베이스에서 조회해서 애플리케이션 메모리에 올려둬야하는데 메모리적으로 말이 안된다.
        • JPA는 실제 객체를 사용하는 시점까지 DB조회를 미룬다(지연로딩). 따라서 연관된 객체를 신뢰하고 조회할 수 있다.
          • getOrder() 사용하는 시점에서 SQL을 실행해 필요한 데이터를 가져온다.
      • 비교

        • 데이터베이스는 기본키의 값으로 구분하지만 객체는 동일성 비교(==)와 동등성 비교(equals())의 두가지 방법이 존재한다.
          • SQL을 통해 기본키가 같은 객체를 불러와 매핑하면 동일성을 비교할 때 false가 반환된다. 같은 로우지만 객체로 볼 때 다른 인스턴스이기 때문이다.

            long memberId = 100;
            // new member
            Member member1 = memberDao.getMember(memberId);
            // new member
            Member member2 = memberDao.getMember(memberId);
            
            member1 == member2; // false
          • MemberDao.getMember()는 호출할 때마다 new Member()로 새로운 인스턴스가 반환되기 때문이다.

        • JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다. 그러므로 동일성 비교에 성공한다.

참고
https://baby9235.tistory.com/67

https://velog.io/@sooyoungh/JPA를-쓰는-이유와-JPA-소개

profile
시도하고 More Do하는 백엔드 개발자입니다.

0개의 댓글