*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성
- Windows11(윈도우 11) 환경
- 자바 JDK 17 버전 설치 https://yungenie.tistory.com/11
[Java] 차근차근 Java 설치하기 (JDK17, Window 11)
자바 개발 도구 설치 방법에 대해서 알아보겠습니다. Java17은 LTS(Long Term Support : 장기 지원) 릴리즈로 1년 후까지 기술 지원 및 버그를 개선한 서비스를 제공받을 수 있습니다. 업데이트 버전을 꾸
yungenie.tistory.com
- 스프링 부트 4.31.0 사용 - STS(Spring Tool Suite) 설치(Spring Tools for Eclipse - https://spring.io/tools)
=> https://priming.tistory.com/147 참고
[Windows] Spring Tool Suite 4(STS 4) 다운로드 및 설치
STS란?Spring Tool Suite(STS)는 스프링 프로젝트를 생성하고, 개발할 수 있게 해주는 도구입니다. STS 설치 과정에 대해 설명드리겠습니다. 설치 파일 다운로드STS 공식 사이트에서 설치 파일을 다운로
priming.tistory.com
- MySQL Community Server 8.0.42 설치 https://dev.mysql.com/downloads/mysql/
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 프로젝트 생성한 과정
*** 함께 보면 좋은 글
스프링 부트 핵심 가이드(장정우 지음) - 스프링 부트 개요
1. 스프링 프레임워크자바(Java) 기반 애플리케이션 프레임워크로, 엔터프라이즈급(기업 환경 대상 개발) 애플리케이션을 위한 다양한 기능 제공-> 오픈소스 경량급 애플리케이션 프레임워크로
keep-programming-study.tistory.com
스프링 부트 핵심 가이드(장정우 지음) - 개발에 앞서 알면 좋은 기초 지식
1. 서버 간 통신마이크로서비스 아키텍처에서 한 서버가 다른 서버에 통신을 요청하는 것을 의미-> 한 대는 서버/다른 한 대는 클라이언트가 됨 가장 많이 사용되는 방식은 HTTP/HTTPS 방식(TCP/IP, SOA
keep-programming-study.tistory.com
스프링 부트 핵심 가이드(장정우 지음) - Gradle 기초, API를 작성하는 다양한 방법
*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성 Windows11(윈도우 11) 환경자바 JDK 17 버전 설치 https://yungenie.tistory.com/11 [Java] 차근차근 Java 설치하기 (JDK17, Window 11)자바 개발 도구 설치 방법
keep-programming-study.tistory.com
스프링 부트 핵심 가이드(장정우 지음) - 데이터베이스 연동 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
스프링 부트 핵심 가이드(장정우 지음) - 데이터베이스 연동 2: 프로젝트에 MySQL Community Server
*책 내용과 다르게, 다음과 같은 환경에서 프로젝트 생성 Windows11(윈도우 11) 환경자바 JDK 17 버전 설치 https://yungenie.tistory.com/11 [Java] 차근차근 Java 설치하기 (JDK17, Window 11)자바 개발 도구 설치 방법
keep-programming-study.tistory.com
JAVA/JSP 28. 회원제 게시판에 페이징 기능 추가 - 페이징이 필요한 이유, 페이징 구현 절차
1. 페이징이 필요한 이유*기존 회원제 게시판의 게시물이 1만 개가 되었다고 할 때의 문제점⇒ 이래서 게시판에서는 게시글 목록을 보통 10~20개 정도씩 나눠 페이지별로 출력하는 것(=페이징)(1)
keep-programming-study.tistory.com
1. JPQL
- JPA Query Language의 줄임말로, JPA에서 사용할 수 있는 쿼리를 의미
- 문법이 SQL과 매우 비슷해서 데이터베이스 쿼리에 익숙하다면 쉽게 사용 가능
- SQL에서는 테이블이나 칼럼의 이름을 사용하지만,
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=?
'스프링(Spring), 스프링부트(SpringBoot) > 스프링부트(SpringBoot) 기초' 카테고리의 다른 글
스프링 부트 핵심 가이드(장정우 지음) - Spring Data JPA 활용 2(@Query 어노테이션 사용하기, QueryDSL 적용하기) (0) | 2025.08.22 |
---|---|
스프링 부트 핵심 가이드(장정우 지음) - JaCoCo를 활용한 테스트 커버리지 확인, 테스트 주도 개발(TDD) (0) | 2025.08.12 |
스프링 부트 핵심 가이드(장정우 지음) - 테스트 코드 작성하기2 (0) | 2025.08.08 |
스프링 부트 핵심 가이드(장정우 지음) - 테스트 코드 작성하기 (0) | 2025.07.30 |
스프링 부트 핵심 가이드(장정우 지음) - 데이터베이스 연동 4: 서비스와 컨트롤러 설계2, 롬복(Lombok) (0) | 2025.07.24 |