[Jackson] JSON 역직렬화 조건

황정준·2024년 4월 6일
0

연말과 연초에 회사일로 너무 바빠서 포스팅을 못하고 있었다.
앞으로는 꾸준히 다시 작성할 예정

이번 포스팅은 회사에서 새로 맡은 프로젝트에서 발생한 이슈이다.

라이브러리 추가 후 발생한 문제

새로 맡은 Spring boot 프로젝트에 사내 라이브러리를 추가하니 로그인이 안되는 문제가 발생했다.
로그인과 전혀 상관없는 라이브러리였는데 갑자기 로그인이 안되니 당혹스러웠다.

원인 분석

로그를 살펴보니 로그인할 때 사용하는 RequestDTO에서 JSON 역직렬화가 실패해서 발생하고 있었고
해당 DTO클래스는 아래의 예시코드처럼 되어 있었다.

public class LoginRequestDTO {
	private String userId;
	private String password;

	public LoginRequestDTO(String userId, String password) {
		super();
		this.userId = userId;
		this.password = password;
	}
	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

그냥봤을 땐 큰 문제가 없어보이지만 Spring에서 사용하는 JSON 직렬화 라이브러리인
Jackson의 동작원리를 알고 있다면 원인을 쉽게 찾을 수 있다.

Jackson에서 역직렬화에 필요한 조건

Jackson은 자바 생태계에서 사용하는 JSON 직렬화/역직렬화 라이브러리이다.
자세한 설명은 생략하고
Jackson에서 역직렬화를 하려면 아래의 조건이 필요하다.

  • 기본생성자
  • @JsonCreator가 붙은 생성자나 팩토리메소드

해당 내용을 알고 다시 LoginRequestDTO를 보면
기본 생성자도 없고 @JsonCreator가 붙은 생성자나 팩토리메소드도 없는 것을 볼 수 있다.
그렇기 때문에 Jackson에서 역직렬화에 실패하는 것이었는데
여기서 의문점이 있다.

사내 라이브러리 적용전에도 Spring boot에 내장된 Jackson 라이브러리를 사용중이었는데
그때는 정상동작을 하고 있었다.

Jackson 버전 업그레이드로 발생한 사이드이펙트

Chat-GPT4에게 확인한 내용으로 추측하자면
Jackson버전이 높아지고 역직렬화 조건이 까다로워지면서 발생한 사이드이펙트였다.
Jackson에서 역직렬화에 관련된 코드는 Jackson-databind 패키지에서 확인할 수 있는데
기존에 사용중이던 Jackson이 2.2였고 사내 라이브러리를 추가하면서 변경된 버전이 2.9였다.
그 사이에 역직렬화에 사용할 수 있는 생성자 조건이 엄격해진 것이었다.

해결

신규 버전의 Jackson에서 동작하게 만들기 위해 역직렬화에 필요한 조건을 맞춰주었다.

@JsonCreator를 붙여주거나 기본생성자를 만들어주면 되는데
나는 아래와 같이 기존에 있던 매개변수 있는 생성자를 지워서
자동으로 기본 생성자가 생성되도록 하여 해결했다.

public class LoginRequestDTO {
	private String userId;
	private String password;

	public String getUserId() {
		return userId;
	}
	public void setUserId(String userId) {
		this.userId = userId;
	}
	public String getPassword() {
		return password;
	}
	public void setPassword(String password) {
		this.password = password;
	}
}

자주 사용하는 라이브러리는 동작원리에 대해 잘알고 있으면
문제해결에 큰 도움이 되는 것 같다.
열심히 정진해야겠다.

profile
호기심 많은 주니어 백엔드 개발자입니다.

0개의 댓글