쌩로그

컨트롤러 테스트 중 만난 org.springframework.web.HttpMediaTypeNotAcceptableException 본문

TroubleShooting & 고민/BE

컨트롤러 테스트 중 만난 org.springframework.web.HttpMediaTypeNotAcceptableException

.쌩수. 2024. 10. 11. 06:50
반응형

목록

  1. 포스팅 개요
  2. 본론
  3. 요약

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 가 없어서 생긴 문제였다.

참고 블로그

728x90
Comments