연말과 연초에 회사일로 너무 바빠서 포스팅을 못하고 있었다.
앞으로는 꾸준히 다시 작성할 예정
이번 포스팅은 회사에서 새로 맡은 프로젝트에서 발생한 이슈이다.
새로 맡은 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은 자바 생태계에서 사용하는 JSON 직렬화/역직렬화 라이브러리이다.
자세한 설명은 생략하고
Jackson에서 역직렬화를 하려면 아래의 조건이 필요하다.
해당 내용을 알고 다시 LoginRequestDTO를 보면
기본 생성자도 없고 @JsonCreator가 붙은 생성자나 팩토리메소드도 없는 것을 볼 수 있다.
그렇기 때문에 Jackson에서 역직렬화에 실패하는 것이었는데
여기서 의문점이 있다.
사내 라이브러리 적용전에도 Spring boot에 내장된 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;
}
}
자주 사용하는 라이브러리는 동작원리에 대해 잘알고 있으면
문제해결에 큰 도움이 되는 것 같다.
열심히 정진해야겠다.