[TIL] 2025-01-24_일정관리_트러블슈팅

Yuri·2025년 1월 24일

TIL

목록 보기
36/59

🔫 일정관리 API 를 구현하며 겪은 문제점과 해결방법, 새로 알게된 점을 기록합니다.

📋 기획 정의

일정관리 앱 API 로 별도의 화면은 구현하지 않고 요청과 응답은 JSON 으로 주고 받는다.

  • 전체 일정 조회
    다음 조건을 바탕으로 등록된 일정 목록을 전부 조회
    • 수정일 (형식: YYYY-MM-DD)
    • 작성자명
  • 조건 중 한 가지만을 충족하거나, 둘 다 충족을 하지 않을 수도, 두 가지를 모두 충족할 수도 있다.
  • 수정일 기준으로 내림차순으로 정렬하여 조회

문제점1

목록 조회는 4개의 조건으로 조회가 가능하다.

  1. 조건 없음
  2. 수정일만 입력
  3. 작성자명만 입력
  4. 수정일, 작성자명 모두 입력

이 때, 클라이언트로부터 조건을 Query Parameter 로 받게 되면 총 4개의 경우의 수가 발생한다.

✅ 데이터(JSON, TEXT, XML 등)를 직접 HTTP Message Body에 담아서 전달하는 @RequestBody를 사용

1. 조건 없음 테스트

전체 목록이 조회될거라는 예상과 달리 400 Bad Request 상태 코드를 받았다.

▶︎ 서버
org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing 이 발생하였다. ⇒ 요청의 Body에 필요한 데이터가 존재하지 않는다.

원인1

조건이 없는 경우를 가정하여 HTTP Message Body 에 아무것도 작성하지 않았는데 이 경우 서버는 클라이언트가 주기로 약속되어 있던 JSON 데이터를 못 받은 것으로 간주한다.

해결 방법1

RequestBody에 비어있는 JSON 데이터를 넘겨주면 된다.

HTTP Message Body에 아예 값이 없는 것과 {} 비어있는 JSON 이 들어간 것은 다르다.

문제점2

요청 데이터에 따라 목록 조회 sql이 달라진다.

  1. 조건 없음
    findAllSchedule()
  2. 수정일만 입력
    findAllScheduleByModDate()
  3. 작성자명만 입력
    findAllScheduleByAuthor()
  4. 수정일, 작성자명 모두 입력
    findAllScheduleByModDateAndAuthor()

위의 메서드들은 결국 모두 전체 일정 조회의 역할이다. 이렇게 메서드로 분리하면 중복코드가 생기고 가독성도 떨어진다. 조회 조건이 추가된다면 메서드도 추가되어야한다. 🙅

해결 방법2

findAllSchedule() 안에서 동적 쿼리를 수행한다.

	@Override
    public List<ScheduleResponseDto> findAllSchedules(Schedule dto) {
        String sql = "SELECT s.id, u.name author, s.todo, s.regDate, s.modDate " +
                "FROM schedule s " +
                "JOIN user u ON s.author_id = u.id " +
                "WHERE 1=1";
        List<Object> params = new ArrayList<>();

        if (dto.getAuthorId() != null) {
            sql += " AND s.author_id = ?";
            params.add(dto.getAuthorId());
        }
        if (dto.getModDate() != null) {
            sql += " AND s.modDate < ?";
            params.add(dto.getModDate().plusDays(1));
        }

        sql += " ORDER BY s.modDate DESC";
        log.info("sql = {}", sql);
        return jdbcTemplate.query(sql, scheduleRowMapper(), params.toArray());
    }

수정일, 작성자명 조건에 따라 다른 쿼리가 실행될 수 있도록 조건문 안에서 SQL의 WHERE 절 문자열을 조합한다.

✔️ 오늘의 이슈

날짜와 시간 표시 수정

배운 점

필수 과제에서 조건이 가장 복잡했던 조회가 제일 까다로웠다. 다양한 조건을 고려해야 하기 때문에 놓칠 수 있는 부분이 매우 많다. 기능 테스트와 검증을 통해 계속 코드를 리펙토링하며 완성도를 높여야 할 것 같다.

profile
안녕하세요 :)

0개의 댓글