개발스토리

DefaultSerializer requires a Serializable payload but received an object of type [...] 본문

삽질 기록

DefaultSerializer requires a Serializable payload but received an object of type [...]

무루뭉 2021. 9. 6. 12:27

스프링 시큐리티를 써서 소셜 로그인을 적용하다가 만난 에러이다...

우선 에러 로그를 그대로 번역하자면 아래와 같다.

"DefaultSerializer에는 직렬화 가능한 페이로드가 필요하지만 [...] 유형의 개체를 수신했습니다"

우선 직렬화 가능한 페이로드가 필요한 것 같다.

[...]에 내가 사용한 dto 폴더를 나타내 주는데 그 dto 파일에서 직렬화를 적용시켜주어야 한다는 의미 같다.

 

그래서 직렬화에 대해서 또 어떻게 적용할 지 알아보았다.


 

직렬화란?

■ 자바에서 직렬화란 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부의 자바 시스템에서도 사용할 수 있도록 바이트 형태로 데이터 변환하는 기술과 바이트로 변환된 데이터를 다시 객체로 변환하는 기술(역직렬화)를 아우른다.

■ 시스템적으로는, JVM의 메모리에 상주되어 있는 객체 데이터를 바이트 형태로 변환하는 기술과 직렬화된 바이트 형태의 데이터를 객체로 변환해서 JVM으로 상주시키는 형태를 이야기 한다.

 

어떻게 사용할까?

 

java.io.Serializable 인터페이스를 상속받고, java.io.ObjectOutputStream 객체를 이용한다.

 

왜 사용할까?

 

- 직접 데이터를 문자열 형태로 확인 가능한 직렬화 방법

- api나 데이터 변환 시 많이 사용

- 다량의 데이터 직렬화시 csv, json 등으로 많이 사용한다. csv, json이 자바 직렬화는 아니다.

 

참조 블로그 : https://velog.io/@redcarrot01/TroubleShooting-springboot-DefaultSerializer-requires-a-Serializable-payload, https://techblog.woowahan.com/2551/

 


 

이해를 편하게 하기 위해 User 클래스가 있다고 보자.

우선 User 클래스가 엔티티일 경우 User 클래스에 직렬화 코드를 넣으면 안된다.

 

이유가 뭘까?

- 엔티티 클래스에는 언제 다른 엔티티와 관계가 형성될 지 모른다.

예를 들어, @ManyToMany 등 자식 엔티티를 가지고 있다고 보면, 직렬화 대상에 자식들까지 포함되어야 하니 성능 이슈, 부수 효과가 발생할 확률이 높다.

 

그렇다면 어떻게 할까?

- 직렬화 기능을 가지 Dto 하나를 추가로 만드는 것이 운영 및 유지보수하는 데 편하다.

 


 

위 정보들을 토대로

user 클래스(엔티티)는 냅두고 userDto(예시) 파일을 하나 생성해서 클래스에 implements Serializable을 붙여서 해결했다. 

기본 자바 라이브러리만 사용해도 직렬화와 역직렬화를 할 수 있지만, 그에 따른 장단점이 존재하는 듯 보였다. 

 

 

+ 더 알아보다가 직렬화의 필요성에 관련한 블로그 남긴다

https://hub1234.tistory.com/26

Comments