HttpStatus, HttpHeaders, HttpBody 데이터를 갖는 ResponseEntity 클래스를 활용한다.
HTTP 응답의 상태 코드, 헤더, 본문을 유연하게 제어할 수 있다.
@GetMapping("/login")
public ResponseEntity<Member> login(String email, String password, HttpServletRequest httpServletRequest) {
...
return new ResponseEntity<Member>(member, httpHeaders, HttpStatus.OK);
}
JSend는 웹 서버의 JSON 응답 형식을 지정하는 방법에 대한 몇 가지 규칙을 규정 한 사양이다.
JSON 데이터를 제공하는 많은 웹 서비스가 있고, 각각 고유한 형식의 응답 형식이 있다. 근데, 데이터를 구성하는 데는 공통적인 패턴은 많이 있지만, naming 또는 types of response와 같은 항목에는 약속이 없다.
또한 모든 사람이 서로 상호 작용하는 일반적인 접근 방식을 기대할 수 있기 때문에 상호 간의 통일성을 개선하는데 도움이 된다.
JSend는 상태(status), 데이터(data), 메시지(message), 오류 코드(code 등)를 명확하게 구조화한다.
@Getter
@Setter
public class ResponseCommonVo<T> implements Serializable{
private LocalDateTime timestamp;
private Integer status;
private T data;
private String message;
private ResponseCommonVo() {
}
private static <T> ResponseCommonVo result(int status, String message, T data) {
ResponseCommonVo responseCommonVo = new ResponseCommonVo();
responseCommonVo.status = status;
responseCommonVo.message = message;
responseCommonVo.data = data;
return responseCommonVo;
}
public static <T> ResponseCommonVo success(T data) {
return success(200, "OK", data);
}
public static <T> ResponseCommonVo fail(String message) {
return result(0, message, null);
}
public static <T> ResponseCommonVo error401(){
return result(401, "UnAuthorized", null);
}
public static <T> ResponseCommonVo error404(){
return result(404, "Not Found", null);
}
...
}
위와 같이 공통 응답 포맷을 정의하였다.
처음부터 모든 Handler(Controller) 반환값을 ResponseCommonVo로 반환하면 좋겠지만 그렇지 않은 경우도 있고 때에 따라서는 특정한 Handler에서는 적용하지 않아야 할 수도 있을 것이다.
이런 경우 ResponseBodyAdvice를 적용하여 해결할 수 있다.
private LocalDateTime timestamp;
timestamp는 ResponseBodyAdvice 구현체에서 공통적으로 설정할 예정이다.
ResponseBodyAdvice는 Spring MVC에서 Handler(Controller) 처리 후, 클라이언트로 전달되기 전에 공통적으로 처리하거나 수정하고자 할 때 사용된다.
공통 응답 포맷 통일, 데이터 후처리, 보안, 로깅 및 디버깅 등의 경우에 사용 될 수 있다.
ImmutableList에 대한 고찰 (1) | 2024.10.13 |
---|---|
SpringBoot CSV Read / Write (opencsv) (8) | 2024.09.12 |
Optional 사용에 대한 고찰 (사용목적, 메서드, 주의사항) (0) | 2024.09.06 |
[JAVA] LocalDate (날짜와 시간) 내일, 월말, 월초, 년말, 년초, 윤년 구하기 (0) | 2024.08.27 |
PageHelper를 이용한 페이징처리 (Mybatis) (0) | 2024.08.27 |
댓글 영역