기술과 산업/언어 및 프레임워크

Java JSON 처리 실전 시리즈 – Jackson 트러블슈팅 가이드: 흔한 에러 7가지와 해결 방법

B컷개발자 2025. 5. 19. 11:04
728x90

Spring Boot + Jackson 환경에서 JSON 처리 시 자주 발생하는 오류와 그 해결법을 정리합니다. JsonParseException, UnrecognizedPropertyException, 날짜 포맷, Enum 처리 오류 등 실전 사례 중심의 트러블슈팅 가이드입니다.


Jackson은 Java JSON 처리에 매우 강력한 도구이지만, 실무에서는 예상치 못한 오류가 종종 발생합니다. 특히 외부 API 요청, 클라이언트-서버 간 형식 불일치, DTO 설계 미흡 등이 원인이 되는 경우가 많습니다.

이 글에서는 Spring Boot 환경에서 발생할 수 있는 대표적인 JSON 처리 오류 7가지와 그 해결 전략을 명확히 정리해보겠습니다.


1. UnrecognizedPropertyException – 알 수 없는 필드 오류

에러 메시지

UnrecognizedPropertyException: Unrecognized field "unknownField"

원인

  • JSON에 포함된 필드가 Java DTO에 정의되어 있지 않음
  • Jackson은 기본적으로 DTO에 없는 필드를 허용하지 않음

해결 방법

  • 전역 설정으로 무시 처리
spring:
  jackson:
    deserialization:
      fail-on-unknown-properties: false
  • 또는 클래스에 설정
@JsonIgnoreProperties(ignoreUnknown = true)
public class User { ... }

2. JsonParseException – 비표준 JSON 문법 오류

에러 예시

{ name: '홍길동' }  // 따옴표 없음, 단일 따옴표 사용
JsonParseException: Unexpected character ('n' (code 110))

해결 방법

ObjectMapper mapper = new ObjectMapper();
mapper.configure(JsonParser.Feature.ALLOW_UNQUOTED_FIELD_NAMES, true);
mapper.configure(JsonParser.Feature.ALLOW_SINGLE_QUOTES, true);

보안상 위험할 수 있으므로 외부 요청에는 사용 금지.


3. 날짜 포맷 오류 – InvalidFormatException

예시

{ "createdAt": "2024-10-01 14:00:00" }
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime createdAt;

→ 포맷 불일치로 역직렬화 실패

해결 방법

  • JSON 포맷을 @JsonFormat과 일치시킴
  • 또는 application.yml에서 전역 설정
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss

4. Enum 역직렬화 오류

{ "role": "admin" }
public enum Role { ADMIN, USER }
InvalidFormatException: Cannot deserialize value of type `Role`

해결 방법

  • 대소문자 무시 설정
mapper.configure(MapperFeature.ACCEPT_CASE_INSENSITIVE_ENUMS, true);
  • 또는 커스텀 Deserializer 구현

5. Optional 타입 역직렬화 오류

private Optional<String> email;

문제

  • jackson-datatype-jdk8 모듈이 누락되면 역직렬화 실패

해결 방법

<dependency>
  <groupId>com.fasterxml.jackson.datatype</groupId>
  <artifactId>jackson-datatype-jdk8</artifactId>
</dependency>
mapper.registerModule(new Jdk8Module());

6. HttpMessageNotReadableException – 컨트롤러 파싱 실패

@PostMapping("/login")
public void login(@RequestBody LoginRequest req)

→ JSON 구조 불일치, 필드명 오류, 중괄호 누락 등 다양한 이유로 발생

해결 방법

  • DTO 필드명을 JSON 구조에 맞게 확인
  • 필수 필드 누락 여부 검토
  • JSON 파싱 오류 상세 로그 확인

대부분은 JsonMappingException이나 JsonParseException이 내부 원인입니다.


7. JSON 필드 노출 불일치 – snake_case ↔ camelCase

문제

JSON에는 user_name, DTO는 userName → 매핑 실패

해결 방법

  • 전역 설정:
spring:
  jackson:
    property-naming-strategy: SNAKE_CASE
  • 클래스 단위 설정:
@JsonNaming(PropertyNamingStrategies.SnakeCaseStrategy.class)
public class User { ... }

실무 팁 요약

에러 유형 해결 키워드

알 수 없는 필드 @JsonIgnoreProperties, FAIL_ON_UNKNOWN_PROPERTIES
잘못된 JSON 문법 ALLOW_UNQUOTED_FIELD_NAMES, ALLOW_SINGLE_QUOTES
날짜 포맷 오류 @JsonFormat, application.yml 설정
Enum 오류 ACCEPT_CASE_INSENSITIVE_ENUMS, Custom Deserializer
Optional 오류 jackson-datatype-jdk8
역직렬화 실패 JSON 구조 검토 + DTO 필드 검증
네이밍 전략 불일치 property-naming-strategy: SNAKE_CASE

 

728x90