반응형
자바 직렬화란?
- 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부 시스템에서 사용할 수 있도록 바이트 형태로 변환하는 기술
- 바이트로 변환된 데이터를 다시 객체로 변환하는 역직렬화를 아울러서 얘기하기도 한다.
스프링에서 자바 직렬화(Serializable) 사용법
기본 모델에 java.io.Serializable 인터페이스를 implements하면 기본적으로 직렬화 할 수 있다.
- 기본 자료형(int, char, string, long, ....등)이어야 한다.
- 생성자나 메소드는 직렬화 대상에 속하지 않는다.
class Report (
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
@Column(columnDefinition = "VARCHAR(30)")
val reportType: String,
@Column(columnDefinition = "INTEGER(10)")
val reportUserId: Long,
@Column(columnDefinition = "INTEGER(10)")
val reportedUserId: Long,
@Column(columnDefinition = "VARCHAR(100)")
val reason: String
): Serializable
Deserialize(역직렬화)
바이트로 변환된 데이터를 다시 객체로 변환하는 것을 말한다. 요약하면 Data -> Object
자바의 직렬화는 문제를 가지고 있는데, Serialize한 데이터를 DeSerialize할 때, Serialize와 Deserialize하는 시스템이 다른 경우 에러가 발생하게 된다.
JVM은 직렬화와 역직렬화를 하는 시점에 클래스에 대한 버전 번호(serialVersionUID)를 부여 한다. 만약 그 시점에서 클래스의 정의가 바뀌어 있다면 새 번호를 할당한다. 따라서 직렬화할 때의 버전 번호와 역직렬화 시 버전 번호가 다를 시, 역직렬화가 불가능할 수도 있으며 이런 문제를 해결하기 위해 serialVersionUID를 사용한다.
serialVersionUID를 지정함으로써 직렬화 된 데이터의 버전 관리를 용이하게 할 수 있다.
지정하지 않을 경우 랜덤한 번호를 부여받게 되어 지정하지 않아도 되지만, 동일한 클래스에 대해서 컴파일러마다 다르게 부여될 수 있기 때문에 다른 컴파일러로 통신하는 경우 id를 수동관리 해야 한다.
class Report (
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
val id: Long? = null,
@Column(columnDefinition = "VARCHAR(30)")
val reportType: String,
@Column(columnDefinition = "INTEGER(10)")
val reportUserId: Long,
@Column(columnDefinition = "INTEGER(10)")
val reportedUserId: Long,
@Column(columnDefinition = "VARCHAR(100)")
val reason: String
): Serializable {
companion object {
const val serialVersionUID = 1L
}
}
반응형
'Back-end' 카테고리의 다른 글
서킷 브레이커[CirCuit Breaker] 패턴이란? (0) | 2023.04.09 |
---|---|
[SpringBoot] 프로젝트 리소스 파일 가져오기 (0) | 2022.11.29 |
HTTP Method & Patch 등장에 따른 Dispatcher Servlet의 변화 (0) | 2022.08.02 |
[Kotlin] Kotlin + Springboot 에서의 validation (0) | 2022.04.27 |
[Kotlin] 코틀린 타입 시스템(Type System) - ( ?/!!/.?/as?/let함수/lateinit) (0) | 2022.03.24 |