Backend/SpringBoot

스프링부트 입문 10. 쿼리 메소드

오솔히 2024. 3. 17. 21:08

 

굉장히 귀찮지만..

오늘도 해야만 한다...

No shibal keep going...

 


 

1. JPQL

 

테이블이 아닌 엔티티 객체를 대상으로 사용되는 객체지향 쿼리이다.

 

 

2. 쿼리메소드

 

이전에 JPA를 공부하다 보면 기본으로 제공되는 메소드 말고는 사용할 수 없나 하고 궁금증이 생겼었다.

역시나.. 있었다.

Repository 내 정의되는 메소드의 이름만으로 쿼리를 생성할 수 있고,

규칙에 맞게 이름을 지으면 그에 맞는 쿼리가 자동으로 생성된다.

크게 주제와 서술어로 구분되며 find, exists 등으로 시작되면 by뒤에는 서술어(검색이나 정렬조건)가 붙는다.

 

1. find...by, read...by, get...by, query...by : 조회하는 키워드이며, 리턴타입을 설정할 수 있다.

('...' 영역은 엔티티를 나타내며 이미 정의하는 경우 생략이 가능하다.)

2. exists...by : 특정 데이터가 존재하는지 확인하는 키워드이다.

3. count...by : 조회 쿼리를 수행한 후 개수를 리턴하는 키워드이며, long 타입으로 리턴된다.

4. delete...by, remove...by : 삭제 쿼리를 실행하며, 리턴타입이 없거나 삭제한 횟수를 리턴한다.

(+ repository 삭제 시 @Transactional을 추가해야 영속성이 유지된다.)

5. ...First<number>..., ...Top<number>... : 쿼리를 통한 조회되는 결과값의 수를 제한하는 키워드이다.

단, 단건 조회인 경우 <number> 부분을 생략하면 된다.

6. Is : 값의 일치를 위한 조건자 키워드이며, Equals 키워드와 동일한 기능을 수행한다.

7. (Is)Not : 값의 불일치를 위한 조건자 키워드이다.

8. (Is)Null, (Is)NotNull : 해당 컬럼의 레코드의 값이 Null인지 아닌지 체크하는 키워드이다.

9. (Is)True, (Is)False boolen : 타입으로 지정되어 있는 컬럼의 값을 확인하는 키워드이다.

10. And, Or : 여러 조건을 묶을 때 사용하는 키워드이다.

11. (Is)GreaterThan, (Is)LessThan, (Is)Between : 숫자나 datetime 컬럼에서 사용할 수 있는 비교 연산 키워드이며, 

경계값을 포함하기 위해서는 Equal 키워드를 추가해야 한다.

12. (Is)StartingWith(==StartsWith), (Is)EndingWith(==EndsWith), (Is)Counting(==Contains), (Is)Like

: 컬럼의 값에서 값이 일부 일치하는지 확인하는 키워드이다.

 

 

3. 정렬

 

보통의 정렬은 쿼리를 통해서 정렬을 하여 조회한다.

쿼리메소드에서는 findByNameOrderByStockAsc 와 같이 Asc, Desc와 같은 메소드로 정렬을 할 수 있다.

여러 정렬 기준으로 사용하고 싶으면 이어 붙여서 설정할 수 도 있다. (ex. findByNameOrderByStockAscPriceDesc)

위와 같이 정렬까지 메소드에 붙이면 정말 길어진다...

이러한 문제를 해결하기 위해서는 정렬 부분을 파라미터 부분으로 빼서 사용이 가능하다.

ex. findByName("pen",Sort.by(asc("price")))

 

 

4. 매개변수를 이용한 페이징 처리

 

스프링 공부할 때 가장 헷갈렸던 부분은 페이징이었다...

처음에 공부할 때는 필드값을 주고 초기화를 시킨 다음에 페이징 관련 숫자를 조절하는 식으로 배웠었다.

나중에는 기존에 만들어 놨던 부분을 가져다 쓰고, 또 라이브러리 등을 이용해서 사용했다.

이번에 다시 공부하니 스프링에 pageable 인터페이스가 생겼다.. 세상 편리해졌다 ㅠ

 

JPA는 쿼리 메소드에서는 아래와 같이 매개변수를 통해서 페이징을 할 수 있다.

 

- of(int page, int size) :  0부터 시작하는 페이지 번호와 개수(size), 정렬이 지정되지 않음
- of(int page, int size, Sort.Direction direction, String .. props) :  0부터 시작하는 페이지 번호와 개수, 정렬의 방향과 정렬 기준 필드들
- of(int page, int size, Sort sort) : 페이지 번호와 개수, 정렬 관련 정보

 


 

후하 후하...

공부하다 보니 받아쓰기 만한 거 같은데

쿼리는 그래도 다 비슷한 문법이라 가볍게 지나가려고 한다.