프로젝트를 확인하다보면 DTO, VO, Domain 객체에 이게 왜 사용되는지에 대해 궁금해서 직접 공부한 내용을 기재하려고 한다.
객체에 아래와 같은 형태로 되어 있는 모습을 많이 볼 수 있다.
public class User {
private static final long serialVersionUID = 1L;
필드...
}
또는
public class User implements Serializable {
}
serialization 정의
- 직렬화(Serialization): 객체를 바이트 스트림으로 변환해 파일 또는 네트워크로 전송할 수 있게 합니다.
- 역직렬화(Deserialization): 바이트 스트림을 원래의 객체로 복원합니다.
직렬화 하는 이유
1) 객체의 영속성(Persistence) 보장
- 프로그램이 종료되더라도 객체의 상태를 파일이나 데이터베이스에 저장해둘 수 있습니다.
- 예를 들어, 사용자 정보나 설정 값을 객체 형태로 저장해두고, 프로그램이 다시 시작될 때 직렬화된 데이터를 불러와 상태를 복원할 수 있습니다.
2) 네트워크 전송
- 분산 시스템이나 네트워크 통신에서 객체를 바이트 스트림으로 변환해 전송할 수 있습니다.
- 예를 들어, **RMI(Remote Method Invocation)**나 REST API를 통해 원격 시스템으로 객체를 보내야 할 때, 객체를 직렬화해 전송합니다.
3) 세션 유지 (웹 애플리케이션)
- 웹 애플리케이션에서는 사용자 세션 정보를 직렬화하여 파일 시스템이나 메모리 저장소에 저장합니다.
- 서버를 재시작해도 직렬화된 세션 객체를 역직렬화해 세션을 유지할 수 있습니다.
4) 캐시 관리
- 자주 사용하는 객체를 직렬화하여 캐시에 저장하고, 필요할 때 빠르게 역직렬화해 사용할 수 있습니다.
왜 사용할까 ?
결론부터 말하자면
1) 클래스의 고유성을 유지
2) 버전 관리를 통해 직렬화된 객체와 클래스 간의 호환성 보장
위 두 개 이유 때문에 사용 한다.
클래스의 고유성 ?
클래스의 고유성은 내부에 필드, 메소드가 변경 되어도 같은 클래스라는 걸 알 수 있습니다.
난 그런거 안해도 잘 되던데 ? 꼭 해야함 ?
상속 또는 정적 불변 변수(static final)로 명시를 안해도 JVM에서 자동 생성 됩니다.
JVM에서 자동생성시 고유성을 보장 받지 못해 클래스 내부의 필드, 메소드 값이 변경되면 다른 값들이 만들어지는데 그 결과 기존에 직렬화된 객체를 역직렬화할 때 InvalidClassException 이 발생할 수 있습니다.
근데 모든 객체에 private static final long serialVersionUID = 1L; 똑같이 설정되어 있던데 중복되면 문제되는거 아님 ?
전혀 문제 없습니다!
직렬화 과정시 JVM은 클래스 이름과 serialVersionUID 저장하기 때문에 문제 없습니다.
반대로 역직렬화 과정에서도 클래스 이름과 serialVersionUID를 확인하기 때문에 똑같은 값으로 설정해도 문제 없습니다.
하지만 권장사항은 각 클래스마다 고유한 serialVersionUID를 부여하는게 좋습니다.
private static final long serialVersionUID = 7818375828146090155L;
근데 서버 재시작 하면 serialVersionUID 의 값은 변경 되는거 아니야 ?
private static final long serialVersionUID = 7818375828146090155L; // 명시됨
위 처럼 저렇게 명시를 안해둔 경우에는 JVM이 자동으로 만들기 때문에 변경될 수 있습니다.
하지만 값을 명시했기 때문에 값은 그대로 입니다.
*짤막한 정보! 정적 변수에 값이 결정되는 시점
static | 클래스가 메모리에 로드될 때 |
static final (상수) | 컴파일 시점 (단순한 상수의 경우) |
static final (복잡한 값) | 클래스 로딩 시점 (복잡한 연산의 경우) |
반응형
'JAVA' 카테고리의 다른 글
자바 property명 주의 사항!(dto, domain, entity) (0) | 2023.10.19 |
---|---|
File (0) | 2023.10.02 |
다형성(polymorphism) (0) | 2023.08.24 |
클래스, 메소드, for문, 스캐너를 이용한 구구단 출력 (0) | 2022.11.04 |
Scanner - 입력 (0) | 2022.10.28 |