Spring/JPA

JPA

whyWhale 2021. 5. 10.

JPA


  • Java Persistence API
  • 자바 ORM 기술에 대한 표준API다.
    • ORM : 객체와 관계형 DB를 매핑한다는 뜻이다.
    • 객체와 관계형 DB사이의 차이를 해결해주는 좋은 도구이다.

JPA 장점

특정 구현 기술에 대한 의존도를 줄이고 다른 구현 기술로 손쉽게 교체할 수 있다.

 

왜 JPA를 사용하는가?


생산성

  • Mybatis, SQL매퍼를 사용하면 JDBC API 사용 코드를 많이 줄일 수 있지만 여전히 반복적인 CRUD를 작성해야 한다.
  • 객체 중심적 설계에서 일정 Boundary에 도달하게 되면 데이터 중심 설계로 변질된다.
  • JPA는 실행시점에 자동으로 SQL을 만들어서 실행한다.
  • SQL 작성이 주가 아닌 어떤 SQL이 실행될지 생각만 하면된다.

유지보수

  • SQL을 직접 다루면 엔티티의 필드만 변경해도 모든 CRUD를 수정해야 한다.
  • 이런 과정은 JPA가 대신 처리해주므로 필드 추가,삭제해도 수정하는 범위가 줄어든다.
  • 객체 지향 언어가 가진 장점들을 활용해서 유연하고 유지보수 하기 좋은 Domain Modele를 설계를 할 수 있다.

패러다임의 불일치 해결

  • 상속
    • 객체는 상속 extends
    • 관계형 DB는 super/sub table
    • "jpa.persist()" 하나로 super,sub table 삽입 코드를 작성하지 않아도 된다.
    • "jpa.find()"하나로 super,sub를 조인하는 쿼리를 작성하지 않아도 된다.
  • 연관관계
    • 객체는 참조
      • 객체는 참조가 이루어지는 선,방향을 가지고 있는 쪽에서 참조를 한다.
    • 테이블은 FK
      • 테이블 관계에서는 닭발이 있는 곳에서 FK를 갖는다.
    • 객체를 참조를 보관해야하고 테이블은 키를 보관해야 한다.
    • JPA에는 참조할 객체를 저장하고 "persiste()"로 저장하면 객체와 관계형 DB 패러다임 불일치를 해결하기 위한 코드작성의 비용이 들지 않는다.
  • 객체 그래프 탐색
    • 처음 실행하는 SQL에 따라 객체 그래프를 어디 까지 탐색할 수 있을지 정해진다.
      • 그래서 DAO를 열어서 직접 sql 흐름을 다시 따라가야하는 비용이 발생한다.
      • 연관된 엔티티를 조회할 메소드를 일일히 작생해야 한다.
      • SQL에 의존적으로 개발하는 것이기 때문에, Entity가 SQL에 논리적으로 종속되어서 발생하는 문제이다.
    • JPA를 사용하면 안전하게 조회가 가능하다.
      • JPA는 실행시점까지 조회를 미루는 기능이 있는데 이것을 "지연로딩"이라고 한다.
      • JPA는 지연로딩을 투명하게 처리한다.
      • 실제 객체를 불러오는 시점이 아닌 연관 객체의 기능을 사용할 때 조회한다.
  • 비교
    • 객체는 동등성과 동일성으로 구분한다.
      • 동등성은 "==" 객체 인스턴스 주소 값을 비교.
      • 동일성은 .equlas()로 객체 내부의 값을 비교.
    • 객체는 PK로 각 row들을 구분한다.
    • 각 객체를 같은 아이로 조회 할떄 m1,m2는? new 연산을 통해 새롭게 할당받는 다면?
      • 다르다.
    • 패러다임 불일치를 해결하기 위해 DB의 같은 로우를 조회 할 때마다 같은 인스턴스를 반환하도록 구현하는 것은 쉽지 않고, 여기에 여러 트랜잭션이 동시에 실행되는 상활까지 고려하면 문제는 더 어려워진다.
    • JPA는 같은 트랜잭션일때 같은 객체가 조회되는 것을 보장한다.
      • JPA에서 "jpa.find(-.class,1) == jpa.find(-.class,1)" 동등성이 보장된다.

성능

  • 같은 ID를 조회하는 경우.
    • 웹 앱과 DB사이의 위치하는 JPA는 같은 아이디로 조회하는 것이 2번 오게 된다면 1번만 sql을 작성하고 보낸다.
    • 두번째에서 재사용한다.

 

데이터 접근 추상화와 벤더 독립성(Dialect)

  • 같은 기능도 각 벤더(Mysql,Oracle , ...) 마다 사용법이 다른 경우가 많다.
    • 페이징 처리, 등등
  • 결국 처음 애플리케이션 개발 때 선택한 DB 기술에 종속되고 다른 데이터베이스로 교체하는 것이 매우 어려웠다.
  • 하지만 JPA는 애플리케이션과 데이터베이스 사이의 추상화된 데이터 접근 계층을 제공하므로 특정 데이터베이스 기술에 종속되지 않고 있다.
  • 데이터베이스를 변경할 때 JPA에거 다른거로 교체했다고 알리기만 하면 된다.
  • 개발단게에서 h2를 쓰고 실제 서비스를 출시할 때는 Mysql을 사용할 때 비용 부담은 JPA가 한다.
  • JPA는 인터페이스의 모음이다.

 

 

댓글