일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- 백엔드스쿨
- Java
- ORM
- DAO 연동 컨트롤러 서비스 설계
- 스프링 부트 핵심 가이드
- 인텔리제이
- 제로베이스 #백엔드 #Java #Spring #개발자 #백엔드공부 #백엔드 스쿨
- 백엔드공부
- MariaDB
- 개발자
- 유효성검사
- #devops #terraform #state
- auditing
- DAO 설계
- Swagger
- 제로베이스
- 엔티티 설계
- 백엔드
- 데이터베이스 연동
- 리포지토리 인터페이스
- JPA
- 프로젝트 생성
- spring
- validated
- 스프링부트실전가이드
- Today
- Total
JeongJin's Blog
08. Spring Data JPA 활용 (1) 본문
8.1 프로젝트 생성
- 개발 IDE 툴을 이용하여 프로젝트를 생성한다.
- 기술 스택
- Framework : Spring boot 2.5.6
- Developer : Lombok, Spring Configuration Processor
- Web : Spring Web
- SQL : Spring Data JPA, MariaDB Driver
8.2 JPQL
- JPA Query Language의 줄임말로 JPA 에서 사용할 수 있는 쿼리를 의미한다.
- SQL 와 차이점
- SQL에서는 테이블이나 컬럼의 이름을 사용하는 것과 달리 JPQL은 엔티티 객체를 대상으로 수행하는 쿼리이기 때문에 매핑된 엔티티의 이름과 필드의 이름을 사용한다.
-- SQL
SELECT id FROM product WHERE number = 1;
-- JPQL
SELECT p FROM Product p WHERE p.number = 1;
8.3 쿼리 메서드 살펴보기
- 레포지토리는 JpaRepository를 상속받는 것만으로도 다양한 CRUD 메서드를 제공하지만 기본 메서드들은 식별자 기반으로 생성되기 때문에 결국 별도의 메서드를 정의해서 사용하는 경우가 많다. 이때 간단한 쿼리문을 작성하기 위해 사용하는 것이 쿼리 메서드이다.
8.3.1 쿼리 메서드의 생성
- 동작을 결정하는 주체(Subject)와 서술어(Predicate)로 구분한다.
- 'find...By', 'exists...By' 와 같이 키워드로 쿼리의 주제를 정하며 'By' 는 서술어의 시작을 나타내는 구분자 역할을 한다.
- 서술어 부분은 검색 및 정렬 조건을 지정하는 영역으로 기본적으로 엔티티의 속성을 정의할 수 있고, AND나 OR을 사용해 조건을 확장하는 것도 가능하다.
// (리턴타입) + {주제 + 서술어(속성)} 구조의 메서드
List<Person> findByLastnameAndEmail(String lastName, String email);
// SQL
// SELECT * FROM person WHERE last_name = ? AND email = ?;
8.3.2 쿼리 메서드의 주제 키워드
- 쿼리 메서드의 주제 부분에 사용할 수 있는 키워드
- 조회하는 기능을 수행하는 키워드 입니다. '...'으로 표시한 영역에는 도메인(엔티티)을 표현할 수 있다. 그러나 레포지토리에서 이미 도메인을 설정한 후에 메서드를 사용하기 때문에 중복으로 판단해 생략하기도 한다.
- 리턴 타입으로는 Collection 이나 Stream에 속한 하위 타입을 설정할 수 있다.
- find...By
- read...By
- get...By
- query...By
- search...By
- stream...By
// find...by
Optional<Product> findByNumber(Long number);
List<Product> findAllByName(Long number);
Product queryByNumber(Long number);
- exists...By
- 특정 데이터가 존재하는 확인하는 키워드, 리턴 타입으로 boolean 타입 사용 - count...By
- 조회 쿼리를 수행한 후 쿼리 결과로 나온 레코드의 개수를 리턴 - delete...By, remove...By
- 삭제 쿼리를 수행, 리턴 타입이 없거나 삭제한 횟수를 리턴 - ...First..., ...Top...
- 쿼리를 통해 조회된 결과값의 개수를 제한하는 키워드
- 두 키워드는 동일한 동작을 수행하며, 주제와 By 사이에 위치한다.8.3.3 쿼리 메서드의 조건자 키워드
8.3.3 쿼리 메시더의 조건자 키워드
- ls
- 값의 일치를 조건으로 사용하는 조건자 키워드
- 생략되는 경우가 많으며 Equals와 동일한 기능을 수행
// findByNumber 메서드와 동일하게 동작
Project findByNumberIs(Long number);
Project findByNumberEquals(Long number);
- (Is)Not
- 값의 불일치를 조건으로 사용하는 조건자 키워드
- Is는 생략하고 Not 키워드만 사용할 수도 있다.
Product findByNumberIsNot(Long number);
Product findByNumberNot(Long number);
3. (Is)Null, (Is)NotNull
- 값이 null 인지 검사하는 조건 키워드
4. (Is)True, (Is)False
- boolean 타입으로 지정된 컬럼값을 확인하는 키워드
- 엔티티에 boolean 타입을 사용하는 컬럼에서만 사용, 그렇지 않으면 에러 발생
5. And, Or
- 여러 조건을 묶을 때 사용
Product findByNumberAndNmae(Long number, String name);
Product findByNumberOrName(Long number, String name);
6. (Is)GreaterThan, (Is)LessThan, (Is)Between
- 숫자나 datetime 컬럼을 대상으로 한 비교 연산에 사용할 수 있는 조건자 키워드
- GreaterThan, LessThan 키워드는 비교 대상에 대한 초과/미만의 개념으로 비교 연산을 수행하고, 경계값을 포함하려면 Equal 키
워드를 추가하면 된다.
List<Product> findByPriceIsGreaterThan(Long price); // WHERE price > ?
List<Product> findByPriceGreaterThan(Long price); // WHERE price > ?
List<Product> findByPriceGreaterThanEqual(Long price); // WHERE price >= ?
List<Product> findByPriceIsLessThan(Long price); // WHERE price < ?
List<Product> findByPriceLessThan(Long price); // WHERE price < ?
List<Product> findByPriceLessThanEqual(Long price); // WHERE price <= ?
List<Product> findByPriceIsBetween(Long lowPrice, Long highPrice); // WHERE lowPrice >= ? AND highPrice <= ?
List<Product> findByPriceBetween(Long lowPrice, Long highPrice); // WHERE lowPrice >= ? AND highPrice <= ?
7. (Is)StartingWith(==StartsWith), (Is)EndingWith(==EndsWith), (Is)Containing(==Contains), (Is)Like
- 컬럼값에서 일부 일치 여부를 확인하는 조건자 키워드 입니다.
- SQL 쿼리문에서 값의 일부를 포함하는 값을 추출할 때 사용하는 '%' 키워드와 동일한 역할을 하는 키워드
- Containing : 문자열의 양 끝에 '%' 배치
- StartingWith : 문자열의 앞에 '%' 배치
- EndingWith : 문자열의 끝에 '%' 배치
- Like: 코드수준에서 메서드를 호출하면서 파라미터에 %를 명시적으로 입력
'Book Study > 스프링 부트 핵심 가이드' 카테고리의 다른 글
08. Spring Data JPA 활용 (3) (0) | 2023.11.08 |
---|---|
08. Spring Data JPA 활용 (2) (0) | 2023.11.07 |
06. 데이터베이스 연동(7) (2) | 2023.11.03 |
06. 데이터베이스 연동 (6) (0) | 2023.11.03 |
06. 데이터베이스 연동 (5) (0) | 2023.11.02 |