BaseResponse 클래스는 주로 API의 응답 형식을 표준화하여 모든 API가 일정한 구조를 가질 수 있게끔 설계된 응답 포맷 클래스입니다. REST API의 응답에서는 데이터뿐만 아니라 성공 여부, 메시지, 에러 상태를 함께 제공해야 하는 경우가 많기 때문에 BaseResponse와 같은 구조화된 응답 형식이 필요합니다.
BaseResponse의 주요 역할
1. 응답 형식 표준화
API 호출 결과가 성공했는지 실패했는지, 에러가 발생했을 때 에러에 대한 세부 정보를 클라이언트가 일관되게 받을 수 있습니다.
2. 성공 및 에러 메시지 통합 관리
클라이언트는 success 필드를 통해 성공 여부를 확인하고, type과 message를 통해 에러 유형 및 메시지를 확인할 수 있습니다.
3. 개발 효율성 및 확장성
BaseResponse의 변경을 통해 전체 API 응답 구조를 손쉽게 일괄 변경할 수 있습니다.
BaseResponse의 주요 필드와 메서드 설명
주요 필드
• success: API 요청이 성공하면 true, 실패 시 false
• type: 오류 코드 또는 상태를 나타내는 코드 (예: HTTP 상태 코드나 정의된 에러 코드)
• message: 성공 또는 에러 메시지. 오류 발생 시 상세한 설명을 포함.
• body: 응답 데이터, 성공적인 응답일 경우 실제 데이터 객체가 포함되고, 에러 시 null이 될 수 있음.
코드 예시
@Getter
@RequiredArgsConstructor(access = AccessLevel.PRIVATE)
public class BaseResponse<T> {
private final boolean success; // 성공 여부
private final String type; // 에러 타입 또는 성공 코드
private final String message; // 메시지
private final T body; // 응답 데이터
// 성공적인 응답을 위한 정적 팩토리 메서드
public static <T> BaseResponse<T> success(T body) {
return new BaseResponse<>(true, null, null, body);
}
// 예외 발생 시 에러 타입을 전달하는 응답
public static <T> BaseResponse<T> failure(ExceptionType type) {
return new BaseResponse<>(false, type.getType(), type.getDesc(), null);
}
// 예외 발생 시 사용자 정의 메시지를 추가하는 응답
public static <T> BaseResponse<T> failure(ExceptionType type, String message) {
return new BaseResponse<>(false, type.getType(), type.getDesc() + message, null);
}
}
사용 예시
1. 성공적인 데이터 응답
UserResponseDto userData = userService.findById(id);
return BaseResponse.success(userData);
성공 응답 시에는 BaseResponse.success() 메서드를 통해 true와 데이터를 포함한 응답을 반환합니다.
2. 에러 응답
if (user == null) {
throw new CustomException(ExceptionType.USER_NOT_FOUND);
}
에러 발생 시 ExceptionHandler가 예외를 잡아서 BaseResponse.failure() 메서드로 false 상태와 에러 타입을 반환합니다.
DTO와의 차이점
• DTO는 데이터 전송 객체(Data Transfer Object)로, 데이터베이스 엔티티의 특정 필드만을 담아 특정 응답 형태로 데이터를 가공하여 전달하는 역할을 합니다.
예를 들어 UserResponseDto는 사용자 정보 중 필요한 필드만을 담아 클라이언트에 전송합니다.
• BaseResponse는 응답 형식을 일관되게 유지하여, 성공 여부와 에러 정보를 포함하는 표준 포맷을 제공합니다. 데이터가 성공적으로 처리되었는지, 에러가 발생했는지 여부를 추가로 알려줍니다.
두 객체의 비교
• DTO의 역할
실제 데이터, 예를 들어 사용자 정보(이름, 나이, 직업)를 가공하여 클라이언트에 전달하기 위해 사용됩니다. DTO는 단순히 특정 엔티티 또는 모델의 일부 필드를 선택하거나 가공해 담는 용도입니다.
• BaseResponse의 역할
데이터와 더불어 응답 상태, 성공 여부, 에러 메시지를 포함하여 클라이언트가 응답의 상태를 쉽게 파악할 수 있도록 합니다. 여러 API의 응답 구조가 동일해지므로 프론트엔드와의 협업에 유리합니다.
BaseResponse가 필요한 이유와 장점 요약
1. API 응답의 일관성
모든 API 응답이 동일한 형태를 유지하여 프론트엔드가 쉽게 파싱할 수 있습니다.
2. 에러 처리의 통일성
에러 발생 시에도 동일한 응답 구조로 처리할 수 있어 예외 상황에서 일관성 있는 응답을 보장합니다.
3. 유지보수와 확장성
BaseResponse를 수정하여 전체 API의 응답을 일괄 관리할 수 있어 확장 및 유지보수가 쉽습니다.
따라서 BaseResponse는 단순한 데이터 전송이 아닌, API의 일관된 응답을 관리하여 클라이언트가 예측 가능한 형식으로 데이터를 받을 수 있게 해주는 중요한 역할을 합니다.
'spring' 카테고리의 다른 글
[Spring] Spring Boot를 통한 JDBC, JdbcTemplate, JPA의 이해와 비교 (1) | 2024.11.22 |
---|---|
[Spring] JdbcTemplate과 일반 JDBC 코드의 차이점 (1) | 2024.11.19 |
[Spring] RuntimeException을 통한 CustomException (0) | 2024.10.31 |
[Spring] @RestControllerAdvice와 @ExceptionHandler를 통한 예외처리 (0) | 2024.10.31 |
[Spring] @JsonCreator로 Enum 역직렬화하기 (3) | 2024.10.30 |