자바 직렬화(Serializable)
반응형

자바 직렬화란?

  • 자바 시스템 내부에서 사용되는 객체 또는 데이터를 외부 시스템에서 사용할 수 있도록 바이트 형태로 변환하는 기술
  • 바이트로 변환된 데이터를 다시 객체로 변환하는 역직렬화를 아울러서 얘기하기도 한다.

 

스프링에서 자바 직렬화(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
    }
}

 

반응형