Coding Note

SpringBoot) 코스웹 - Paging, Query 본문

SpringBoot/코스웹PJ

SpringBoot) 코스웹 - Paging, Query

jinnkim 2022. 3. 21. 02:43

 

1. Paging

Spring Data JPA를 이용한 페이징 처리는 '0'부터 시작한다.

 

 

1) 한페이지에에 10개 테스트

 

- Test 클래스 코드

org.springframework.data.domain

관련 클래스 사용해야된다.

 

- 결과

 

첫 번째 쿼리문에서 페이징 처리에 사용하는 limit 구문,

두 번째 쿼리에서는 count()를 이용해서 전체 개수를 처리하는 구문!

 

 

2) Page <엔티티 타입>

쿼리 결과를 사용하기 위한 여러 메서드를 지원함.

주로 페이지 처리와 관련된 정보

//paging
@Test
public void testPageDefault() {

    //page 10개
    Pageable pageable = PageRequest.of(0,10);
    Page<Memo> result = memoRepository.findAll(pageable);
    System.out.println(result);

    System.out.println("============================");
    //총 몇 페이지
    System.out.println("Total Pages :" + result.getTotalPages());
    //전체 갯수
    System.out.println("Total Count: "+ result.getTotalElements());
    //현재 페이지 번호 0부터 시작
    System.out.println("Page Number : "+result.getNumber());
    //페이지당 데이터 갯수
    System.out.println("Page Size : "+result.getSize());
    //다음 페이지
    System.out.println("has next page? : "+result.hasNext());
    //시작 페이지 여부
    System.out.println("first page? : "+result.isFirst());
}

 

- get()을 이용해서 페이징 처리

System.out.println("------------------------------------");

    for(Memo memo : result.getContent()) {
        System.out.println(memo);
    }

 

3) 정렬 조건 추가하기

Sort는 한 개 혹은 여러 개 필드 값을 이용해서 순차적 정렬(asc), 내림차순 정렬(desc)을 지정함.

 

 

- sort1

- sortAll

sort1, sort2를 and()를 이용해서 여러 개의 정렬 조건을 다르게 지정할 수 있다.

 

 

 

2. Query, JPQL(Java Persistance Query Language)

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

1) 쿼리 메서드

- select를 하는 작업이라면 List 타입이나 배열을 이용할 수 있다.

- 파라미터에 Pageable 타입을 넣는 경우에는 무조건 Page<E> 타입

 

1-1. mno 객체 값을 70부터 80 사이, 역순으로 정렬한다.

public interface MemoRepository extends JpaRepository<Memo,Long> {
    //쿼리 메서드
    List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
}

between 구문을 사용하고 OrderBy 적용

 

- test 코드

 

 

2) 쿼리 메서드와 Pageable 결함

쿼리 메서드는 Pageable 파라미터를 같이 결합해서 사용할 수 있기 때문에 정렬에 관련 부분은 Pageable로 처리해서 간략한 메서드를 생성할 수 있다.

 

- Repository

public interface MemoRepository extends JpaRepository<Memo,Long> {
	 //쿼리 메서드와 Pageable 결함
    //Pageable 파라미터는 모든 쿼리 메서드에 적용, 쿼리 메서드에 정렬 조건은 생략함
    List<Memo> findByMnoBetweenOrderByMnoDesc(Long from, Long to);
    Page<Memo> findByMnoBetween(Long from, Long to, Pageable pageable);
}

 

- test 코드

10 ~ 50 내림차순 정렬

 

추가로 쿼리 메서드를 통해 삭제 기능도 구현할 수 있다!

 

 

2-1) deleteBy() - 삭제

 

- Repository

삭제 메서드 추가

//deleteBy
void deleteMemoByMnoLessThan(Long num);

 

- test 코드

@Commit
@Transactional

 

 

3) @Query 어노테이션

  • 필요한 데이터만 선별적인 추출하는 기능이 가능
  • 데이터베이스에 맞는 순수한 SQL(Native SQL)을 사용하는 기능
  • insert, update, delete와 같은 select가 아닌 DML 등을 처리하는 기능(@Modifying)

 

객체지향 쿼리는 테이블 대신 엔티티 클래스를 이용한다.

또한 테이블의 칼럼 대신 클래스에 선언된 필드를 이용해서 작성한다.

 

 

4) JPQL(Java Persistance Query Language)

JPQL은 데이터베이스의 테이블 대신에 엔티티 클래스와 멤버 변수를 이용해서 SQL과 비슷하게 작성된다.

 

  • @Query의 파라미터 바인딩 작성 방식

- '? 1,? 2' : 파라미터 순서 이용 방식

- ':xxx' : ':파라미터 이름'을 활용하는 방식

- '#{}' : 자바 빈 스타일을 이용하는 방식

- ':#{}' : 이런 형식으로도 사용 가능함.

 

 

4-1) @Query와 페이징 처리

4-2) Object [] 리턴

필요한 데이터만을 Object []의 형태로 선별적으로 리턴할 수 있다.

4-3) Native SQL 처리

Native SQL 속성 값을 true로 지정하고 일반 SQL문을 그대로 사용할 수 있다.

 

Comments