[일정 관리 앱] 일정 수정, 삭제 API 테스트

2024. 10. 9. 19:09내일배움캠프/Schedule Management

 '일정 수정 및 삭제' 에 대한 구현 후 진행한 API 테스트 기록을 남겨본다. 단순히 기록뿐만 아니라 진행 당시 느낀 '이후에 염두해야 할 부분' 또한 남겨본다. 구현을 위해 작성한 코드는 여기서 확인 가능하다.

 

1. 일정 수정

일정 수정 - 정상 요청

 

 Query String Parameter 로 'scheduleId' 를 RequestBody 로 'title, body' 정보를 요청 파라미터로 전달하면 해당되는 일정을 조회해 해당 일정의 정보를 수정 DB 에 반영한다.

 

이 부분을 구현하면서 왜 다수의 개발자들이 '수정' 이란 기능을 수행후 변경 값을 반환하지 않는지 약간이나마 이해할 수 있었다. 맨 처음에는 수정 정보를 RequestBody 로 전달 받아 요청에 해당되는 '일정' Entity 의 필드를 수정하고 '@Transactional' 어노테이션을 통해 DB 에 반영하였는데, 문제가 DTO 로 변경 정보를 반환해보니 '수정일(updateAt)' 이 변경 전 정보로 반환되었다(물론 DB 에는 정상적인 '수정일' 정보가 저장되었다).

 

이유는 현재 날짜/시간 데이터(작성일, 수정일)는 JPA 의 'Auditing' 을 통해 값을 저장하는데, DB 에 Entity 정보를 반영할 때 해당되는 값이 저장된다. '@Transactional' 이 지정된 메서드가 종료될 때 'commit' 이 이루어지며 DB 에 정보가 반영되므로 메서드 종료전에 생성한 DTO 에는 정확한 '수정일' 정보가 저장되지 않은 것이다.

 

그래서 'QueryScheduleRepository' 에 생성한 'update()' 메서드 수행부에 'entityManager.flush()' 를 사용해 위의 문제를 해결했다. 하지만 "이렇게 되면 서비스 계층에 '@Transactional' 을 쓴 의미가 있나?" 라는 생각이 들어 다른 방법을 강구해 봤는데 그 때 눈에 띈 것이 이전 세션에서 튜터님이 작성한 'API 명세서' 였다. 해당 명세서에는 '수정' 에 해당하는 기능 수행시 '변경 정보' 를 반환하지 않았는데 이 때 "아! 이래서 '수정' 기능에 반환 값을 넣지 않는구나!" 라는 생각이 들었다.

 

물론 반환 값을 줄 수는 있지만 그러기 위해서는 'ScheduleService.update()' 메서드 내에서 다시 한 번 변경 된 Entity 를 조회해야 한다. 이는 불필요한 쿼리를 사용한다고 느꼈기에 결국 위 이미지와 같이 '일정' 을 수정 후 반환 값이 없는 형태의 응답을 하는 것으로 마무리 짓게 되었다.

 

'일정 수정' 의 예외는 아래와 같이 처리해 보았다.

일정 수정 - 비정상 요청(1)

 

'일정 수정' 시 존재하지 않는 '일정' 에 대한 수정을 요청할 경우 위 이미지와 같이 예외 코드 및 메시지와 '404 Not Found' 를 반환한다.

일정 수정 - 비정상 요청(2)

 

RequestBody 에 담긴 요청 파라미터가 유효하지 않은 경우 위 이미지와 같이 예외 코드 및 메시지와 '400 Bad Request' 를 반환한다.

 

 

2. 일정 삭제

일정 삭제 - 정상 요청

 

DB 에 존재하는 'scheduleId' 를 쿼리 파라미터로 전달하면 해당되는 '일정' 을 위 이미지와 같이 삭제한다. '일정 수정' 과 마찬가지로 반환되는 것은 없으며 HttpStatus 는 '204 No Content' 이다.

 

만약 존재하지 않는 '일정' 에 대한 삭제 요청을 한 경우 아래와 같이 예외 코드와 메시지와 '404 Not Found' 응답을 반환한다.

일정 삭제 - 비정상 요청

 

 

3. 정리

 '수정' 에 대한 기능을 수행 후 변경된 값을 반환하지 않는 것으로 끝내지 않고 좀 더 고민해 볼 필요가 있다고 생각한다. 현재 파악한 이유 외에도 반환을 잘 하지 않는 이유가 있다면 참고할 필요가 있다.