과제를 하는 도중 든 생각은 구조를 생각하며 설계를 하는 것,
그게 제일 어렵다는 생각을 한다.
먼저 숙제 내용부터 확인해보자
❓ Query Methods 기능을 사용하여 내용(contents)에 특정 키워드가 포함된 메모를 조회하는 API를 구현합니다.
- Controller를 통해 keyword를 Query String 방식으로 전달받아 메모를 조회하는 API를 추가합니다.
- [http://localhost:8080/api/memos/contents?keyword=](http://localhost:8080/api/memos/contents?keyword=)
- 메서드명은 getMemosByKeyword 입니다.
- MemoService에 getMemosByKeyword 기능을 수행하는 메서드를 구현합니다.
- ‘Postman’을 사용해서 테스트합니다.
- 정렬 방법은 수정 시간을 기준으로 내림차순을 적용합니다.
- “Query Methods contains” 같은 검색어를 구글링하여 방법을 찾습니다.
- Spring Data JPA DOCS를 사용하여 방법을 찾습니다.
일단 직접 mysql workbench를 사용하여서 반환 값을 받아보자
CREATE TABLE memo(
id INT,
username VARCHAR(25),
contents VARCHAR(500)
PRIMARY KEY(id)
);
위와 같은 테이블이 존재한다.
보통 쿼리를 직접 입력하면
select
id,
username,
contents
from memo
where contents
like '%{searchKeyword}%'
이런식으로 입력한다.
하지만 라이브러리를 사용하게 되면
public interface MemoRepository extends JpaRepository<Memo, Long> {
//content의 일부 값으로 검색 쿼리 기능 추가
@Query("SELECT m FROM Memo m WHERE m.contents LIKE %:keyword%")
List<Memo> findByMemoContaining(@Param("keyword") String keyword);
}
인터페이스를 사용하여 구현체가 없이도 이름만으로 쿼리가 생성되고 추가 쿼리가 필요하면
@Query 어노테이션으로 가능하다.
이제 이걸 Service 로직에 추가하게 되면 끝이 난다.
public List<MemoResponseDto> getMemosByKeyword(String keyword) {
List<MemoResponseDto> memoList = memoRepository.findByMemoContaining(keyword)
.stream()
.map(MemoResponseDto::new)
.toList();
if(memoList.isEmpty()) {
throw new IllegalArgumentException("키워드가 포함된 메모는 존재하지 않습니다.");
}
return memoList;
}
라이브러리 사용이 많다보니 생각보다 기능을 익히고 사용하는 부분이 힘들다...