문제 1

POST method로 데이터를 서버에 전달했을 때, 406 Not Acceptable을 반환하는 문제 발생

 


원인 분석

error 메시지가 Not Acceptable로 출력돼서 클라이언트의 요청 헤더가 json을 허용하지 않는지 먼저 확인했다.

Accept가 */*로 설정되어 있어서 어떤 타입의 서버 응답도 받아들일 수 있기 때문에, 요청 헤더의 문제는 아니었다.

 

그리고 같은 프로젝트에서 GET method로 값을 반환받을 때는 제대로 동작하기 때문에, 값을 저장하는 과정이 문제가 아니라 저장된 값을 가져오는 과정에서 문제가 있는 것임을 알 수 있다.

 

서버가 데이터를 반환할 때는 ResponseDto에 데이터를 캡슐화하여 Controller로 전달되고, 

해당 프로젝트는 JSON 타입으로 응답을 클라이언트에 반환하도록 설정되어 있기 때문에(@RestController)

MappingJackson2HttpMessageConverter에 의해 데이터를 JSON으로 변환한 뒤 클라이언트로 전달한다.

 

2025.03.20 - [언어, 프레임워크/Spring] - 요청(Request) 데이터 전달 방식

 

요청(Request) 데이터 전달 방식

기본적인 데이터 전달 방식1. GET + Query Parameter(=Query String)일부 서버에서 GET 방식의 데이터 요청은 Body값을 처리하지 않기 때문에 쿼리 파라미터로 전달해야 한다.response.getWriter().write() : 응답의 Bo

go-getter1kim.tistory.com

 

 

아래 코드를 보면 각 필드는 private로 캡슐화되어 있어서, getter가 없으면 Converter도 데이터에 접근하지 못한다.

즉, 이 문제는 접근할 수 없는 데이터를 JSON으로 변환해서 전달하려는 시도로 발생한 것이었다.

package com.example.standardproject1.dto;

import com.example.standardproject1.entity.Member;

public class MemberResponseDto {
    private String name;  // 이름
    private int age;   // 나이

    public MemberResponseDto(Member member){
        this.name = member.getName();
        this.age = member.getAge();
    }
}

 


해결

package com.example.standardproject1.dto;

import com.example.standardproject1.entity.Member;
import lombok.Getter;

@Getter
public class MemberResponseDto {
    private String name;  // 이름
    private int age;   // 나이

    public MemberResponseDto(Member member){
        this.name = member.getName();
        this.age = member.getAge();
    }
}

@Getter를 추가하고 다시 요청을 보내면 응답이 의도대로 돌아오는 것을 볼 수 있다!

 


문제 2 - 기존 코드

클라이언트로부터 전달받은 문자열의 길이가 2 미만이면 유효성을 검증하는 @Valid, @Size(min = 2) 어노테이션으로 에러 메시지를 클라이언트에 전달했다.

에러 메시지가 제대로 출력되긴 하지만, 너무 지저분하게 알려준다는 단점이 있다.

 


원인, 해결

throw new Exception("에러 원인은 이거야!") 처럼 직접 에러를 던지는 상황이었다면 에러 메시지를 지정할 수 있지만, 이 유효성 검증 어노테이션은 jakarta 라이브러리에서 내부적으로 에러 메시지를 가져오기 때문에 따로 에러 메시지를 설정하는 방법을 찾아보았다.

 

2025.03.20 - [언어, 프레임워크/Spring] - Spring Boot의 예외처리 (유효성 검사)

 

Spring Boot의 예외처리 (유효성 검사)

스프링 부트의 예외처리 방법1. try-catch2. @ExceptionHandler, @ControllerAdvice3. @Valid, @Validated4. 유용한 유효성 검증 어노테이션 1. try-with-resource (개선된 try-catch)// 기존 try-catchpublic class TryFinallyExample { publ

go-getter1kim.tistory.com

 

구글링을 통해 @Pattern을 주워 듣고 시도를 해보았으나 에러 메시지가 적용되지 않았고,

다시 찾아보니 유효성 검증 어노테이션 안에 message 속성값을 넣어주면 메시지를 바꿀 수 있었다.