API서버 구성요소 중 응답이 있는데 Response구성하는 여러가지 방법 중
직접 Headerd와 body, ErrorCode를 써서 구성하는 방법입니다.
기본적으로 ResponseEntity.status(HttpStatus.OK)를 사용해서 응답을 할 수도 있지만,
프로젝트를 진행할 때에 팀원끼리 약속된 응답형식과 코드를 통해 사용을 할수도 있습니다.
Response중 먼저 Header class를 작성해 줍니다.
public class ApiHeader {
private int resultCode; // 성공 200, 실패다 999, 600
private String codeName; // success, fail, NOT_FOUND_USER
public ApiHeader(int resultCode, String codeName) {
this.resultCode = resultCode;
this.codeName = codeName;
}
public int getResultCode() {
return resultCode;
}
public String getCodeName() {
return codeName;
}
}
httpStatus에도 200 OK, 404 Not Found가 있는거처럼 resultCode와 resultName을 담을수 있는 Header를 생성해주고
클라이언트로 데이터를 전달 할 Body클래스도 만들어 줍니다.
public class ApiBody <T>{
private T data;
private T msg;
public ApiBody(T data, T msg){
this.data = data;
this.msg = msg;
}
public T getData(){
return data;
}
public T getMsg(){
return msg;
}
}
데이터는 여러 타입의 데이터가 들어올 수 있으니
제네릭 타입을 사용해 줍니다.
body 또한 프로젝트에 따라서 약속해주면 되는데 예제에서는 data,msg 두가지를 body에 담겠습니다.
다음 컨트롤러에서 헤더와 바디를 담아서 보낼 ApiResponse class입니다.
public class ApiResponse<T> {
private ApiHeader header;
private ApiBody body;
private static int SUCCESS = 200;
public ApiResponse(ApiHeader header, ApiBody body) {
this.header = header;
this.body = body;
}
public ApiResponse(ApiHeader header) {
this.header = header;
}
public static <T> ApiResponse<T> OK(T data) {
return new ApiResponse<T>(new ApiHeader(SUCCESS, "SUCCESS"), new ApiBody(data,null));
}
public static <T> ApiResponse<T> fail(ErrorCode errorCode) {
return new ApiResponse(new ApiHeader(errorCode.getCode(), errorCode.name()), new ApiBody(null, errorCode.getMessage()));
}
}
성공일때와 실패 두가지 함수가 있는데
성공시에는 200 SUCCESS와 함께 전달할 data를 리턴해주고
실패시에는 예외처리에 맞게 ErrorCode에서 code값과 name을 가져와서 리턴해줍니다.
ErrorCode는 ENUM을 통해서 관리를 해주는데
아래와 같이 약속된 ErrorCode를 사용해서 처리를 해주면 됩니다.
public enum ErrorCode {
FAIL(999, "실패"),
NOT_SUPPORTED_METHOD(998, "NOT_SUPPORTED_METHOD"),
NOT_FOUND_USER(100, "NOT_FOUND_USER"),
NOT_FOUND_TOKEN(101, "NOT_FOUND_TOKEN"),
MALFORMED_ERROR(102, "MALFORMED_ERROR")
;
private int code;
private String message;
ErrorCode(int code, String message) {
this.code = code;
this.message = message;
}
public int getCode() {
return code;
}
public String getMessage() {
return message;
}
}
성공시와 실패시 예를 보자면 아래처럼 간단하게 사용도 할 수 있고,
ExceptionHandler를 통해서 예외처리 관리도 가능합니다.
다음 포스팅에서는 ExceptionHandler에 관해 작성해 보겠습니다.
@RequestMapping(method = RequestMethod.GET, value="/getUser")
public @ResponseBody ApiResponse<UserDTO> getUser(HttpServletRequest request, String user_id){
if(user_id == null){
return ApiResponse.fail(ErrorCode.FAIL);
}
return ApiResponse.OK(userService.getUser(user_id));
}