@RestController, HTTP Status 406ㅠㅠ

엉금엉금·2023년 1월 9일
0

오늘 만난 문제

목록 보기
22/24
post-thumbnail

@RestController
public class HomeController {
	
	@GetMapping("/")
	public ResponseEntity<WelcomeData> home() {
		WelcomeData wd = new WelcomeData(1L, "two");
		return new ResponseEntity<WelcomeData>(wd, HttpStatus.OK);
	}
	
	public class WelcomeData {
		private Long first;
		private String second;
		public WelcomeData(Long first, String second) {
			this.first = first;
			this.second = second;
		}
	}
}

Spring Framework와 React의 연동을 위하여 스프링에서 RestController에서
ResponseEntity를 통해 JSON 데이터를 응답하는 간단한 예제를 만들던 중
위와 같은 에러를 만나게 되었다..ㅠㅠ

하이퍼텍스트 전송 프로토콜(HTTP)의 406 Not Acceptable 클라이언트 에러 응답 코드는 서버가 요청의 주도적인 콘텐츠 협상 헤더에 정의된 허용 가능한 값 목록과 일치하는 응답을 생성할 수 없으며, 서버가 기본 표현을 제공하지 않음을 나타냅니다

MDN web docs에서 바로 나오는 설명은 위와 같으며 바로 이해할 수 있었다.
서버에서 "나 해당 요청에 대해 응답해줄 수 없어ㅠㅠ"라고 하는 것인 것 같다.
더 정확히는 Spring에서 Http의 헤더 중 Content-Type에 선언된 형식으로 변환이 불가능한 경우 406에러가 발생한다.

그렇다면 나의 경우에서 왜 이러한 에러가 발생했는지 보면 아래와 같다.
1. pom.xml에 jackson과 관련한 의존성이 추가되어 있지 않았다.
2. JSON으로 표현되기 바라는 데이터 class에 getter가 존재하지 않았다.

1번의 경우는 JSON 객체를 응답으로 내보내기 위해 필요한 것이므로 필수!
그런데 getter의 경우가... 이해가 되지 않아 잠깐 찾아보았다.

우선 @RestController를 이용하는 컨트롤러에서 JSON을 응답해주기 위해서는 위에서 보는 데이터 클래스가 JSON으로 변환되어 야하는데 이때 'JsonMessageConverter'가 사용이되고 WelcomeData 라는 데이터가 JSON 데이터로 변환이 된다. 이때 자바 빈 규약에 따른 프로퍼티 바인딩 (Getter/Setter)가 발생하며 Getter를 필요로 하게 된다고 한다. 위 코드에서는 Getter가 존재하지 않았고 JSON데이터로 변환을 할 수 없었던 것이였다... class의 getter를 통해서 값을 얻지 못했고 406에러가 발생하게 되었다.

업로드중..

  • 1번과 2번 해결 후에 위와 같이 JSON데이터가 정상적으로 응답되는 것을 POST-MAN을 통해서 확인할 수 있었다!
profile
step by step

0개의 댓글