SpringBoot에서 DTO를 JSON으로 변환할 때 발생하는 406 Not Acceptable 에러 해결 방법

청포도봉봉이·2024년 4월 5일
1

트러블 슈팅

목록 보기
2/2
post-thumbnail

SpringBoot 애플리케이션에서 DTO(Data Transfer Object)를 JSON으로 변환할 때, 406 Not Acceptable 에러가 발생할 수 있습니다. 이 에러는 Jackson 라이브러리가 DTO 클래스의 getter 메서드를 찾지 못해 발생합니다. Jackson은 객체를 JSON으로 serialize할 때 getter 메서드를 사용하여 속성 값을 읽어옵니다.

예를 들어, 다음과 같은 CustomerResponse DTO 클래스가 있다고 가정해 봅시다.

@Getter
@Builder
public class CustomerResponse {
    private Long id;
    private String email;
    private String name;
    private String phoneNumber;
    private LocalDateTime createdDate;
    private LocalDateTime updatedDate;

    public static CustomerResponse from(Customer customer) {
        return CustomerResponse.builder()
                .id(customer.getId())
                .email(customer.getEmail())
                .name(customer.getName())
                .phoneNumber(customer.getPhoneNumber())
                .createdDate(customer.getCreatedDate())
                .updatedDate(customer.getUpdatedDate())
                .build();
    }
}

이 DTO 클래스를 JSON으로 변환하려고 할 때, 406 Not Acceptable 에러가 발생할 수 있습니다.

해결방법

이 문제를 해결하기 위한 몇 가지 방법이 있습니다.

  1. Lombok의 @Getter 어노테이션 사용

Lombok의 @Getter 어노테이션을 사용하면 자동으로 getter 메서드가 생성됩니다. 위 예제에서는 이미 @Getter 어노테이션을 사용하고 있기 때문에 문제가 없습니다.

  1. @JsonProperty 어노테이션 사용

DTO 클래스의 필드에 @JsonProperty 어노테이션을 추가하면 Jackson이 getter 메서드 없이도 해당 필드를 JSON 응답에 포함시킬 수 있습니다.

@Getter
@Builder
public class CustomerResponse {
    @JsonProperty
    private Long id;
    @JsonProperty
    private String email;
    // 나머지 필드도 @JsonProperty 어노테이션 추가
}
  1. @Value 클래스 사용

Lombok의 @Value 어노테이션을 사용하면 getter 메서드가 자동으로 생성됩니다.

@Value
@Builder
public class CustomerResponse {
    Long id;
    String email;
    String name;
    String phoneNumber;
    LocalDateTime createdDate;
    LocalDateTime updatedDate;
}
  1. @JsonGetter 어노테이션 사용

Jackson에서 제공하는 @JsonGetter 어노테이션을 사용하여 커스텀 getter 메서드를 정의할 수 있습니다.

public class CustomerResponse {
    private Long id;
    private String email;
    // 생략

    @JsonGetter("id")
    public Long getId() {
        return id;
    }

    @JsonGetter("email")
    public String getEmail() {
        return email;
    }

    // 나머지 필드에 대한 @JsonGetter 추가
}

위와 같은 방법을 사용하면 406 Not Acceptable 에러를 해결할 수 있습니다. 또한, 필요에 따라 다른 라이브러리나 설정을 사용하여 에러를 해결할 수도 있습니다.

profile
서버 백엔드 개발자

0개의 댓글