이숭간 공부기록

[Spring] Sprign Data JPA (JpaRepository) 본문

공부공부/Spring Boot

[Spring] Sprign Data JPA (JpaRepository)

이숭간 2021. 5. 12. 23:59
728x90

Entity(Domain)

데이터베이스에 저장하기위해 유저가 정의한 클래스를 의미한다.

일반적으로 RDBMS에서 Table을 객체화 시킨것을 의미한다.

 

Repository

스프링부트에서 Entity의 기본적인 CRUD가 가능하도록 JpaRepository 인터페이스를 제공한다.

이때 Spring Data JPA에서 제공하는 JpaRepository인터페이스를 상속하는 인터페이스만 만들면 동적으로 구현체를 생성해서 주입해주기때문에 공짜로(?) CRUD를 이용할수 있게된다.

 

즉 데이터 접근계층 = DAO = Repository를 개발할때, 구현클래스없이 인터페이스만 작성해도 개발을 완료할 수 있도록 지원해준다.

JpaRepository를 단순하게 상속하면 이 인터페이스는 Entity하나에 대해서 다음과 같은 기능을 제공한다.

  • save() : insert, update
  • findOne() : primary key로 레코드 하나 찾기
  • findAll() : 전체 레코드 불러오기 (sort, pageable 가능)
  • count() : 레코드개수
  • delete() : 레코드삭제

위와같이 기본기능을 제외한 조회기능을 추가하고 싶으면 규칙에 맞는 메서드를 직접 추가해야한다.

  • findBy로 시작 : 쿼리를 요청하는 메소드임을 알린다.
    • 이어서 해당 엔티티 필드이름을 입력하면 where절을 사용하는것과 같다고 생각하면 된다.
  • countBy로 시작 : 쿼리 결과 레코드 수를 요청하는 메서드임을 알린다.

Pageable

쿼리 메소드의 입력변수로 Pageable변수를 추가하면 Page타입을 반환형으로 사용할 수 있다.

Page를 반환타입으로 받으면 전체 데이터 수를 조회하는 count쿼리가 추가로 날라간다.

Pageable객체를 통해 페이징과 정렬을 위한 파라미터를 전달할 수 있다.

  • page : 몇번째 페이지 인지를 전달
  • size : 한 페이지에 몇개의 항목을 보여줄것인지 전달
  • sort : 정렬정보 (필드이름, 정렬방향의 포맷(오름?내림?))

Pageable입력변수는 Controller에서부터 전달받아야한다.

컨트롤러를 통해 HTTP요청으로 전달받은 정렬과 페이지 정보를 접속URI에서부터 Repository까지 전달하는것이다.

 

반환타입

결과가 단건일 경우 T형태와 Optional<T> 형태 2개로 받을 수 있다.

결과가 2건이상 나올경우 javax.persistence.NonUniqueResultException 예외가 발생하고,

결과가 0건일 경우 T일때는 null, Optional<T>일때는 Optional.empty()를 리턴한다.

 

사용자 정의 Repository 구현

Spring Data JPA로 개발하면 인터페이스만 정의하고 구현체는 만들지 않는데, 다양한 이유로 메서드를 직접 구현해야 할때가 있다.

그렇다고 Repository를 직접 구현하면 최상단 인터페이스까지(공통 인터페이스)가 제공하는 모든 기능을 다 구현해야 한다.

이런 문제로 인해 내가 필요로 하는 메서드만 구현할 수 있는 방법을 제공한다.

1. 먼저 사용자가 직접 구현할 메서드를 위한 인터페이스를 작성한다.

2. 1번에서 만든 인터페이스를 구현할 클래스를 작성한다. 

    이때 클래스 이름은 리포지토리 인터페이스 이름+Impl로 지어야한다. 

    이렇게 하면 Spring Data JPA가 사용자 정의 구현 클래스로 인식한다.

3. 리포지토리 인터페이스에서 1에서 만든 사용자정의 인터페이스를 상속받는다.

 

 

 

참고링크: 

jobc.tistory.com/120

 

JPA 사용법 (JpaRepository)

JPA에 대한 개념은 이해가 갔지만 처음 코드를 접했을 땐 이해 안가는 부분이 많았다. 그래서 잘 정리된 블로그를 참고해 다시 한번 사용법을 알기 쉽게 정리해보고자 한다. Entity 먼저 데이터베

jobc.tistory.com

joont92.github.io/jpa/Spring-Data-JPA/

 

[jpa] Spring Data JPA

Spring Data JPA는 스프링에서 JPA를 편리하게 사용할 수 있도록 지원하는 프로젝트다. 데이터 접근 계층을 개발할 때 지루하게 반복되는 CRUD 문제를 세련된 방법으로 해결할 수 있게 해준다. CRUD 처

joont92.github.io