Back/Java

[JAVA] 데이터 직렬화(serialization) ν•˜λŠ” 이유

은z 2022. 2. 11. 09:46

πŸ‘€κΆκΈˆμ¦?

ν”„λ‘œμ νŠΈλ₯Ό μ§„ν–‰ν•˜λ©΄μ„œ  DTO, VO 클래슀 λͺ… 끝에

implements Serializable

μ΄λ ‡κ²Œ λΆ™μ΄λŠ” 경우λ₯Ό 많이 λ΄€λ‹€.

λ‹Ήμž₯ λˆˆμ— λ³΄μ΄λŠ” νš¨κ³ΌλŠ” μ—†λŠ” 것 같은데 μ™œ 직렬화λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν•˜λŠ”μ§€ 의문이 생겼닀.

 

 

아직 100% μ΄ν•΄ν•œ 것은 μ•„λ‹ˆμ§€λ§Œ, μ•Œμ•„λ³Έ λ°” λŒ€λ‘œ 정리해보렀고 ν•œλ‹€.

 

βœ”οΈprivate static final long serialVersionUID λŠ” μ™œ μ‚¬μš©ν•˜λ‚˜?

도메인 객체에 private static final long serialVersionUID = 8999559983943337176L; 이런 μ‹μœΌλ‘œ λ©€λ²„λ³€μˆ˜κ°€ λ“€μ–΄ μžˆλŠ” κ²½μš°κ°€ μžˆλ‹€.

이λ₯Ό μ‚¬μš©ν•˜λŠ” μ΄μœ λŠ” type safety λ•Œλ¬Έμ΄λ‹€. 예λ₯Όλ“€μ–΄ μ§λ ¬ν™”ν•œ 객체λ₯Ό 원격지에 전솑을 ν–ˆλ‹€κ³  ν–ˆμ„ κ²½μš°μ— μ „μ†‘λœ 객체의 ν΄λž˜μŠ€μ™€ μ›κ²©μ§€μ˜ ν΄λž˜μŠ€μ™€ λ™μΌν•œμ§€ μ—¬λΆ€ 체크λ₯Ό ν•΄μ£ΌλŠ” 것이닀. serialVersionUID λ‹€λ₯Όκ²½μš° java.io.InvalidClassException 이 λ°œμƒν•œλ‹€.

 

βœ”οΈλ°μ΄ν„° 직렬화(serialization) μ™œ ν•„μš”ν•œκ°€? 

 

λ¨Όμ € 데이터 μ§λ ¬ν™”λž€, λ©”λͺ¨λ¦¬λ₯Ό λ””μŠ€ν¬μ— μ €μž₯ν•˜κ±°λ‚˜ λ„€νŠΈμ›Œν¬ 톡신에 μ‚¬μš©ν•˜κΈ° μœ„ν•œ ν˜•μ‹μœΌλ‘œ λ³€ν™˜ν•˜λŠ” 것을 λ§ν•œλ‹€. 

(역직렬화 desrializationλŠ” κ·Έ λ°˜λŒ€)

 

κ·Έλ ‡λ‹€λ©΄, μ™œ 데이터λ₯Ό μžˆλŠ” κ·ΈλŒ€λ‘œ κ·Έλƒ₯ μ‚¬μš©ν•˜λ©΄ μ•ˆλ˜κ³  직렬화λ₯Ό ν•΄μ£Όμ–΄μ•Ό ν• κΉŒ?

 

λ°”λ‘œ λ””μŠ€ν¬μ— μ €μž₯ν•˜κ±°λ‚˜ 톡신에 μ‚¬μš©ν•˜λŠ” λ°μ΄ν„°λŠ” πŸ“Œκ°’ ν˜•μ‹ λ°μ΄ν„°λ§Œ κ°€λŠ₯ν•˜κΈ° λ•Œλ¬Έμ΄λ‹€.

참고둜 λ°μ΄ν„°λ“€μ˜ λ©”λͺ¨λ¦¬ κ΅¬μ‘°λŠ” 크게 2κ°€μ§€λ‘œ λ‚˜λ‰œλ‹€.

1. κ°’ ν˜•μ‹ 데이터(Value Type) : μš°λ¦¬κ°€ ν”νžˆ μ„ μ–Έν•΄μ„œ μ‚¬μš©ν•˜λŠ” int, float, char λ“±, κ°’ ν˜•μ‹ 데이터듀은 μŠ€νƒμ— λ©”λͺ¨λ¦¬κ°€ μŒ“μ΄κ³  직접 접근이 κ°€λŠ₯ν•˜λ‹€.

 

2. μ°Έμ‘° ν˜•μ‹ 데이터(Reference Type) : μžλ°”μ—μ„œ byte, short, char, int, long, boolean, float, double μ΄λ ‡κ²Œ 8κ°€μ§€ νƒ€μž…μ„ μ œμ™Έν•˜κ³ λŠ” λͺ¨λ‘ μ°Έμ‘° ν˜•μ‹ 데이터에 ν•΄λ‹Ήν•œλ‹€. μ°Έμ‘° λ³€μˆ˜λ₯Ό μ„ μ–Έν•˜λ©΄ νž™μ— λ©”λͺ¨λ¦¬κ°€ ν• λ‹Ήλ˜κ³  μŠ€νƒμ—μ„œλŠ” 이 νž™ λ©”λͺ¨λ¦¬λ₯Ό μ°Έμ‘°ν•˜λŠ”(νž™μ— λ©”λͺ¨λ¦¬ λ²ˆμ§€ μ£Όμ†Œλ₯Ό κ°€μ§€κ³  있음) ꡬ쑰둜 λ˜μ–΄μžˆλ‹€.

 

μ™œ κ°’ ν˜•μ‹ λ°μ΄ν„°λ§Œ 톡신이 κ°€λŠ₯ν• κΉŒ?

μ°Έμ‘°ν˜•μ‹ 데이터λ₯Ό 톡신에 μ‚¬μš©ν•  수 μ—†λŠ” μ΄μœ λŠ” 각 pc λ§ˆλ‹€ μ‚¬μš©ν•˜λŠ” λ©”λͺ¨λ¦¬ 곡간 μ£Όμ†Œκ°€ λͺ¨λ‘ λ‹€λ₯΄κΈ° λ•Œλ¬Έμ΄λ‹€.

λ§Œμ•½ λ‚΄κ°€ A객체(0x00016413) λ₯Ό λ‹€λ₯Έ pc둜 μ „μ†‘ν–ˆλ‹€λ©΄ 이 데이터λ₯Ό 받은 pc의 0x00016413 μ£Όμ†Œμ—λŠ” μ „ν˜€ λ‹€λ₯Έ 값이 

μ‘΄μž¬ν•œλ‹€.

 

그런데, 직렬화λ₯Ό ν•˜λ©΄ 각 μ£Όμ†Œκ°’μ΄ κ°€μ§€λŠ” 데이터듀을 λͺ¨λ‘ κ°’ ν˜•μ‹μœΌλ‘œ λ°”κΎΈμ–΄μ€€λ‹€.

그리고 μ§λ ¬ν™”λœ 데이터듀은 톡신 μ‹œμ— νŒŒμ‹±μ΄ κ°€λŠ₯ν•œ μœ μ˜λ―Έν•œ 데이터가 λœλ‹€.