일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
- 스레드
- 람다
- 실전 자바 고급 1편
- 자바 입출력 스트림
- java
- 도커
- lambda
- 함수형 인터페이스
- Collection
- 리스트
- 컨테이너
- 쿠버네티스
- Kubernetes
- 동시성
- Thread
- 자료구조
- Docker
- LIST
- 자바
- 도커 엔진
- 쓰레드
- 시작하세요 도커 & 쿠버네티스
- 멀티 쓰레드
- java socket
- container
- 알고리즘
- 인프런
- 스트림
- Java IO
- 김영한
- Today
- Total
쌩로그
컨트롤러 테스트 중 만난 org.springframework.web.HttpMediaTypeNotAcceptableException 본문
컨트롤러 테스트 중 만난 org.springframework.web.HttpMediaTypeNotAcceptableException
.쌩수. 2024. 10. 11. 06:50목록
- 포스팅 개요
- 본론
- 요약
1. 포스팅 개요
컨트롤러 테스트를 하는 도중 ResponseEntity
의 제너릭에 아무 타입도 지정해주지 않고 반환하려 한 요청 핸들러 메서드
들이 있었다.

경고 줄이 나오는 게 조금 신경쓰였고, 수정, 삭제 같은 경우 HttpStatus
외에 메세지로 수정, 삭제가 완료되었다는 메세지를 응답 데이터로 넣어주는 게 좋을 거 같아서 아래와 같이 MessageResponse
라는 커스텀 타입을 만들어서 반환하도록 했다.

그리고 컨트롤러 테스트를 하는 도중에 제너릭 타입을 바꾼 요청 매핑 핸들러 테스트만 실패했다.

이를 해결하고자 한 포스팅이다.
2. 본론
자 로그를 살펴보자.
문제의 단서 첫 번째

200을 바랬지만, 406이 떴다.
https://developer.mozilla.org/ko/docs/Web/HTTP/Status/406
위의 링크는 MDN 페이지인데, 클라이언트가 요청한 헤더에 정의한 타입과 서버에서 내려주는 응답의 데이터 타입이 불일치해서 생기는 문제였다.
그래서 로그에서도 다음과 같은 예외를 발생시키고 있다.

발생한 예외는 org.springframework.web.HttpMediaTypeNotAcceptableException
이것이다.
예외 이름에서 알 수 있듯이 헤더에 정의한 데이터 타입(정확히는 미디어 타입)이 접근할 수 없는 타입이라서 생긴 예외다.
그럼 뭐가 문제일까?
MessageResponse라는 타입으로 지정한 이후에 발생한 문제였다.
그 코드는 다음과 같다.(패키지 생량)
package refactoring.bookvillage.global.util.response;
import lombok.AllArgsConstructor;
@AllArgsConstructor
public class MessageResponse {
private String message;
public MessageResponse(MessageCode messageCode) {
this.message = messageCode.message;
}
public enum MessageCode {
BORROW_UPDATE("대여 게시글이 수정되었습니다."),
BOROOW_DELETED("대여 게시글이 삭제되었습니다.");
String message;
MessageCode(String message) {
this.message = message;
}
}
}
해당 예외에 대해서 구글링 해보니 Getter
가 없다.
ㅇㅇ 맞다.
위에 보면 Getter
가 없다.
스프링은 요청할 때도 프로퍼티 접근을 Getter
혹은 Setter
로 접근하더니, 응답 값을 반환할 때도 Getter
를 사용하는 거 같다.
※ 개인적인 생각이지만, 요즘 Getter
를 잘 안 사용하려고 하지만, 값을 불러올 때가 더러 있어서 쓰게 된다.
여하튼 Getter
가 없어서 생긴 문제였다.
그래서 Getter
를 추가했다.
package refactoring.bookvillage.global.util.response;
import lombok.AllArgsConstructor;
import lombok.Getter;
@Getter // 추가
@AllArgsConstructor
public class MessageResponse {
private String message;
public MessageResponse(MessageCode messageCode) {
this.message = messageCode.message;
}
public enum MessageCode {
BORROW_UPDATE("대여 게시글이 수정되었습니다."),
BOROOW_DELETED("대여 게시글이 삭제되었습니다.");
String message;
MessageCode(String message) {
this.message = message;
}
}
}
테스트가 통과된 것을 아래와 같이 확인할 수 있다.

굿~
3. 요약 및 참고 블로그
응답으로 지정한 타입에 Getter
가 없어서 생긴 문제였다.
참고 블로그
'TroubleShooting & 고민 > BE' 카테고리의 다른 글
@DataJpaTest VS @SpringBootTest (feat.QueryDSL) (2) | 2024.10.07 |
---|---|
@RestControllerAdvice (3) | 2024.09.16 |
검색 조건을 가진 Condition클래스 @Setter 빼기 (0) | 2023.08.15 |
전체조회시 QueryDSL 사용 (3) | 2023.08.03 |
Test코드 작성시 Post를 작성한다면, Map을 사용해보자. (0) | 2023.07.24 |