문제 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 속성값을 넣어주면 메시지를 바꿀 수 있었다.
'트러블 슈팅' 카테고리의 다른 글
[Java/Spring] Filter 내부의 예외처리 (0) | 2025.04.03 |
---|---|
[Java/Spring] 분리된 테이블의 데이터 반환 트러블 슈팅 (+레이어 리팩토링) (0) | 2025.03.25 |
[Java] 키오스크 프로그램에 스트림 적용 중 발생한 이슈 (0) | 2025.03.13 |
[Java] 리스트에 담긴 데이터 중복 출력 이슈 (1) | 2025.03.12 |
[Java] BufferedWriter 출력 안 됨 이슈 (1) | 2025.03.11 |