프로젝트를 진행하면서 유저 로그인을 진행하는데 406 에러가 발생하는 상황이 있었다.
스프링부트와 리액트를 사용했고 내부 서비스는 전부 동작해서 DB에 값 수정까지 됐지만
응답을 하는 과정에서 406 에러가 발생했다.
나는 ApiResponse를 따로 만들어서 json 응답을 생성하였다.
package com.parkchoi.scrum.util.api;
public class ApiResponse<T> {
// 상태 구분1
private static final String SUCCESS_STATUS = "success";
private static final String FAIL_STATUS = "fail";
private static final String ERROR_STATUS = "error";
private String status;
private T data;
private String message;
public ApiResponse(String status, T data, String message) {
this.status = status;
this.data = data;
this.message = message;
}
// 성공했을 때 data와 message 리턴
public static <T> ApiResponse<T> createSuccess(T data, String message){
return new ApiResponse<>(SUCCESS_STATUS, data, message);
}
// 성공했지만 리턴 데이터가 없는 경우 message 리턴
public static <T> ApiResponse<T> createSuccessNoContent(String message){
return new ApiResponse<>(SUCCESS_STATUS, null, message);
}
// 예외 발생으로 API 호출 실패시 반환
public static ApiResponse<?> createError(String message) {
return new ApiResponse<>(ERROR_STATUS, null, message);
}
}
@PostMapping("/login")
public ApiResponse<?> login(@RequestBody AccessTokenRequestDTO accessTokenRequestDTO){
userService.login(accessTokenRequestDTO);
return ApiResponse.createSuccessNoContent("로그인 성공");
}
위와 같은 컨트롤러를 호출했고 실행했으나 406 에러가 발생했던 건데,,,
Mozilla에서 소개하는 406 에러는 아래와 같다.
406 Not Acceptable
하이퍼텍스트 전송 프로토콜(HTTP)의 406 Not Acceptable 클라이언트 에러 응답 코드는 서버가 요청의 주도적인 콘텐츠 협상 헤더에 정의된 허용 가능한 값 목록과 일치하는 응답을 생성할 수 없으며, 서버가 기본 표현을 제공하지 않음을 나타냅니다.
결국 헤더에 정의해놓은 값을 생성할 수 없다는 소리다.
리액트에서는 헤더에 application/json으로 설정해서 json을 보낸다고 명시하고 있다.
그러면 서버에서도 클라이언트에게 json 형식을 응답으로 보내줘야 하는 게 웹 개발의 관례라고 한다.
여기서 406 에러가 발생한 이유는 Getter의 부재때문에 발생했다.
스프링 부트에서 직렬화를 위해 Jackson 라이브러리를 사용하는데, 이때 라이브러리에서 객체의 필드값을 생성하기 위해 Getter 메서드를 사용한다.
그런데 ApiResponse에서 Getter를 정의하지 않았으니 호출을 못하는 문제가 생겼던 것.
JPA를 사용하니 @Getter를 붙여줌으로써 문제를 해결할 수 있었다.
반응형
'오류해결' 카테고리의 다른 글
Repository 테스트 코드에서 1차 캐시로 인한 null 발생 (0) | 2024.01.28 |
---|---|
모든 api 요청이 oauth2Login() 로직을 타는 문제 (1) | 2024.01.17 |
스프링 시큐리티 6.1부터 csrf().disable() 불가능 문제 (0) | 2023.12.22 |
젠킨스 파이프라인 문법 에러 (1) | 2023.12.17 |