스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초

스프링 부트 핵심 가이드(장정우 지음) - Spring Data JPA 활용 1(JPQL, 쿼리 메서드 살펴보기, 정렬과 페이징 처리)

개발학생 2025. 8. 15. 14:55
반응형

*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성  

 

[Java] 차근차근 Java 설치하기 (JDK17, Window 11)

자바 개발 도구 설치 방법에 대해서 알아보겠습니다. Java17은 LTS(Long Term Support : 장기 지원) 릴리즈로 1년 후까지 기술 지원 및 버그를 개선한 서비스를 제공받을 수 있습니다. 업데이트 버전을 꾸

yungenie.tistory.com

 

[Windows] Spring Tool Suite 4(STS 4) 다운로드 및 설치

STS란?Spring Tool Suite(STS)는 스프링 프로젝트를 생성하고, 개발할 수 있게 해주는 도구입니다. STS 설치 과정에 대해 설명드리겠습니다. 설치 파일 다운로드STS 공식 사이트에서 설치 파일을 다운로

priming.tistory.com

 

MySQL :: Download MySQL Community Server

Select Version: 9.3.0 Innovation 8.4.5 LTS 8.0.42 Select Operating System: Select Operating System… Microsoft Windows Ubuntu Linux Debian Linux SUSE Linux Enterprise Server Red Hat Enterprise Linux / Oracle Linux Fedora Linux - Generic Oracle Solaris mac

dev.mysql.com

  • Gradle

**STS에서 Gradle 프로젝트 생성한 과정 

*** 함께 보면 좋은 글

2025.07.10 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - 스프링 부트 개요

 

스프링 부트 핵심 가이드(장정우 지음) - 스프링 부트 개요

1. 스프링 프레임워크자바(Java) 기반 애플리케이션 프레임워크로, 엔터프라이즈급(기업 환경 대상 개발) 애플리케이션을 위한 다양한 기능 제공-> 오픈소스 경량급 애플리케이션 프레임워크로

keep-programming-study.tistory.com

2025.07.11 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - 개발에 앞서 알면 좋은 기초 지식

 

스프링 부트 핵심 가이드(장정우 지음) - 개발에 앞서 알면 좋은 기초 지식

1. 서버 간 통신마이크로서비스 아키텍처에서 한 서버가 다른 서버에 통신을 요청하는 것을 의미-> 한 대는 서버/다른 한 대는 클라이언트가 됨 가장 많이 사용되는 방식은 HTTP/HTTPS 방식(TCP/IP, SOA

keep-programming-study.tistory.com

2025.07.15 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - Gradle 기초, API를 작성하는 다양한 방법

 

스프링 부트 핵심 가이드(장정우 지음) - Gradle 기초, API를 작성하는 다양한 방법

*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성 Windows11(윈도우 11) 환경자바 JDK 17 버전 설치 https://yungenie.tistory.com/11 [Java] 차근차근 Java 설치하기 (JDK17, Window 11)자바 개발 도구 설치 방법

keep-programming-study.tistory.com

2025.07.18 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - 데이터베이스 연동 1: ORM(Object Relational Mapping) 특징, JPA(Java Persistence API)

 

스프링 부트 핵심 가이드(장정우 지음) - 데이터베이스 연동 1: ORM(Object Relational Mapping) 특징, JPA(Ja

*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성 Windows11(윈도우 11) 환경자바 JDK 17 버전 설치 https://yungenie.tistory.com/11 [Java] 차근차근 Java 설치하기 (JDK17, Window 11)자바 개발 도구 설치 방법

keep-programming-study.tistory.com

2025.07.21 - [스프링(Spring), 스프링부트(SpringBoot)/스프링부트(SpringBoot) 기초] - 스프링 부트 핵심 가이드(장정우 지음) - 데이터베이스 연동 2: 프로젝트에 MySQL Community Server 연동, 엔티티 설계 & 리포지토리 인터페이스 설계[코드 수정됨]

 

스프링 부트 핵심 가이드(장정우 지음) - 데이터베이스 연동 2: 프로젝트에 MySQL Community Server 

*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성 Windows11(윈도우 11) 환경자바 JDK 17 버전 설치 https://yungenie.tistory.com/11 [Java] 차근차근 Java 설치하기 (JDK17, Window 11)자바 개발 도구 설치 방법

keep-programming-study.tistory.com

2025.04.15 - [자바(JAVA)/JSP 웹 프로그래밍 공부 (성낙현의 JSP 자바 웹 프로그래밍 참고)] - JAVA/JSP 28. 회원제 게시판에 페이징 기능 추가 - 페이징이 필요한 이유, 페이징 구현 절차

 

JAVA/JSP 28. 회원제 게시판에 페이징 기능 추가 - 페이징이 필요한 이유, 페이징 구현 절차

1. 페이징이 필요한 이유*기존 회원제 게시판의 게시물이 1만 개가 되었다고 할 때의 문제점⇒ 이래서 게시판에서는 게시글 목록을 보통 10~20개 정도씩 나눠 페이지별로 출력하는 것(=페이징)(1)

keep-programming-study.tistory.com

 

1. JPQL 

  • JPA Query Language의 줄임말로, JPA에서 사용할 수 있는 쿼리를 의미
  • 문법이 SQL과 매우 비슷해서 데이터베이스 쿼리에 익숙하다면 쉽게 사용 가능
  • SQL에서는 테이블이나 칼럼의 이름을 사용하지만,
    JPQL은 엔티티 객체를 대상으로 수행하는 쿼리이므로 매핑된 엔티티의 이름과 필드의 이름을 사용

JPQL 쿼리의 기본 구조 도식화

 

2. 쿼리 메서드 살펴보기

  • 리포지토리는 JpaRepository를 상속받는 것만으로도 다양한 CRUD 메서드를 제공하지만, 
    식별자 기반 생성이라는 한계 때문에 별도의 메서드를 정의해서 사용해야 함
    -> 이때 간단한 쿼리문을 작성하기 위해 쿼리 메서드 사용

1) 쿼리 메서드의 생성

  • 크게 동작을 결정하는 주제(Subject)와 서술어(Predicate)로 구분
  • 'find...By', 'exists... By'와 같은 키워드로 쿼리의 주제를 정함
    -> 이때 'By'는 서술어의 시작을 나타내는 구분자 역할, 검색 및 정렬 조건을 지정하는 영역이 서술어 부분
  • 기본적으로 엔티티의 속성으로 정의할 수 있고, AND나 OR로 조건을 확장하는 것도 가능

(1) 쿼리 메서드의 주제 키워드

  • 주로 조회하는 기능을 수행하는 키워드
  • find...By, read...By, get...By, query...By, search...By, stream...By
    -> ... 영역에는 도메인(엔티티)을 표현할 수 있으나, 생략 가능
  • 리턴 타입으로는 Collection이나 Stream에 속한 하위 타입 설정 가능
  • 활용 예시
// JpaRepository를 상속받은 ProductRepository.java에 작성
// find...By
Optional<Product> findByNumber(Long number);
List<Product> findAllByName(String name);
Product queryByNumber(Long number);

// exists...By: 특정 데이터가 존재하는지 확인
boolean existsByNumber(Long number);

// count...By: 조회 쿼리 수행 후 쿼리 결과로 나온 레코드의 개수 리턴
long countByName(String name);

// delete...By, remove...By: 삭제 쿼리 수행(리턴 타입이 없거나, 삭제한 횟수 리턴)
void deleteByNumber(Long number);
long removeByName(String name);

//...First<number>..., ...Top<number>...: 한 번의 동작으로 여러 건을 조회(단 건 조회를 위해서는 <number> 생략)
List<Product> findFirst5ByName(String name);
List<Product> findTop10ByName(String name);

(2) 쿼리 메서드의 조건자 키워드

  • JPQL의 서술어 부분에서 사용 가능한 몇 가지 조건자 키워드
  • 활용 예시
// JpaRepository를 상속받은 ProductRepository.java에 작성
// Not: 값의 불일치를 조건으로 사용하는 조건자 키워드
Product findByNumberNot(Long number);

// Null, NotNull: 값이 null/not null인지 검사하는 조건자 키워드
List<Product> findByUpdateAtNull();
list<Product> findByUpdateAtNotNull();

// True, False: Boolean 타입으로 지정된 칼럼값을 확인 
Product findByisActiveTrue();
Product findByisActiveFalse();

// And, Or: 여러 조건을 묶을 때 사용
Product findByNmuberAndName(Long number, String name);
Product findByNumberOrName(Long number, String name);

// GreaterThan, LessThan, Between: 숫자/datetime 칼럼 대상 비교 연산에 사용
List<Product> findByPriceGreaterThan();
List<Product> findByPriceLessThan(Long price);
List<Product> findByPriceBetween(Long lowPrice, long highPrice);

// StartsWith, EndsWith, Contains: 칼럼값에서 일부 일치 여부 확인
// -> SQL 쿼리문에서 값의 일부를 포함하는 값을 추출할 때 사용하는 % 키워드와 동일한 역할을 함
// => StartsWith/EndsWith는 각각 문자열의 앞/끝에 %가 배치되며, Contains는 문자열의 양끝에 %를 배치)
List<Product> findByNameStartsWith(String name);
List<Product> findByNameEndsWith(String name);
List<Product> findByNameContains(String name);

3. 정렬과 페이징 처리

1) 정렬 처리하기

  • 일반적인 쿼리문에서 사용할 때는 ORDER BY 구문을 사용하는데, 쿼리 메서드도 정렬 기능에 동일한 키워드 사용
  • 단, 여러 정렬 기준을 사용할 때는 And를 붙이지 않음 
  • 활용 예시
// JpaRepository를 상속받은 ProductRepository.java에 작성
// Asc: 오름차순, Desc: 내림차순
List<Product> findByNameOrderByNumberAsc(String name);
List<Product> findByNameOrderByNumberDesc(String name);

// 위의 Desc 메서드를 호출했을 때 나오는 하이버네이트 로그
Hibernate:
	select
    	product0_.number as number1_0_,
        product0_.created_at as created_2_0,
        product0_.name as name3_0_,
        product0_.price as price4_0_,
        product0_.stock as stock5_0_,
        product0_.updated_at as updated_6_0_
    from
    	product product0_
    where
    	product0_.name=?
    order by
    	product0_.number asc

2) 페이징 처리하기

  • 웹 페이지에서 각 페이지를 구분하여 데이터를 제공할 때 그에 맞게 데이터를 요청하는 것
  • 매개변수 조합
of 메서드 매개변수 의미 설명
of(int page, int size) 페이지 번호(0부터 시작), 페이지당 데이터 개수 데이터를 정렬하지 않음
of(int page, int size, Sort) 페이지 번호, 페이지당 데이터 개수, 정렬 Sort로 데이터 정렬 
of(int page, int size, Direction, String properties) 페이지 번호, 페이지당 데이터 개수, 정렬 방향, 속성(컬럼) Sort.by(dirction, properties)에 의해 정렬 
  • 활용 예시
// JpaRepository를 상속받은 ProductRepository.java에 작성
// 페이징 처리를 위해 Page와 Pageable을 사용
Page<Product> findByName(String name, Pageable pageable)
// ProductRepository.java 외부에서 메서드 호출
Page<Product> productPage = productRepository.findByName("펜", PageRequest.of(0,2));
// 각 페이질ㄹ 구성하는 세부적인 값을 보고 싶을 때
System.out.println(productPage.getContent());

// 위의 findByName 메서드를 호출했을 때 나오는 하이버네이트 로그
Hibernate:
	select
    	product0_.number as number1_0_,
        product0_.created_at as created_2_0_,
        product0_.name as name3_0_,
        product0_.price as price4_0_,
        product0_.stock as stock5_0_,
        product0_.updated_at as updated_6_0_
    from
    	product product0_
    where
    	product0_.name=? limit ?
    Hibernate:
    	select
        	count(product0_.number) as col_0_0_
        from 
        	product product0_
        where
        	product0_.name=?

 

반응형