Spring/문제 해결 (Troubleshooting)

406 Not Acceptable - responseDTO @Getter 의 중요성

가지코딩 2025. 5. 9. 15:25

일정 관리 앱 만들기 프로젝트를 진행하면서

만든 첫 API 를 테스트 하던 중 에러 상황이 발생했다.

 

DB에 데이터는 잘 저장됐는데,,,

잘못된 응답이 반환되었다.

 

406 Not Acceptable

 

콘솔 에러:

Resolved [org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation]


일단 콘솔 에러에 적힌 메시지를 서치 해봤다.

 

요약하면 이러한데

org.springframework.web.HttpMediaTypeNotAcceptableException: No acceptable representation 예외는 클라이언트가 서버에서 처리할 수 없는 Accept 헤더를 포함한 요청을 보낼 때 발생합니다.

클라이언트가 특정 콘텐츠 타입(JSON, XML 등)을 요청했지만 서버가 이를 처리할 수 없는 경우 발생할 수 있습니다.

예외를 해결하기 위한 방법

1. 클라이언트 요청의 Accept 헤더 확인: 
- 요청 헤더에 Accept: application/json 추가

2. 컨트롤러 메소드의 어노테이션 확인:
@RestController 또는 @ResponseBody 누락 여부 확인

3. 의존성 확인
dependencies 에 spring-boot-starter-web 누락 여부 확인
jackson 의존성 포함 여부 확인
implementation 'com.fasterxml.jackson.core:jackson-databind'
implementation 'org.springframework.boot:spring-boot-starter-web'

 

3가지 방법 모두 시도해봤으나

 

상황은 달라지지 않았다...

 

 

강의 실습 코드와 프로젝트 코드를 일일이 비교해가던 중

문제 원인을 찾을 수 있었는데....


문제 발생 원인: responseDTO의  @Getter 어노테이션 누락

문제 코드

@AllArgsConstructor
public class TodoResponseDTO {
    private Long id;
    private String title;
    private String contents;
    private String author;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    ...
}

 

수정된 코드

@Getter		// 추가
@AllArgsConstructor
public class TodoResponseDTO {
    private Long id;
    private String title;
    private String contents;
    private String author;
    private LocalDateTime createdAt;
    private LocalDateTime updatedAt;

    ...
}

 

결과도 잘 나온다.

 

 

 

사실 조금 어이가 없었다.

원인을 못찾아서 시간을 많이 허비했는데,,,

저 @Getter 한줄이 문제 였다니...

 

내부적 원인

Spring에서 JSON으로 변환(Jackson 직렬화)을 할 때는 반드시 getter 메서드가 있어야 필드 값을 읽을 수 있다

고 한다...

 

@Getter를 안 붙이면 필드에 접근할 방법이 없어서 Jackson이 비어 있는 응답을 만들려고 하다가 결국 “적절한 표현이 없다”고 HttpMediaTypeNotAcceptableException 예외를 던진다 고.....

 

그게 406 응답이었던 것이다.

 

그래도 이번 삽질 덕에,, 앞으로 @Getter 를 빼먹는 일은 없을 것 같다....😂😂😂