이숭간 공부기록
[Spring] Sprign Data JPA (JpaRepository) 본문
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에서 만든 사용자정의 인터페이스를 상속받는다.
참고링크:
joont92.github.io/jpa/Spring-Data-JPA/
'공부공부 > Spring Boot' 카테고리의 다른 글
[Spring] DAO(=Repository), DTO(VO) 란? (0) | 2021.05.22 |
---|---|
[Spring] 오브젝트와 의존관계 (1) | 2021.05.16 |
[Spring] 스프링 빈(Bean)이란? (0) | 2021.05.16 |
JPA란? (0) | 2021.03.19 |
스프링부트 입문_ 회원관리 (백엔드 개발) (0) | 2021.03.13 |