도슐랭스타

제목, 작가, 날짜로 조회 본문

Spring Boot project

제목, 작가, 날짜로 조회

도도.__. 2025. 4. 17. 20:26

요구사항 정리

  • 사용자는 책 제목, 작가, 날짜를 기준으로 검색하고 싶어함
  • 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
Comments