역직렬화 문제인가??
얼마 전에 처음보는 에러가 발생했다!!
그리고 이번 에러는 구글에서 검색하면 사람들이 꽤나 많이 겪었음에도 불구하고 이에 대해서 정리해놓은 게시물 또는 답변을 찾아보지 못해서 다른사람들에게 도움이 되고자하는 마음으로 남겨본당 :D
java.io.StreamCorruptedException: invalid stream header:
30313031 at java.base/java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:958) ~[na:na]
근데 분명히 hibernat나 querydsl 설정도 잘못된게 없었던 것이닷...
그래서 가장 최근에 나랑 비슷한 문제를 겪었던 빅터한테 질문했는데 의존성 두개만 추가하면 해결됐다고 했다!!!Jackson
라이브러리를 추가하면 된다고 했는데, 아뿔싸 아무 해결도 되지 않았다... 그런데 자꾸 나는 에러 메시지가 일반적으로 역직렬화 과정에서 발생했을 때 나오는 메시지였다.
하하.. 구글링 해도 계속계속 정확한 답이 나오지 않아서 결국에 어디가 문제인지 queryDsl 쿼리를 실행하면 계속 에러가 뜨고, 왜 그런건지 도무지 이해가 되지 않아 멘붕이 왔다 @.@
심지어 아는 고수 언니한테 여쭤보니 DTO용 클래스(너무 Entity하나에 많은 속성들이 들어가있다보니 AggregateDTO
를 두어 매번 가져올 때 용이하게 할 수 있다!)로 fetch()
하면서 문제가 생긴거일수도 있다고 그러셨는데,
data class OrderAggregateDAO @QueryProjection constructor(
...
)
{
...
}
아무리 봐도 내가 아는 한, 그리고 경험한 바에 따라서 절대 문제가 되지 않을 것이라고 판단했다.
그래서 프로퍼티 한 개씩 다 찍어봤는데 뭔가 한 부분이 이상하게 조금 거슬렸다.
프로퍼티중에 하나가 자료형이 외부 의존성을 활용한 자료형 Geometry
였다.
코틀린/자바에서 직접적으로 제공해주는 자료형이 아니기 때문에 어쩌면, hibernate로 역직렬화하는 과정 혹은 querydsl에서 공간을 다루는 자료형에 대해서 공간 데이터타입을 지원해주는 의존성을 추가하지 않았기 때문에 발생하는 문제일 수도 있겠다는 생각을 했다.
아래의 의존성을 추가해주니 해결이 되었다!
implementation("com.querydsl:querydsl-spatial:5.0.0")
implementation("org.hibernate:hibernate-spatial:6.2.5.Final")
뭔가 그래서 조금전까지 역직렬화문제는 아닐까 생각을 하고 있었는데 뭔가 생각해보니... 아닌 것 같기도 해서 조금 더 알아봤다.
🤨 과연 역직렬화 문제였을까?
java.io.StreamCorruptedException: invalid stream header
의 경우에서 이야기해보자.
먼저 역직렬화 문제란 아래와 같다.
- 역직렬화(Deserialization)는 직렬화된 데이터(바이트 시퀀스)를 다시 원래의 객체로 변환하는 과정이다.
Java
에서ObjectInputStream
을 사용하여 이 과정을 수행할 때, 스트림의 시작 부분에 올바른 헤더 정보가 포함되어 있어야 한다. 이 헤더 정보가 누락되거나 잘못되었을 경우,StreamCorruptedException
이 발생한다.
Hibernate와 QueryDSL의 관련성Hibernate
와 QueryDSL
모두 Java
어플리케이션에서 데이터베이스 작업을 추상화하는 데 사용되는 라이브러리다. Hibernate
는 ORM(Object-Relational Mapping)
프레임워크로, Java
객체와 데이터베이스 테이블 간의 매핑을 처리한다. QueryDSL
은 타입 안전한 쿼리를 위한 프레임워크로, 복잡한 쿼리를 구성할 때 코드 기반의 접근 방식을 제공한다.
Hibernate
문제:Hibernate
와 관련된 문제는 주로 데이터베이스 매핑, 엔티티 관리, 트랜잭션 처리 등에 관련된다. 공간 데이터 처리와 관련된 의존성이 누락된 경우,Hibernate
는 공간 데이터 타입을 올바르게 처리할 수 없다.QueryDSL
문제:QueryDSL
관련 문제는 주로 쿼리 구성, 타입 안전성, 쿼리 최적화 등에 관련된다. 공간 데이터를 쿼리하는 기능이 필요할 때,QueryDSL Spatial
의존성이 필요하다.
즉, 이번 문제는 역직렬화 문제라고 하기는 조금 애매하다. Hibernate
나 QueryDS
L 자체의 역직렬화 이슈보다는 공간 데이터 처리 기능을 사용하기 위해 필요한 의존성이 누락되어 있었기 때문이다. 역직렬화 문제는 직렬화된 데이터를 객체로 변환하는 과정에서 발생하는 오류를 말한다. 이 경우, 공간 데이터 처리와 관련된 클래스나 메서드를 사용하기 위한 환경이 제대로 구성되지 않아 발생한 문제를 해결하기 위해 필요한 의존성을 추가함으로써 해결되었다.
따라서 역직렬화 문제라고 부르기엔 민망쓰..하다!!
'Backend > Trouble Shooting' 카테고리의 다른 글
Java + Kotlin 프로젝트 QueryDSL QFile을 찾지 못하는 이슈(소스 세트 구성 오류) (1) | 2024.03.29 |
---|---|
동시성 문제를 RedisTemplate 활용하여 해결하기 (0) | 2024.03.18 |