DELETE API를 만들다 보면 한 번쯤 고민하게 된다.
삭제하려는 id에 해당하는 리소스가 없으면 예외를 터뜨려야 할까?
예를 들어 이런 요청이 들어왔다고 해보자.
DELETE /themes/999
그런데 999번 테마가 DB에 없다.
이때 서버는 어떻게 응답해야 할까?
204로 처리하는 방식
첫 번째 방법은 리소스가 있든 없든 삭제 요청을 성공으로 보는 것이다.
DELETE /themes/999
이 방식은 “결과적으로 해당 리소스가 없는 상태가 되었으니 성공”이라고 해석할 수 있다.
하지만 클라이언트 입장에서는 애매하다.
실제로 삭제가 된 것인지, 애초에 존재하지 않았던 것인지 알 수 없다. 사용자에게 명확한 피드백을 주기 어렵다.
예외를 터뜨리는 방식
두 번째 방법은 삭제 대상이 없으면 예외를 터뜨리는 것이다.
404 Not Found
이 방식은 클라이언트에게 훨씬 명확하다.
삭제하려던 리소스가 존재하지 않습니다.
API를 사용하는 입장에서는 요청이 왜 실패했는지 바로 알 수 있다.
특히 관리자 페이지처럼 사용자가 직접 삭제 버튼을 누르는 UI에서는 이런 피드백이 중요하다.
추가 조회 쿼리가 꼭 필요할까?
처음에는 이렇게 생각했다.
if (!repository.existsById(id)) {
throw new DomainException(ErrorCode.THEME_NOT_FOUND);
}
repository.deleteById(id);
이 방식은 이해하기 쉽다.
하지만 쿼리가 두 번 나간다.
- 존재 여부 확인
- 삭제
물론 id 조회는 보통 PK 인덱스를 타기 때문에 큰 성능 부담은 아니다.
하지만 굳이 두 번 조회하지 않아도 된다. `DELETE` 쿼리 자체가 삭제 성공 여부를 알려주기 때문이다.
public boolean deleteById(Long id) {
int rowCount = jdbcTemplate.update("""
DELETE FROM theme
WHERE id = ?
""", id);
return rowCount > 0;
}
`JdbcTemplate.update()`는 영향받은 row 수를 반환한다.
삭제된 row가 1개라면 삭제 성공이고, 0개라면 해당 id의 리소스가 없었다는 뜻이다.
서비스에서는 이렇게 처리할 수 있다.
if (!themeRepository.deleteById(id)) {
throw new DomainException(ErrorCode.THEME_NOT_FOUND);
}
이렇게 하면 추가 조회 쿼리 없이도 명확한 예외 처리가 가능하다.
내 결론
나는 삭제할 리소스가 없으면 예외를 터뜨리는 쪽이 더 낫다고 생각한다.
API는 단순히 서버 내부 처리를 끝내는 것이 아니라, 클라이언트에게 현재 상황을 명확하게 알려줘야 한다. 삭제 대상이 없는데도 204를 내려버리면 클라이언트는 실제로 삭제된 것인지, 원래 없던 것인지 알 수 없다.
다만 예외 처리를 위해 반드시 조회 쿼리를 한 번 더 날릴 필요는 없다.
삭제 쿼리의 결과를 활용하면 된다.
if (!repository.deleteById(id)) {
throw new DomainException(ErrorCode.RESOURCE_NOT_FOUND);
}
정리하면 다음과 같다.
- 삭제 대상이 없으면 `404 Not Found`를 내려 클라이언트에게 명확히 알려준다.
- 별도 `existsById` 조회보다는 `DELETE`의 row count를 활용한다.
- 사용자 경험과 API 명확성을 챙기면서도 불필요한 쿼리는 줄일 수 있다.
'우테코 8기 > 본과정 탐구 일지' 카테고리의 다른 글
| [레벨2 - 방탈출 사용자] Clock을 통해 테스트 상황에서 시간 제어하기 (0) | 2026.05.18 |
|---|---|
| [레벨 2 - 방탈출 사용자] 유니크 제약 조건, 서비스에서 검증할까? 리포지토리에서 처리할까? (0) | 2026.05.10 |
| [레벨2 - 방탈출 사용자] 201 Created 응답에서 Location 헤더는 꼭 필요할까? (0) | 2026.05.10 |
| [레벨 2 - 방탈출 관리자] 테이블 구조 변경으로 인한 코드 수정을 효율적으로 하기 (0) | 2026.05.01 |
| [레벨 1 장기] 안 좋은 코드습관 고치기 (1) | 2026.04.12 |