[과제] 2주차 진행

Shaun.the.sheep·2025년 7월 18일

[과제] 2~4주차

목록 보기
1/1

들어가기 전...

과제를 하는 도중 든 생각은 구조를 생각하며 설계를 하는 것,
그게 제일 어렵다는 생각을 한다.

먼저 숙제 내용부터 확인해보자


❓ 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를 사용하여 방법을 찾습니다.


과거 작업을 할 때에는 DBMS에 직접 쿼리문을 작성하고 그 값을 string으로 stringbuilder로 각 필요한 조건이나 다른 기능 절들을 쌓아가며 실행을 했었는데 JPA라는 라이브러리를 공부하고 보니 과거에 했던 습관 때문에 라이브러리 사용이 쉽지만은 않았다

일단 직접 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;
    }

라이브러리 사용이 많다보니 생각보다 기능을 익히고 사용하는 부분이 힘들다...

0개의 댓글