Spring 2주차 숙제
Query Methods 기능을 사용하여 내용(contents)에 특정 키워드가 포함된 메모를 조회하는 API를 구현
- Controller를 통해 keyword를 Query String 방식으로 전달받아 메모를 조회하는 API를 추가합니다.
- http://localhost:8080/api/memos/contents?keyword=
- 메서드명은 getMemosByKeyword 입니다.
- MemoService에 getMemosByKeyword 기능을 수행하는 메서드를 구현합니다.
- ‘Postman’을 사용해서 테스트합니다.
- 정렬 방법은 수정 시간을 기준으로 내림차순을 적용합니다.
우선 param 형태로 자료를 받기 위해 Controller에 get 메서드 생성
@GetMapping("/memos/contents")
public List<MemoResponseDto> getMemosByKeyword(@RequestParam String keyword) { return memoService.getMemosByKeyword(keyword); }
정렬을 하기 위한 메서드 MemoRepository 에 생성
List<Memo> findAllByContentsContainingOrderByModifiedAtDesc();
여기서 ContentsContaining은 Contents에 원하는 값이 포함되어 있는지 확인하는 메서드다.
위 메서드 실행할 메서드 생성
public List<MemoResponseDto> getMemosByKeyword(String keyword) {
return memoRepository.findAllByContentsContainingOrderByModifiedAtDesc().stream().map(MemoResponseDto::new).toList();
}
postman에서 체크하기 위해 실행을 하려는데 UnsatisfiedDependencyException에러 발생
@Autowired 사용시 동일한 타입의 Bean 객체를 2개 이상일 때 발생하는 에러라고 한다.
이 문제는 아닌 것 같고 어쩌면 ContentsContaining에서 오류가 생긴걸지도 모른다.
=> getMemosByKeyword가 String keyword를 받는 메서드인데 findAll~~메서드에 파라미터를 넣지 않아 오류가 생긴 듯하다. 다음과 같이 수정하니 제대로 작동한다.
List<Memo> findAllByContentsContainingOrderByModifiedAtDesc(String keyword);
public List<MemoResponseDto> getMemosByKeyword(String keyword) {
return memoRepository.findAllByContentsContainingOrderByModifiedAtDesc(keyword).stream().map(MemoResponseDto::new).toList();
}
postMan에서는 http://localhost:8080/api/memos/contents?keyword= 를 붙여넣고 get방식으로 send하면 자동으로 Params에 keyword를 받는 공간이 생긴다. 여기서 제대로 작동하는 것을 체크했다.
http://localhost:8080/api/memos/contents?keyword=메모 이런식으로 체크도 가능하나 한글은 spacebar로 공백을 만든 뒤 다시 공백을 지우는 과정을 거쳐야 제대로 체크가 돼서 Params에 적는 것을 추천한다.