도슐랭스타
제목, 작가, 날짜로 조회 본문
요구사항 정리
- 사용자는 책 제목, 작가, 날짜를 기준으로 검색하고 싶어함
- 1개만 검색하거나, 여러 개를 조합해서도 검색 가능
ReadingRecordRepository.java
List<ReadingRecord> findByTitleContainingAndAuthorContainingAndDate(
String title, String author, LocalDate date
);
JPA Query 메서드를 사용해서
findBy - JPA에서 무언가를 "찾겠다"는 뜻
TitleContaining - title 필드에 이 문자열이 포함된 데이터를 찾음. LIKE %keyword%와 같음.
AndAuthorContaining - author에도 이 문자열이 포함돼야 함.
AndDate - 날짜는 정확히 일치해야 함. = yyyy-mm-dd
SELECT * FROM reading_record
WHERE title LIKE '%해리%'
AND author LIKE '%롤링%'
AND date = '2024-01-01'
이런 sql문을 JPA가 자동으로 만들어주는 것임.
ReadingRecordService.java
public List<ReadingRecordResponse> searchRecords(String title, String author, LocalDate date) {
List<ReadingRecord> results = repository.findAll().stream()
.filter(r -> title == null || r.getTitle().contains(title))
.filter(r -> author == null || r.getAuthor().contains(author))
.filter(r -> date == null || r.getDate().isEqual(date))
.collect(Collectors.toList());
return results.stream()
.map(ReadingRecordResponse::new)
.collect(Collectors.toList());
}
repository.findAll() - DB에 있는 모든 독서 기록을 다 가져옴.
.stream() - 가져온 데이터들을 한 줄씩 순차적으로 처리할 수 있는 Java Stream 기능을 사용.
.filter(...) - 조건에 맞는 데이터만 골라냄.
title == null || r.getTitle().contains(title)
→ 만약 title 파라미터가 null이면 그냥 통과
→ null이 아니면 해당 title이 포함된 기록만 남김.
→ r.getAuthor().contains(author)도 마찬가지
isEqual(date) - 날짜는 정확히 일치하는 경우만 통과
.collect(Collectors.toList()) - 필터링이 끝난 데이터를 다시 리스트로 모은다.
.map(...) - 엔티티 → DTO (ReadingRecordResponse)로 변환
ReadingRecordController.java
@GetMapping("/search")
public List<ReadingRecordResponse> searchRecords(
@RequestParam(required = false) String title,
@RequestParam(required = false) String author,
@RequestParam(required = false) @DateTimeFormat(iso = DateTimeFormat.ISO.DATE) LocalDate date
) {
return service.searchRecords(title, author, date);
}
@GetMapping("/search") - /records/search로 들어온 GET 요청을 처리함.
@RequestParam(required = false) - 쿼리파라미터를 의미함. ex. /search?title=해리포터
→ required = false이므로 필수값이 아님.
→ 사용자가 title만 주거나 author만 줘도 잘 동작함.
@DateTimeFormat(...) LocalDate date - URL에서 날짜를 2025-04-01처럼 yyyy-MM-dd 형식으로 입력하면 자바의 LocalDate로 자동 변환해줌.
→ 입력받은 title, author, date를 가지고 Service 계층으로 전달해줌.
'Spring Boot project' 카테고리의 다른 글
API-KEY, Bean 중복, Preflight (OPTIONS) 요청 (1) | 2025.04.19 |
---|---|
CORS 설정 (1) | 2025.04.18 |
H2 DB 설정 (1) | 2025.04.14 |
DTO 클래스 생성 Request, Response (1) | 2025.04.13 |
ReadingRecordController 생성, get/post Test (1) | 2025.04.12 |