ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [스프링] 스프링 데이터 JPA
    스프링 2022. 12. 28. 15:46
    728x90

    JPA(Java Persistent API)란?

    JPA는 자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세를 뜻한다. 

     

    그 말은 즉, 실제적으로 구현된것이 아니라 구현된 클래스와 매핑을 해주기 위해 사용되는 프레임워크이다.

    -> 인터페이스의 모음이기에 Hibernate가 JPA를 구현한다.

     

    ORM을 간단히 짚고가자,

    객체와 DB테이블을 매핑(연결)해서 데이터를 객체화하는 기술이다. [ 객체 <-> DB테이블 ]개발자가 직접적으로 SQL문을 직접 작성하지 않아 DBMS에 종속적이지 않은 상태로 객체를 RDB 테이블에 자동으로 영속화 해준다고 생각하면 된다.

     

     

    ORM 장점

    • 개발자가 SQL문을 직접 작성하지 않아도 되어서 비즈니스 로직에만 집중할 수 있.
    • SQL문이 아닌 클래스의 메서드를 통해 데이터베이스를 조작할 수 있다.
    • DBMS에 종속적이지 않다.

    ORM 단점

    • 복잡하고 무거운 Query 사용시에는 직접 SQL을 작성하는 것보다 성능이 떨어질 수 있다.
    • 사용하기 위해서는 ORM 기술을 학습해야 하는 러닝커브가 존재한다.

     

    그렇다면 왜 JPA를 사용할까?

    1. 반복적인 CRUD SQL을 처리해준다. 

    2. SQL아닌 객체 중심으로 개발할 수 있다는 것이다. 이에 따라 당연히 생산성이 좋아지고 유지보수도 수월하다.

    3. 패러다임의 불일치 해결해준다.

     

    패러다임 불일치

    객체를 테이블에 매핑하는 생기는 문제로, 예를들면 객체에는 상속 & 다형성의 개념이 있지만, 테이블에는 상속과 다형적인 관계를 표현할 방법이 없고, 객체는 방향이 존재하지만, 테이블은 방향의 개념이 없다!

     

    Spring Data Jpa란?

    Spring Data JPA는 JPA를 사용하기 편하도록 만들어놓은 모듈이다. 

     

    Spring Data JPA는 JPA를 한 단계 더 추상화시킨 Repository 인터페이스를 제공한다. 

    이러한 Spring Data JPA는 Hibernate와 같은 JPA구현체를 사용해서 JPA를 사용하게 된다. 

     

    결국, Spring Data JPA는 JPA를 사용하기 쉽게 스프링에서 제공하는 모듈로 내부적으로 JPA 구현체를 이용한다.

     

     

    Spring Data Jpa 기능

     

    1.  공통 인터페이스 기능

    스프링 데이터 JPA를 사용하는 단순한 방법은 인터페이스를 상속받아서 사용하는 것이다

    public interface MemberRepository extends JpaRepository<Member, Long> {}
    // Member ->  엔티티
    // Long ->  식별자 타입

    이렇게 상속받으면, save(S) delete(T) findOne(ID) getOne(ID) findAll(..) 등의 기본적인 메소드 제공됨

    S = 엔티티와 그 자식 타입, T = 엔티티, ID = 엔티티의 식별자 타입

     

    2.  쿼리 메소드기능

    정해진 규칙에 따라서 만든 메소드 이름만으로 스프링 데이터 JPA가 자동으로 적잘한 JPQL 쿼리 생성해서 실행해준다.

     

     

    3.  반환 타입

    스프링 데이터 JPA는 유연한 반환 타입을 지원하는데 결과각 한건 이상이면 컬렉션 인터페이스를 사용하고, 단건이면 반환 타입을 지정ㅎ한다

    List<Member> findByName(String name); // 컬렉션
    Member findByEmail(String email); // 단건

    조회 결과가 없으면 빈 컬렉션을 반환하고 단건은 null을 반환한다.

    단건을 기대하고 반환 타입을 지정했는데 결과가 2건 이상이면, 예외를 무시하고 null 을 반환한다.

     

     

    4.  페이징, 정렬

    org.springframework.data.domain.Sort : 정렬기능
    org.springframework.data.domain.Pageable : 페이징 기능 ( 내부에 sort 포함 )

    Pageable을 사용하면 반환 타입으로 list, page 사용 가능하다

     

    page를 사용하면 검색된 전체 데이터 건수를 조회하는 count 쿼리를 추가로 호출해준다

    // count 사용
    Page<Member> findByName(String name, Pageable pageable);
    
    // count 사용 안함
    List<Member> findByName(String name, Pageable pageable);
    List<Member> findByName(String name, Sort sort);

    Pageable와 page를 통해서 지루하고 반복적인 페이징을 쉽게 처리 가능

     

     

    5.  도메인 클래스 컨버터 기능

    도메인 클래스 컨버터는 HTTP 파라미터로 넘어온 엔티티의 아이디로 엔티티 객체를 찾아서 바인딩해준다

    URL : /member/memberUpdateForm?id=1
    ?id=1 을 말한다

    HTTP 요청으로 회원의 아이디를 받지만, 도메인 클래스 컨버터가 중간에서 아이디를 회원 엔티티로 변환해서 넘겨준다

    따라서, 컨트롤러를 단순하게 사용할 수 있다.

     

    뜬금없지만, 트랜잭션은 서비스 계층에서 하자.
    OSIV를 사용안하면 엔티티가 준영속 상태라 할말 없지만, 사용한다면 영속상태임에도 OSIV의 특성상 컨트롤러와 뷰 파트에서는 영속성 컨텍스트를 플러시 하지 않기 때문에 디비 반영이 안되기 때문이다.

     

    참고

    https://code-lab1.tistory.com/288

     

    [JPA] JPA란? Spring Data JPA란? Hibernate란?

    JPA(Java Persistent API)란? JPA는 자바 ORM(Object Relational Mapping) 기술에 대한 API 표준 명세를 뜻한다. ORM 기술이란? ORM 기술은 말 그대로 객체와 관계형 데이터 베이스를 매핑해 주는 기술이다. 객체는 객

    code-lab1.tistory.com

    https://dbjh.tistory.com/77

     

    [Spring JPA] JPA 란?

    이번 글에서는 JPA(Java Persistence API)가 무엇인지 알아보려고한다. JPA는 자바 진영에서 ORM(Object-Relational Mapping) 기술 표준으로 사용되는 인터페이스의 모음이다. 그 말은 즉, 실제적으로 구현된것이

    dbjh.tistory.com

     

    '스프링' 카테고리의 다른 글

    [스프링] 트랜잭션과 락,2차캐리  (0) 2022.12.28
    [스프링] OSIV  (2) 2022.12.28
    [스프링] 객체지향 쿼리 심화  (0) 2022.12.26
    [스프링] QueryDsl 정리  (0) 2022.12.26
    [스프링] JPQL 정리  (0) 2022.12.26
Designed by Tistory.