일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- @value
- 레오폴드
- java
- 트랜잭션
- value 어노테이션
- vue.js
- Object-oriented
- 개행문자
- 개발환경
- springframework
- 쿼리
- 줄바꿈
- application.properties
- springboot
- 직렬화
- 자바
- 660mbt
- Spring Framework
- spring
- query
- mysql
- 다중DB
- 코테
- Serializable
- 업로드 파일 용량
- 롤백
- sql
- 개햄문자치환
- spring boot
- Docker
- Today
- Total
supremest.35 개발 블로그
[Java] 자바 직렬화 본문
업무 도중 항상 궁금한 부분이 있었다.
Serializable를 상속하는 객체가 있고 그렇지 않은 객체가 있었던 것...
그리고 Serializable 객체는 가끔 빌드하다가 에러가 났는데 그 이유는 항상 serialVersionUID를 지정하지 않아 발생한 에러였던 것이다.
업무 중에는 항상 빠른 구글링을 통해 '아, serialVersionUID'를 지정하면 되는 구나..' 하고 지정해버리고 그냥 넘어가기만 했다.
그런데 이게 반복이 되니까 Serializable를 상속받는 객체에 대해 의문이 생겨 열심히 또 구글링을 해보았다.
직렬화
우선 Serializable를 알려면 직렬화부터 이해해야한다.
직렬화란, 데이터 구조나 오브젝트 상태를 동일하거나 다른 컴퓨터 환경에 저장(이른테면 파일이나 메모리 버퍼에서, 또는 네트워크 연결 링크 간 전송)하고 나중에 재구성할 수 있는 포맷으로 변환하는 과정이다.
조금 쉽게 말하면, 직렬화는 데이터를 저장하거나 다른 환경으로 전달하기 위해 특정 형태로 변환하는 과정을 말한다.
그렇다면 직렬화가 왜 필요하지?
각 개발 언어에서 사용하는 데이터들의 메모리 구조는 크게 2가지로 나뉜다.
1. 값 형식 데이터(Value Type) : int, float, char 등 원시 타입 데이터들은 메모리 영역 중 스택에 쌓이고 이미 직렬화가 되어 있다.
2. 참조 형식 데이터(Reference Type) : 배열, 열거 타입, 클래스 등의 데이터들은 변수를 선언하면 메모리 영역 중 힙에 메모리가 할당되고, 스택에는 이 힙 메모리를 참조(힙에 메모르 번지 주소를 가지고 있음)하는 구조로 되어있다.
참조 형식 데이터는 실제 데이터 값이 아닌 실제 데이터 값이 저장되어 있는 주소를 가지고 있기 때문에 저장, 통신에 사용할 수 없다.
(주소값은 프로그램이 재실행 될 때마다 달라지고, 각 PC 마다 메모리 공간 주소가 다르기 때문.)
그렇다면 저장, 통신을 하기 위해서는 실제 데이터 값을 가져와야 하는데, 직렬화를 하게 되면 각 주소값이 가지는 데이터를 조회하여 값 형식 데이터로 변환해준다.
직렬화를 하는 여러 방법
1. 문자열 형태 (API나 데이터를 변환하여 추출)
- CSV : 표형태의 다량의 데이터 직렬화 시 사용
- XML, JSON : 구조적인 형태의 데이터
2. 이진 직렬화
- 데이터 변환 및 전송 속도에 최적화하여 별도의 직렬화 방법을 제시하는 구조
- 직렬화 뿐만 아니라 전송 방법에 대한 부분도 이야기함
- protocol buffer
- 구글에서 제안한 플랫폼 독립적인 데이터 직렬화 플랫폼(파일명.proto)
- 프로토콜 버퍼 컴파일러 필요
- apache avro
- protocol buffer
자바 직렬화를 사용하는 이유
- 자바 직렬화는 자바 시스템에서 개발에 최적화 되어 있어서, 복잡한 데이터 구조의 클래스 객체도 직렬화 조건만 지키면 큰 작업 없이 바로 직렬화가능
- csv, json을 사용해도 됨(목적에 따라 적절히 사용)
참고문서
- https://soooom.tistory.com/entry/%EC%9E%90%EB%B0%94-%EA%B0%9D%EC%B2%B4-%EC%A7%81%EB%A0%AC%ED%99%94-serialization-%EC%A0%95%EB%A6%AC
- https://techblog.woowahan.com/2550/
- https://velog.io/@whitebear/%EC%9E%90%EB%B0%94-%EC%A7%81%EB%A0%AC%ED%99%94-%ED%99%95%EC%8B%A4%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0
- https://hub1234.tistory.com/26
'Study > Java' 카테고리의 다른 글
[Java] 람다식 (0) | 2023.03.07 |
---|---|
[Java] 개행문자 치환 (0) | 2022.04.14 |
[Java] 메소드 (0) | 2021.04.16 |
[Java] 클래스 (0) | 2021.04.15 |
[Java] 객체란 (0) | 2021.04.15 |