Java에서 Serializable은 마커 인터페이스(Marker Interface)로, 해당 객체가 직렬화(Serialization)될 수 있음을 표시. 직렬화란 객체를 바이트 스트림 형태로 변환하여 파일로 저장하거나 네트워크를 통해 전송할 수 있도록 하는 과정이다. 반대로 바이트 스트림을 다시 객체로 복원하는 과정을 역직렬화(Deserialization)라고 한다.
Serializable의 필요성
- 객체를 파일로 저장해야 할 때
- 네트워크를 통해 객체를 전송할 때
- 웹 애플리케이션에서 HttpSession에 VO 객체를 저장할 때
- 분산 환경에서 세션 클러스터링 시 데이터 유지가 필요할 때
예제 코드
DefaultVO
클래스가 Serializable을 구현한 뒤, 객체를 파일로 직렬화하고 다시 역직렬화하는 예제.
import java.io.*;
public class DefaultVO implements Serializable {
private static final long serialVersionUID = 1L; // 버전 관리용 ID
private String name;
private int age;
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getAge() { return age; }
public void setAge(int age) { this.age = age; }
public static void main(String[] args) {
DefaultVO vo = new DefaultVO();
vo.setName("홍길동");
vo.setAge(30);
// 직렬화: 객체 → 파일
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("vo.dat"))) {
oos.writeObject(vo);
System.out.println("객체 직렬화 성공!");
} catch (IOException e) {
e.printStackTrace();
}
// 역직렬화: 파일 → 객체
try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("vo.dat"))) {
DefaultVO newVo = (DefaultVO) ois.readObject();
System.out.println("역직렬화된 객체: " + newVo.getName() + ", " + newVo.getAge());
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
}
}
출력 결과
객체 직렬화 성공!
역직렬화된 객체: 홍길동, 30
serialVersionUID의 의미
serialVersionUID
는 직렬화된 객체를 역직렬화할 때 클래스의 버전이 일치하는지 검사하기 위한 고유 식별자. 클래스 구조가 변경되면 UID 값도 바뀌어야 하며, 명시적으로 선언하지 않으면 Java가 자동으로 생성한다. 그러나 자동 생성 시 클래스 변경에 따라 불일치 문제가 발생할 수 있으므로, 보통 개발자가 직접 선언하는 것이 안전하다.
정리
Serializable은 Java에서 객체를 외부 저장소나 네트워크로 안전하게 전달할 수 있도록 해주는 핵심 인터페이스다. 특히 VO(Value Object) 클래스에서는 세션 유지와 데이터 전송 호환성을 위해 Serializable을 구현하는 것이 관례이긴하다.
'공부방 > Java' 카테고리의 다른 글
Java IllegalArgumentException (2) | 2025.07.31 |
---|---|
Java System.out과 Logger 차이점 (5) | 2025.07.30 |
<form:hidden> 사용방법 (0) | 2025.05.08 |
XML 쿼리에서 비교연산자 에러 해결( <![CDATA[ > ]]> ) (0) | 2024.05.22 |
Autowired 어노테이션 (0) | 2022.11.15 |