쿼리메서드

Shaun·2021년 7월 26일
1

JPA

목록 보기
4/31

쿼리메서드 기능과 @Query

-마지막 으로 살펴볼 기능은 쿼리메서드JPQL
이라고 불리는 객체 지향 쿼리에 대한 기능이다.

WHY Query method???

-앞의 예제에서 아쉬운 점은 다양한 검색 조건 이 불가능 하다는 점이다

-이 문제를 해결하기 위해 Spring data jpa 에서는 다음과 같은 방법을 제공한다.

  • 쿼리메서드: 메서드의 이름 자체가 쿼리의 구문으로 처리되는 기능
  • @Query: SQL 과 유사하게 엔티티 클래스의 정보를 이용해서 쿼리를 작성하는 기능
  • Querydsl 등의 동적 쿼리 처리 기능

쿼리메서드(Query Methods)

-쿼리메서드는 말그대로 '이름 자체가 질의문' 되는 기능이다.

쿼리 메서드 특징

  • findBy 나 getBy로 시작한다
  • And, or 와 같은 키워드를 이용해 질의 조건 만들어 낸다.
  • 쿼리메서드는 사용하는 키워드에 따라서 파라미터의 개수가 결정된다. (ex= between 은 2개다)

쿼리메서드 실습

Repository에 기능 추가

-MemoRepository에 해당 쿼리메서드를 추가 해준다.

※ 우리가 db에서 원하는 정보를 넣고뺴고(비즈니스 로직,실질적 기능) 을 repository에 작성을 하면 된다.

  1. 조회

코드설명

  • Memo 객체의 mno값이 70~80사이 객체를 구하는 코드이다.
  • 신기하게도 따로 my sql에서 하던 쿼리문을 만들지 않아도 자동으로 쿼리문을 만들어준다. (@Query는 쿼리 만들어야한다)

쿼리메서드와 pageable의 결합

2.정렬+페이징

코드설명

  • pagerequest.of 로 페이즈,사이즈, 정렬조건으로 pageable을 만들어준다

  • 만들어둔 쿼리메서드에 대입해준다.

※pageable 파라미터는 모든 쿼리 메서드에 적용할수 있다.

3.삭제

코드설명

  • mno가 10보다 작은 memo데이터들을 삭제하는 코드이다.
  • 테스트 코드인경우 @Transactional 과 @Commit 라는 어노테이션을 사용한다. 이것은 deleteBy 인경우 우선 select문으로 해당 객체들을 가져오고 각엔티티를 삭제하는 작업이 같이 이루어지기 떄문이다

  • @Commit는 최종 결과를 커밋하기 위해 사용한다. 이를 적용 하지 않으면 테스트 코드의 deleteBy는 기본적으로 롤백 으로 처리되어 결과가 반영되지 않는다.

※ deleteBy는 많이 사용되지 않는데 그이유는 각 엔티티객체를 하나씩 삭제하기 때문이다.

@Query 어노테이션

-일반적인 간단한 처리만 쿼리메서드를 이용하고, @Query를 이용하는 경우가 더 많다.

-@Query의 value는 JPQL 로 작성하는데 흔히 '객체지향 쿼리'라고 불린다

@Query의 특징

  • SQL과 매우 흡사하다.
  • 필요한 데이터만 선별적으로 추출
  • 데이터베이스에 맞는 순수한 SQL(Native SQL)을 사용하는 기능
  • INSERT, UPDATE, DELETE, 와 같은 SELECT가 아닌 DML등을 처리하는 기능

※객체지향 쿼리는 테이블 대신에 엔티티 클래스를 이용하고 테이블의 칼럼 대신에 클래스에 선언된 필드를 이용해서 작성한다.

Object[] 리턴

-@Query 장점 중의 하나는 쿼리 메서드의 경우에는** 엔티티 타입의 데이터만 추출

하지만, @Query 를 이용하는 경우에는 현재 필요한 데이터만을 Object[]**의 형태로 추출할수 있다(table join할떄)

@Query와 페이징

-쿼리메서드와 마찬가지로 @Query를 사용할 경우에 Pageable 타입의 파라미터를 적용하면 페이징 처리와 정렬에 대한 부분을 작성하지 않을 수 있다.
-리턴타입을 page<엔티티 타입> 으로 지정하는 경우에는 count를 처리하는 쿼리를 적용 할수있다.

※따라서 @Query를 사용할때 별도의 countQuery라는 속성을 적용해 주고 Pageable 타입의 파라미터를 전달하면 된다.

@Query(value = "SELECT m from Memo m where m.mno>:mno", 
countQuey= "SELECT count(m) from Memo m where m.mno>:mno")
Page<> getListWithQuery(Long mno, Pageable pageable);
profile
호주쉐프에서 개발자까지..

0개의 댓글