자바 ORM 표준 JPA 프로그래밍 - 기본편을 정리한 내용입니다.

SQL 중심적인 개발의 문제점

  • 애플리케이션 개발할 때 객체지향 언어로 Java, Scala 등을 많이 쓴다.
  • DB로는 아직까지는 Oracle, MySQL과 같은 RDBMS를 많이 쓴다.
  • 객체를 관계형 DB에 관리하기 때문에 SQL를 작성해야 하는 게 필수이다.
  • SQL 중심적인 개발의 문제
    • 반복적인 CRUD 코드
    • 객체에 필드가 추가되면 쿼리에도 필드를 추가해야 한다. (SQL 의존적인 개발)
    • 객체지향과 관계형 DB와의 패러다임의 불일치
      • 객체 지향 프로그래밍은 시스템의 복잡성을 제어할 수 있는 추상화, 캡슐화, 정보은닉, 상속, 다형성 등을 제공
  • 상속관계의 차이
    • 객체의 상속관계가 DB에서 그나마 유사한 게 슈퍼타입과 서브타입 관계
    • Album에 저장하려면 객체 분해 후 각각 ITEM 테이블과 ALBUM 테이블에 저장해야 한다. (쿼리를 두 개 짜야함)
    • Album을 조회하려면 각 테이블을 조인하는 쿼리를 작성하고 각 객체를 생성 후 함께 조회해야 한다. (복잡하다.)
    • 그에 반해 자바 컬렉션에 저장과 조회는 매우 단순하게 작성할 수 있다. 상속관계
  • 연관관계의 차이
    • 객체는 member.getTeam()과 같이 참조를 사용한다.
    • 테이블은 조인으로 외래키를 사용한다.
    • 테이블에 객체를 저장하려면 객체를 테이블에 맞추어 모델링하여 저장해야 한다. (객체지향적인 모델링 X)
    • 객체는 자유롭게 객체 그래프를 탐색할 수 있어야 하지만 실행된 SQL의 결과에 따라 탐색 범위가 결정된다. (엔티티 신뢰 문제 발생)
    • 모든 객체를 미리 로딩할 수 없기 때문에 상황에 따른 조회 메소드를 여러 개 생성하게 된다.
  • 비교하기 차이
    • SQL 조회 결과를 생성한 객체에 각각 넣고 비교하면 레퍼런스가 다르기 때문에 다르다고 나온다.
    • 자바 컬렉션에서 참조 객체를 조회하여 비교하면 참조 값이 같기 때문에 같다고 나온다.
  • 객체답게 모델링할 수록 매핑 작업 증가
  • 객체를 자바 컬렉션에 저장하듯이 DB에 저장하기 위해 나온 게 JPA(Java Persistence API)

JPA 소개

  • Java Persistence API
  • 자바 진영의 ORM 기술 표준
    • Object-relational mapping(객체 관계 매핑)
    • 객체는 객체대로 설계하고 관계형 DB는 관계형 DB대로 설계하면 그 중간에서 ORM 프레임워크가 매핑해준다.
    • 대중적인 언어에는 대부분 ORM 기술을 가지고 있다.
      • Typescript, python 등
  • 자바 어플리케이션과 JDBC 사이에서 동작한다.
  • 기존의 자바 표준이이었던 EJB 엔티티 빈이 성능상 좋지 않았음 → 오픈 소스로 하이버네이트 등장 → 자바 진영에서 하이버네이트를 다듬은 자바 표준으로 JPA 개발
  • JPA는 인터페이스의 모음
  • JPA 표준 명세의 구현체인 하이버네이트, EclipseLink, DataNucleus가 있다. 대부분 하이버네이트를 사용한다.
  • 객체 중심적인 개발로 변화
  • JPA 동작 - 저장 JPA 동작 저장
  • JPA 동작 - 조회 JPA 동작 조회