🔫
일정관리 API를 구현하며 겪은 문제점과 해결방법, 새로 알게된 점을 기록합니다.
일정관리 앱 API 로 별도의 화면은 구현하지 않고 요청과 응답은 JSON 으로 주고 받는다.
수정일 (형식: YYYY-MM-DD)작성자명수정일 기준으로 내림차순으로 정렬하여 조회목록 조회는 4개의 조건으로 조회가 가능하다.
이 때, 클라이언트로부터 조건을 Query Parameter 로 받게 되면 총 4개의 경우의 수가 발생한다.
✅ 데이터(JSON, TEXT, XML 등)를 직접 HTTP Message Body에 담아서 전달하는 @RequestBody를 사용

전체 목록이 조회될거라는 예상과 달리 400 Bad Request 상태 코드를 받았다.
▶︎ 서버
org.springframework.http.converter.HttpMessageNotReadableException: Required request body is missing 이 발생하였다. ⇒ 요청의 Body에 필요한 데이터가 존재하지 않는다.
조건이 없는 경우를 가정하여 HTTP Message Body 에 아무것도 작성하지 않았는데 이 경우 서버는 클라이언트가 주기로 약속되어 있던 JSON 데이터를 못 받은 것으로 간주한다.
RequestBody에 비어있는 JSON 데이터를 넘겨주면 된다.

HTTP Message Body에 아예 값이 없는 것과 {} 비어있는 JSON 이 들어간 것은 다르다.
요청 데이터에 따라 목록 조회 sql이 달라진다.
findAllSchedule()findAllScheduleByModDate()findAllScheduleByAuthor()findAllScheduleByModDateAndAuthor()위의 메서드들은 결국 모두 전체 일정 조회의 역할이다. 이렇게 메서드로 분리하면 중복코드가 생기고 가독성도 떨어진다. 조회 조건이 추가된다면 메서드도 추가되어야한다. 🙅
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 절 문자열을 조합한다.

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