카테고리 없음

JPA

기기디 2024. 2. 22. 16:35

정의

  • Java Persistence API. 자바에서 ORM기준 표준으로 사용되는 인터페이스 모음을 말한다.
  • 자바 어플리케이션에서 관계형 데티어베이스를 사용하는 방식을 정의한 인터페이스
  • 인터페이스이기 때문에 별도로 JPA의 구현체가 필요하다. 대표적으로 Hibernate가 있다.
  • 정리 : 자바의 ORM기술표준으로 인터페이스의 모음이 됩니다. 엄밀히 따지면 인터페이스이기 때문에 Hibernate와 같은 구현체가 필요하고 스프링에서는 SpringDataJPA를 통해 JPA를 사용합니다. JPA를 사용하면 개발자가 쿼리를 직접 작성하지 않고도 db테이블과 맵핑되어있는 엔티티 모델클래스와 자바메소드를 이용하여 DB를 조작할 수 있게 만들어줍니다.

특징

  • 영속성 컨텍스트
    • 엔티티를 DB에 영속화 시킬수 있는 환경을 말한다. 엔티티 매니저를 통하여 영속성 컨텍스트에 접근하고 관리하는것이 가능하다. 엔티티 모델클래스를 엔티티매니저를 거쳐 영속성 컨텍스트에 저장시킨다.
    • 엔티티를 담고 있는 집합으로 영속성컨텍스트에 속해 있는 엔티티만 트랜잭션이 끝나는 시점에 테이블에 변경된 내요을 반경하게 된다. 이러한 특징으로 인해서 엔티티 객체의 값만 변경해주면 update query없이도 값을 수정할 수 있다.(더티체킹)
    • 특징
      • 엔티티를 식별자값(@id로 테이블의 기본키와 맵핑한 값)으로 구분한다.
      • 영속상태에서는 식별자값이 반드시 있어야하고 없을경우 예외가 발생한다.
    • 장점
      • 엔티티 조회시 영속성컨텍스트 내부에 캐시가 존재한다. 캐시의 키는 식별자값을 사용한다.
      • 버퍼링기능 지원 통해서 불필요하게 네트워크 타는 횟수를 줄인다.
  • 엔티티의 생명주기
    • 비영속
      • 영속성컨텍스트와 관계가 없는 상태
      • 순수한 자바 객체의 상태로 DB, 영속성컨텍스트와 상관이 없다.
    • 영속managed
      • 영속성 컨텍스트에 저장된 상태
      • 엔티티매니저를 통해 영속성 컨텍스트에 저장된 상태로 영속성 컨텍스트에 의해 관리된다는 뜻이다.
      • em.find나 JPQL을 통해 조회한 엔티티도 영속상태다.
      • 이 상태에서 엔티티의 값을 바꾸면 트랙잭션이 끝날때 DB에 반영된다.
    • 준영속detached
      • 영속성 컨텍스트에 저장되었다가 분리된 상태
      • em.detach호출로 사용할 수 있다.
      • 영속상태에서 영속성컨텍스트가 관리하지 않으면 준영속 상태에 빠진다.
      • 캐시, 지연로딩, 더티체킹 업데이트, 버퍼링 기능을 제공하지 않는다.
      • 다시 영속상태로 변경하기 위해서는 merge()를 사용하면 된다.
    • 삭제removed
      • 삭제된상태

장점

  • 생산성
    • SQL문을 사용하지않고 메소드를 통해 DB를 조작할 수 있어 개발자가 쿼리에 신경쓰지 않고 객체모델을 이용하여 비즈니스 로직을 구성하는데만 집중가능하다.
    • MyBatis를 사용할때 필요한 선언문,할당 같은 부가적인 코드가 줄어든다. → Mybatis를 사용할때는 쿼리 말고도 할당,선언해주어야하는 부분들이 있는데 그런부분들이 줄어듭니다.
    • 흔한 경우는 아니지만 데이터베이스가 바뀌는 경우 쿼리를 새롭게 짤 필요가 없다
    • 간단하게 반복되는 CRUD를 작성할 필요 없다.
    • 설정에 따라 객체를 변경하면 알아서 DB에 update가 나가도록 할 수 있다.
    • 유지보수 측면에서 Mybatis는 컬럼에 변동이 있을경우 많은 SQL들을 수정해야하는 반면에 JPA는 엔티티에 필드만 추가하면 된다.
    • 정리 : 장점으로 생산성이 좋아집니다. 자바객체와 메소드를 가지고 db로 질의를 날릴수 있어서 쿼리를 작성하는 시간이 줄어들고 쿼리외에도 mybatis를 사용하기 위해 할당,선언해줘야하는 xml같은 작업이 줄어듭니다. 반복되는 간단한 CRUD같은 경우 이런 부분에서 크게 체감이 됩니다. 그것 외에도 테이블 컬럼에 변동이 있을때 엔티티클래스에 수정만 해주면 되기 때문에 편리합니다. → 가장 큰 장점으로는 생산성이있습니다.
  • 객체지향 관점
    • 객체지향적인 코드작성이 가능하다. 쿼리가 아닌 객체중심으로 개발할 수 있다. 보통 패러다임의 불일치를 해결했다고 한다. java에서는 상속이라는 개념이 존재하는데 DB에서는 이런 객체의 상속관계를 지원하지 않는다.
    • 자바코드를 통하여 자유로운 객체그래프 탐색이 가능하다. 지연로딩전략을 통해 객체를 사용하는 시점에 Select쿼리를 날려서 객체를 가져오도록 할 수 있다.
    • 정리 : 개체지향적인 개발이 가능합니다. 자바의 개체인 클래스를 엔티티로 하여 테이블과 매핑을 하고 이를 이용하여 db를 조작하는것이 가능하기 때문입니다. 이를 통해 테이블상속관계를 엔티티로 표현하기도 하고 객체그래프 탐색을 통하여 데이터를 조회하는것도 가능합니다. 다만 객체그래프 탐색시에는 로딩전략을 잘 설정하는것이 중요하겠습니다.
  • 성능최적화
    • JPA는 JDBC와 DB사이에 존재하기 때문에 버퍼링,캐싱기능을 지원한다.
    • 캐싱 : 같은 트랜잭션 안에서는 같은 엔티티를 반환하여. 조회시 같은 메소드를 두번 실행시키더라도 실제로 SQL은 한번만 실행된다.
    • 버퍼링 : 트랜잭션을 커밋할때 까지 INSERT SQL을 쌓아놨다가 한번에 전송한다. INSERT Query를 매번 실행시켜 불필요한 네트워크를 타지 않는다.
    • 정리 : 한 트랜잭션 안에서 이런 특징들을 모르고 기존 mybatis처럼 사용할 경우 개발자가 의도한대로 동작하지 않을 수 있습니다.

단점

  • 설계가 잘못된 경우 속도가 떨어지거나 코드 일관성이 떨어질 수 있다.
  • 복잡하고 무거운 쿼리는 속도를 위한 별도의 튜닝이 필요하여 결국 SQL문을 사용할 수 있다.
  • 높은 학습곡선
    • 캐싱, 버퍼링과 같은 특성들을 잘 모르고 기존에 사용하던 MyBatis처럼 사용할 경우 개발자가 의도한대로 동작하지 않을 수 있다. entity duplicate등...

부가정리 및 설명

ORM - Object Relational Mapping

  • 스프링과 같은 어플리케이션의 Class와 DB의 테이블을 연결(매핑)한다는 뜻이다.
  • ORM프레임워크는 DB와 어플리케이션 사이에 중간을 매핑해주는 역할을 한다.
  • 어플리케이션의 객체를 DB테이블에 자동으로 영속화 해주는것이다.

영속성

  • 하나의 객체가 자신을 생성한 작업이 종료되었음에도 불구하고 지속적으로 존재하는 상태를 말한다.
  • 소멸되지 않고 저장될 수 있는 데이터의 성질을 말한다.
  • JPA에서는 엔티티를 영속화하여 DB에 저장한다.

Spring Data JPA

  • JPA를 쉽게 사용하기 위하여 스프링에서 제공하는 프레임워크
  • Spring Data Redis, MongoDB등이 존재한다.

참고 및 레퍼런스

https://velog.io/@adam2/JPA는-도데체-뭘까-orm-영속성-hibernate-spring-data-jpa

https://ultrakain.gitbooks.io/jpa/content/chapter3/chapter3.4.html

https://suhwan.dev/2019/02/24/jpa-vs-hibernate-vs-spring-data-jpa/