ResponseAdvice

codakcodak·2023년 12월 3일
0

wannago

목록 보기
4/5
post-thumbnail

문제점

  • 프론트 입장에서 매번 백엔드의 response형태가 다르고 내부 상태코드 및 설명을 추가적으로 삽입하여 일관된 형태의 필요성을 느낌
  • 모든 request에 controller에서 형태를 바꾸기 보다는 controller밖에서 최종적으로 response형태를 바꿔줄 수 있는 수단이 필요

해결방안

  • 최종적으로 보내지는 ResponseDto를 선언
  • 응답형태에 관련된 ResponseBodyAdvice인터페이스를 구현 및 beforeBodyWrite 오버라이딩

구현

1.ResponseDto선언

import lombok.Getter;
import lombok.Setter;

@Getter @Setter
public class ResponseDto{
	//data의 클래스가 정해지지 않았기에 모든 것을 담을 수 있는 Object로 선언
	private Object data;
    //내부상태코드
	private int statusCode;
    //상세 메세지
	private String message;
	public ResponseDto(Object data,int statusCode,String message){
		this.data=data;
		this.statusCode=statusCode;
		this.message=message;
	}
}

2.ResponseBodyAdvice인터페이스를

import com.ssafy.wannago.exception.CustomException;

import lombok.extern.slf4j.Slf4j;

@Slf4j
@RestControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {return true;}
	
    @Override
	public Object beforeBodyWrite(Object body, MethodParameter returnType,
        MediaType selectedContentType, Class selectedConverterType,
        ServerHttpRequest request,ServerHttpResponse response) {
        HttpServletResponse servletResponse =
                ((ServletServerHttpResponse) response).getServletResponse();
        int status = servletResponse.getStatus();
        
        if(body==null) {
        	return new ResponseDto("empty",status,"Request was successful");
        }
        
        if(body instanceof ResourceRegion || body instanceof Resource) {
        	return body;
        }
        if(body instanceof CustomException) {
        	CustomException Ce=(CustomException)body;
        	log.debug("사용자 실패 처리");
        	return new ResponseDto("empty",status,Ce.getMsg());
        }
        if(body instanceof Exception){
        	Exception e=(Exception)body;
        	log.debug("내부 실패 처리");
        	return new ResponseDto("empty",status,e.getMessage());
        }
        log.debug("성공된 반환 처리");
        return new ResponseDto(body,status,"Request was successful");
    }
}

3. 결과

data,statusCode,message가 모든 api요청에 대하여 일관된 형태로 보내지고 있다.

profile
숲을 보는 코더

0개의 댓글