JPA_Chap01_JPA 소개

윤일권·2023년 4월 4일
0

JPA

목록 보기
1/11

'자바 ORM 표준 JPA 프로그래밍'책으로 스터디를 진행하게 되었다.
처음 JPA는 공부해야한다! 라는 말을 들었지만, JPA가 진정 무엇인지 잘 모르고 있었다.
이번 스터디를 통해 매주 공부한 내용을 업로드하려한다.

JPA 소개

SQL을 직접 다룰 때 발생하는 문제점

  • 위 그림과 같이 자바 애플리케이션은 JDBC API를 통해 SQL문을 활용하여 DB와 통신한다.

서로 다른 구조

  • 데이터 베이스 : 데이터 중심의 구조를 가진다.
  • 객체지향 애플리케이션 : 객체 구조를 가진다.
  • 때문에 개발자가 객체지향 애플리케이션과 데이터베이스 중간에서 SQL과 JDBC API를 사용해서 변환 작업을 직접 해줘야하는 문제점이 발생한다.
  • SQL에 의존적인 개발을 할 경우 데이터 접근 계층을 사용해서 SQL을 숨겨도 어쩔 수 없이 DAO를 열어서 어떤 SQL이 실행되는지 확인해야한다.
  • 논리적으로 엔티티와 아주 강한 의존관계를 가지고 있어 이러한 관계는 객체에 필드를 하나 추가할 때도 DAO의 CRUD코드와 SQL 대부분을 변경해야 한다.
  1. 진정한 의미의 계층 분할이 어렵다.
  2. 엔티티를 신뢰할 수 없다.
  3. SQL에 의존적인 개발을 피하기 어렵다.
이러한 이유로 기존 SQL을 직접 다룰 때 문제들이 발생한다.
그렇다면 JPA는 이 문제를 어떻게 해결할까?

JPA와 문제 해결

  • JPA 사용 -> JPA가 제공하는 API사용 -> 개발자를 대신해 적절한 SQL을 생성해 DB에 전달.
    <해당 내용은 이후 자세히 알아보자!>

패러다임의 불일치

객체와 관계형 데이터베이스는 지향하는 목적이 서로 다르므로 둘의 기능과 표현 방법도 다르다.
이것을 객체와 관계형 데이터 베이스의 패러다임 불일치 문제라 한다.
따라서 객체 구조를 테이블 구조에 저장하는 데는 한계가 있다.

  • 상속
    • 객체 : extends를 활용한 상속
    • 데이터베이스 : 슈퍼/서브타입 관계를 사용하면 객체 상속과 유사한 형태로 테이블 설계 가능. (상속이라는 기능은 아니다.)
    • JPA : 마치 자바 컬렉션에 객체를 저장하듯이 JPA에게 객체를 저장하면 된다.
  • 연관관계
    • 객체 : 참조를 사용해서 다른 객체와 연관관계를 가지고 참조에 접근해서 연관된 객체를 조회
    • 데이터베이스 : 테이블을 외래 키를 사용해서 다른 테이블과 연관관계를 가지고 조인을 사용해서 연관된 테이블을 조회.
    • 둘 사이의 패러다임 불일치는 객체지향 모델링을 거의 포기하게 만들 정도로 극복하기 어렵다.
    • 객체를 테이블에 맞추어 모델링
      • RDB는 조인을 통해 외래 키의 값을 그대로 보관하지만, 객체는 연관된 객체의 참조를 보관해야 참조를 연관된 객체를 찾을 수 있다.
      • 이는 좋은 객체 모델링을 기대하기 어렵고, 객체지향의 특징을 잃어버리게 된다.
    • 객체지향 모델링
      • 객체지향 모델링을 사용하면 객체를 테이블에 저장하거나 조회하기 쉽지않다.
      • 테이블은 참조가 필요없고 외래 키만 있으면 된다. 하지만 이 과정을 개발자가 중간에서 변환 역할을 해야한다.
      • 결국 이는 패러다임 불일치를 해결하려고 비용을 소모한다.
    • JPA : JPA는 객체를 조회할 때 외래 키를 참조로 변환하는 일을 처리해준다.
  • 객체 그래프 탐색
    • SQL을 직접 다루면 처음 실행하는 SQL에 따라 객체 그래프를 어디까지 탐색할 수 있는지 정해진다.
    • 하지만 이는 객체지향 개발자에겐 비즈니스 로직에 따라 사용하는 객체 그래프가 다른데 언제 끊어질지 모를 객체 그래프를 함부로 탐색할 수 없어 큰 제약이 된다.
    • 결국엔 어디까지 객체 그래프 탐색이 가능한지 알아보려면 DAO를 열어서 SQL을 직접 확인해야한다.
    • 이는 엔티티가 SQL에 논리적으로 종속되어서 발생하는 문제다.
    • JPA : 연관된 객체를 즉시 함께 조회할지 아니면 실제 사용되는 시점에 지연해서 조회할지를 간단한 설정으로 정의할 수 있다.
  • 비교
    • 객체 : 동일성 비교와 동등성 비교라는 두 가지 비교 방법이 있다.
    • 데이터베이스 : 기본 키의 값으로 각 row를 구분한다.
    조회한 회원 비교하기
    String memberId = "100";
    Member member1 = memberDAO.getMember(memberId);
    Member member2 = memberDAO.getMember(memberId);
    member1 == member2 ; // false
    • 위 코드와 같이 데이터베이스의 같은 로우를 조회했지만 객체의 동일성 비교에는 실패한다.
    • 이를 위해 데이터베이스의 같은 row를 조회할 때마다 같은 인스턴스를 반환하도록 구현하는 것은 어렵고, 여기에 여러 트랜젝션이 동시에 실행되는 상황까지 고려하면 더더욱 힘들어진다.
    • JPA : 위 코드와 달리 JPA는 같은 트랜잭션일 때 같은 객체가 조회되는 것을 보장한다.

JPA란 무엇인가?

  • JPA는 자바 진영의 ORM 기술 표준이다.
    그림과 같이 애플리케이션과 JDBC 사이에서 동작한다.
  • ORM 이란?
    • Object-Relational Mapping으로 객체와 관계형 데이터베이스를 매핑한다는 뜯이다.
    • ORM프레임워크는 객체와 테이블을 매핑해줌으로 패러다임의 불일치 문제를 해결해준다.
  • 하이버네이트
    • 거의 대부분의 패러다임 불일치 문제를 해결해주는 성숙한 ORM 프레임워크.

JPA 소개

  • 과거, 엔터프라이즈 자바 빈즈라(EJB)는 기술 표준을 만듬 -> 엔티티빈이라는 ORM 기술 포함 -> 너무 복잡하고 기술성숙도도 떨어지며, 자바 엔터프라이즈 애플리케이션 서버에서만 동작
  • 이후, 하이버네이트 등장 -> EJB의 ORM 기술과 비교해서 가볍고 실용적이며 기술 성숙도가 높다.
  • 많은 개발자 사용 이후, EJB3.0 -> 하이버네이트를 기반으로 새로운 자바 ORM 기술 표준 만듬 -> 이것이 JPA다.
  • JPA는 자바 ORM 기술에 대한 API 표준 명세서다.

왜 JPA를 사용해야 하는가?

  • 생산성
    • 자바컬렉션에 객체를 저장하듯이 JPA에게 저장할 객체를 전달.
    • JPA에는 DDL문들 자동으로 생성해주는 기능이 있다.
    • 이와 같은 기능으로 데이터베이스 설계 중심의 패러다임 -> 객체 설계 중심 으로 역전.
  • 유지보수
    • 필드 추가 및 삭제시 수정 코드가 줄어든다.
    • 코드 수 감소로 유지보수 용이
    • JPA 패러다임의 불일치 문제를 해결 -> 객체지향 언어가 가진 장점을 활용
  • 패러다임의 불일치 해결
    • 상속, 연관관계, 객체 그래프 탐색, 비교하기와 같은 패러다임의 불일치 문제 해결
  • 성능
    String memberId = "100";
    Member member1 = memberDAO.getMember(memberId);
    Member member2 = memberDAO.getMember(memberId);
    • JDBC API는 위 코드 조회를 위해 베이터베이스와 두번 통신
    • JPA는 select sql을 한 번만 데이터베이스에 전달 -> 두 번째는 조회한 회원 객체 재사용
  • 데이터 접근 추상화와 벤더 독립성

    • 특정 데이터 베이스 기술에 종속되지 않기 때문에, 데이터 베이스 변경 시 JPA에게 알려주기만 하면 된다.
    이번 장에서는 기존에 객체와 데이터베이스를 JDBC를 활용해 SQL로 데이터를 구조 받을 경우 생기는 문제점과
    JPA가 이를 어떻게 보완하고, 어떤 이유로 사용하는지에 대해 알아보았다.
profile
생각하는 개발자가 되겠습니다!!

0개의 댓글