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 에러가 발생할 수 있습니다.
이 문제를 해결하기 위한 몇 가지 방법이 있습니다.
@Getter
어노테이션 사용Lombok의 @Getter
어노테이션을 사용하면 자동으로 getter 메서드가 생성됩니다. 위 예제에서는 이미 @Getter
어노테이션을 사용하고 있기 때문에 문제가 없습니다.
@JsonProperty
어노테이션 사용DTO 클래스의 필드에 @JsonProperty
어노테이션을 추가하면 Jackson이 getter 메서드 없이도 해당 필드를 JSON 응답에 포함시킬 수 있습니다.
@Getter
@Builder
public class CustomerResponse {
@JsonProperty
private Long id;
@JsonProperty
private String email;
// 나머지 필드도 @JsonProperty 어노테이션 추가
}
@Value
클래스 사용Lombok의 @Value
어노테이션을 사용하면 getter 메서드가 자동으로 생성됩니다.
@Value
@Builder
public class CustomerResponse {
Long id;
String email;
String name;
String phoneNumber;
LocalDateTime createdDate;
LocalDateTime updatedDate;
}
@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 에러를 해결할 수 있습니다. 또한, 필요에 따라 다른 라이브러리나 설정을 사용하여 에러를 해결할 수도 있습니다.