* 스프링데이터 JPA repository 인터페이스
- PagingAndSortingRepository<T,ID> -> CrudRepository<T,ID> -> Repository<T,ID>
Repository 인터페이스: 별기능 없음
CrudRepository 인터페이스: CRUD에 해당하는 제공되는 기능 사용가능
PagingAndSortingRepository 인터페이스: CrudRepository 인터페이스 기능 + 페이징 및 정렬기능 추가 + JPA특화된 기능까지 추가
스프링 데이터 JPA를 이용하면 Repository 인터페이스를 기준으로 동적실행 할수 있는 메소드 생성해줌
- CrudRepository가 제공하는 인터페이스
public interface CrudRepository<T, ID> extends Repository<T, ID> {
<S extends T> S save(S entity);
Optional<T> findById(ID primaryKey);
Iterable<T> findAll();
long count();
void delete(T entity);
boolean existsById(ID primaryKey);
// … more functionality omitted.
}
- JPA 쿼리 사용하는 방법
1)스프링 데이터 JPA에서 제공하는 CrudRepository 상속받는다
CrudRepository인터페이스는 Repository에서 사용할 도메인클래스와 BoardEntity 클래스의 pk타입인 Integer를 사용
CrudRepository인터페이스에서 제공하는 기능을 이용해서 추가되는 2개만 메소드 작성함
2)쿼리메소드
스프링 데이터 JPA 규칙에 맞게 메소드를 추가하면 그 메소드 이름으로 쿼리를 생성하는 기능 제공
find..by, read..by, query..by, count..by,get..by 로 시작해야함
첫번째 by는 쿼리의 검색조건이 된다. 예] 제목검색 시 findByTitle(String title);
이 메소드가 실행되면 JPQL(Java Persistence Query Language) 문이 실행
두개의 속성을 조합하려면 And 키워드 사용 예] 제목검,내용으로 검색 시 findByTitleAndContents(String title, String contents);
레퍼런스)
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
3)@Query으로 실행하고 싶은 쿼리 직접 실행정의
JPQL 작성시 쿼리의 FROM절에는 디비의 테이블명이 아닌 검색하려면 엔티티의 이름을 사용한다(t_jpa_file 아니라 BoardFileEntity로 사용)
4)Named Query 사용하기
위로 방법으로 부족시 쿼리를 xml파일에 작성한다. 이때 <named-query>,<named-native-query>사용
보통 통계같은 복잡쿼리 사용시 작성됨. 만약 JPQL사용시에도 디비에서 제공하는 함수가 필요한 복잡한 쿼리에는 마이바티스같은 매퍼 프레임워크 혼합해서 사용할 것
* /repository/JpaBoardRepository.java 생성
package board.board.repository;
import java.util.List;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import board.board.entity.BoardEntity;
import board.board.entity.BoardFileEntity;
/*
* CrudRepository 인터페이스: CRUD에 해당하는 제공되는 기능 사용가능
*/
public interface JpaBoardRepository extends CrudRepository<BoardEntity, Integer> {
List<BoardEntity> findAllByOrderByBoardIdxDesc();
//@Query으로 실행하고 싶은 쿼리 직접 실행정의
//@Query("SELECT file FROM BoardFileEntity file WHERE file.board_idx = :boardIdx AND file.fileIdx = :fileIdx")
//BoardFileEntity findBoardFile(@Param("boardIdx") int boardIdx, @Param("fileIdx") int fileIdx);
@Query("SELECT file FROM BoardFileEntity file WHERE file.fileIdx = :fileIdx")
BoardFileEntity findBoardFile2(@Param("fileIdx") int fileIdx);
}
JPA의 save메소드는 insert,update 두가지 역할을 모두 수행
board 저장시 첨부 file도 같이 자동저장된다. BoardFileEntity클래스에는 첨부파일 목록이 @OneToMany 어노테이션으로 연관 관계가 있다
참고)
//JPA 공식 문서
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#jpa.query-methods.query-creation
//JPA 정리하는 방식 참고, 한번 읽어보기
https://djunnni.gitbook.io/springboot/2019-09-04
//JPA 관계 설정하기(1:M, M:1, 1:1 / 양방향설정,단방향설정)
https://hyeonic.tistory.com/224
'SpringBoot > (책)스프링부트 시작하기' 카테고리의 다른 글
[springboot] 16. spring.profiles.active 설정파일 불러오기1 (.properties) (0) | 2023.05.09 |
---|---|
[springboot] 15. 스웨거 (1) | 2023.05.09 |
[springboot] 14. 스프링 데이터 jpa 2(엔티티 생성하기) (0) | 2023.05.06 |
[springboot] 14. 스프링 데이터 jpa 1(개념,설정) (0) | 2023.05.06 |
[springboot] 10. 한글처리를 위한 인코딩 설정하기 (0) | 2023.04.26 |