
puppyWalk 서비스를 만들면서,
가장 먼저 항해플러스에서 배운 "실시간 특강 신청"을 응용해서,
매일 선착순 n명에 500포인트를 지급하는 기능을 먼저 설계하기로 했다.
현재 페이지는 EventController를 만들면서, 새로 배운 annotation이나 코드의 의미를 정리하도록 하겠다.
/*
// EventController.java
* 이벤트 목록
*/
@GetMapping
public ApiResponse<List<GetEventsResponse>> getEvents() {
final List<Event> events = eventService.getEvents();
return ApiResponse.isOk(GetEventsResponse.from(events));
}
// ApiResponse.java
public static <T> ApiResponse<T> isOk(T data) {
return new ApiResponse<>(HttpStatus.OK.value(), data);
}
기존의 내 코드라면 당연히 반환형을 List로 했을 테이지만, 컨트롤러에서 모든 응답을 받아 처리하기 위해 return값을 ApiResponse로 설정했다. 그 이유는 다음과 같다
응답의 표준화 및 일관성 유지
ApiResponse 클래스를 사용하면 모든 API 응답이 일관된 구조를 가지게 됩니다. 이는 클라이언트가 응답을 처리하는 데 있어 예측 가능성과 일관성을 제공하여, 클라이언트 코드의 복잡성을 줄여줍니다.
상태 정보 제공
ApiResponse 클래스는 HTTP 상태 코드를 포함합니다. 이는 클라이언트가 응답의 성공 여부를 쉽게 확인할 수 있게 해줍니다. 단순히 List를 반환할 경우, 성공 여부를 확인하기 위해 추가적인 작업이 필요할 수 있습니다.
확장성
ApiResponse를 사용하면 응답에 추가적인 메타데이터를 쉽게 포함할 수 있습니다. 예를 들어, 페이징 정보, 요청 처리 시간, 디버깅 정보 등을 포함할 수 있습니다. 이를 통해 API의 기능을 확장하고 클라이언트에게 더 많은 정보를 제공할 수 있습니다.
에러 처리
표준화된 응답 구조를 사용하면 에러 처리도 일관되게 할 수 있습니다. 성공 응답뿐만 아니라 에러 응답도 같은 구조를 따르기 때문에, 클라이언트가 이를 처리하기가 쉬워집니다.
데이터 변환 및 추상화
GetEventsResponse 클래스를 사용하면, 도메인 모델(Event)을 클라이언트에 직접 노출하지 않고, 필요한 데이터만 제공하거나 데이터를 특정 형식으로 변환할 수 있습니다. 이는 보안성과 캡슐화를 높이는 데 도움이 됩니다.