이번 포스트에선 앞선 두 포스트로 만들어진 QClass를 사용하여 Database를 조작을 준비해 보겠다.
(여기서 조작은 쉽게 CRUD를 얘기한다.)
우선 Entity와 QClass까지 생성이 됐다면 이번엔 Repository를 생성해야 한다.
*JPA Repository란 Spring Data JPA에서 제공하는 JPA 구현을 위한 인터페이스이다.
우리는 이 인터페이스를 상속하여 이미 정의된 메소드를 사용해 Database를 조작할 수 있다.
본인의 프로젝트에 적당한 경로에 Interface를 하나 생성 해주자
이렇게 만들어진 Interface에 2가지 작업을 해주자
1. @Repository 어노테이션 추가
2. extends JpaRepository<>로 JpaRepository 상속
여기서 JpaRepository를 잠깐 살펴보면
이미 정의되어 있는 여러가지 메소드가 존재한다.
우린 상속 받았기 때문에 JpaRepository에서 정의되어 있는 모든 메소드를 사용할 수 있다.
그리고 JpaRepository가 어떠한 값들을 받는지 보면 JpaRepository<T, ID> 를 보면된다.
여기서 T는 우리가 사용할 Entity를 의미하고
ID는 해당 Entity에서 사용하는 @Id를 붙인 고유식별 키의 자료형을 의미한다.
따라서 본인이 만든 CommonCodeRepository에선 extends JpaRepository<CommonCode, Long> 으로 입력하면 된다.
여기까지 한다면 JpaRepository에서 제공하는 메소드를 사용하여 Database를 조작할 수 있다.
몇가지 예시를 보면
List<T> findAll()
- 모든 데이터를 조회하여 조회한다.
List<T> findAll(Sort sort)
- 모든 데이터를 정렬하여 조회한다.
- paging 가능
List<T> findById()
- id로 특정 데이터를 조회한다.
등등 많은 메소드가 존재한다.
이번 포스트는 QueryDSL을 위한 내용인만큼 다음으로 넘어가보겠다.
여기서 하나 집고 넘어가야할 것이 있다.
지금 우리는 JpaRepository를 상속 받아서 CommonCodeRepository를 생성하였다.
그럼 여기서 QueryDSL을 사용해서 우리가 원하는 새로운 메소드를 생성하여 사용하려면 어떻게 해야할까?
우선 우리가 생성한 CommonCodeRepository는 Interface이다.
구현 클래스가 아니므로 이 곳에 메소드를 구현 할 수 없다.
그럼 CommonCodeRepository에 메소드를 정의하고 쉽게 CommonCodeRepositoryImpl 이라는
구현 클래스를 만들어서 CommonCodeRepositoryImpl에서 메소드를 구현하여 사용하면 될까?
만약 위와 같은 방식으로 진행하여 CommonCodeRepositoryImpl을 만들어보겠다.
(위와 같은 방식으로 하지 않을거니깐 따라하지마세요)
보이는가
엄청 많은 메소드들이 Override 됐다.
왜 그런가 생각해보면
우리는 CommonCodeRepository에서 이미 JpaRepository를 상속 받아서 사용하는 중이었다.
그럼 여기서 CommonCodeRepository를 구현하는 클래스를 만든다면 해당 구현 클래스에서는 JpaRepository에 정의되어있는 메소드들(findAll, findById, delete, deleteAll...등등)도 모두 Override 해야하는 것이다.
따라서 위와 같은 방법으로 사용하지 않는 것이다.
그럼 어떤 방법이 있는가
- 바로 QueryDSL을 위한 새로운 Interface를 생성하고 원하는 메소드를 정의한 뒤에
- 생성된 Interface를 구현하는 클래스를 만들어 메소드를 구현하고
- CommonCodeRepository에서 QueryDSL을 위해 생성한 새로운 Interface 또한 상속하면 되는 것이다.
설명이 이해되지 않을 수 있으니 다시 한번 그림으로 정리해보자.
위 그림에서 CommonCodeQueryRepository는 본인이 앞으로 생성할 Interface와 구현 Class 이름이다.
이렇게 새로운 Interface와 그를 구현하는 Class를 만들고 Interface를 다시 extends하면 되는 것이다.
해보자
다음 포스트에서...
'Web' 카테고리의 다른 글
맨땅에 JPA - QueryDSL Database 조작2 (0) | 2023.07.07 |
---|---|
맨땅에 JPA - Entity와 QClass (0) | 2023.07.07 |
맨땅에 JPA - 설정 (0) | 2023.07.07 |
JavaMailSender란 녀석을 만났다. (0) | 2023.06.19 |
IntelliJ 로컬서버와 실제 운영서버 소스코드 비교/수정/반영(Deployment) (0) | 2023.02.22 |