개발스토리
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을 붙여서 해결했다.
기본 자바 라이브러리만 사용해도 직렬화와 역직렬화를 할 수 있지만, 그에 따른 장단점이 존재하는 듯 보였다.
+ 더 알아보다가 직렬화의 필요성에 관련한 블로그 남긴다
'삽질 기록' 카테고리의 다른 글
단 건 조회 시 데이터가 없다면..?부터 시작된 이야기 (1) | 2021.12.10 |
---|---|
java.lang.illegalargumentexception at least one jpa metamodel must be present (2) | 2021.09.09 |
could not autowired no beans of... (0) | 2021.08.17 |