๋ธ๋ก๊ทธ ์ฎ๊ฒผ์ต๋๋ค! ๐ก integer.blog
์๋ก ๋งก๊ฒ ๋ ๋ ๊ฑฐ์ ํ๋ก์ ํธ์ ๋ช๋ช ํด๋์ค๋ค์ด Serializable ์ธํฐํ์ด์ค๋ฅผ ์ ์์๋ฐ๋์ง ์์๋ณด๋ ๊ณผ์ ์์ Java ์ง๋ ฌํ ๊ฐ๋ ์ ๋ฆฌ
์์ฑ์ผ : 2019๋ 10์ 13์ผ
๊ฐ๋จํ๊ฒ
- Java ๋ด๋ถ ์์คํ ์์ ์ฌ์ฉ๋๋(๋๋ JVM ๋ฉ๋ชจ๋ฆฌ์ ์ฌ๋ ค์ง) ๊ฐ์ฒด๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ์์ ์ฌ์ฉํ ์ ์๋๋ก Byte ํํ๋ก ๋ณํํ๋ ๊ฒ. (Vice Versa)
์์ธํ
- ๋๋ถ๋ถ OS์ ํ๋ก์ธ์ค ๊ตฌํ์ ์๋ก ๋ค๋ฅธ ๊ฐ์๋ฉ๋ชจ๋ฆฌ์ฃผ์๊ณต๊ฐ(Virtual Address Space, VAS)๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์ Object ํ์ ์ ์ฐธ์กฐ๊ฐ(์ฃผ์๊ฐ) ๋ฐ์ดํฐ ์ธ์คํด์ค๋ฅผ ์ ๋ฌํ ์ ์๋ค.(์ ๋ฌํด๋ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์์๋ ์ ๋ฌ๋ ์ฐธ์กฐ๊ฐ์ด ๋ฌด์๋ฏธํ๋ค.) ๋๋ฌธ์ ์๋ก ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ์ฌ์ด์ ๋ฐ์ดํฐ ์ ๋ฌ์ ์ํด์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์ฃผ์๊ฐ์ด ์๋ Byte ํํ๋ก ์ง๋ ฌํ(๋ณํ)๋ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๋ฉด, ์ฌ์ฉํ๋ ์ชฝ์์ ์ญ์ง๋ ฌํํ์ฌ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.
- Java์ ํด๋์ค ์ค๊ณ์์๋ ๊ฐ์ฒด ์์ ๊ฐ์ฒด๊ฐ ์กด์ฌํ ์ ์๋ค. ๊ฐ์ฒด A ์์ ๋ค์ด์๋ ๊ฐ์ฒด๋ B๋ ๊ฐ์ฒด B๋ฅผ ์ฐธ์กฐํ ์ ์๋ ์ฃผ์๊ฐ์ธ๋ฐ, ์ง๋ ฌํ๋ฅผ ํ๋ฉด ์ด ์ฃผ์๊ฐ์ด ์๋๋ผ ๊ฐ์ฒด B ์์ฒด์ ๋ฐ์ดํฐ๋ฅผ Primitive ํ์ (Byte ํ์ ) ๋ฐ์ดํฐ๋ก ๋ณํํ๋ค. ๋๋ฌธ์ ์ง๋ ฌํ ๋ ๋ฐ์ดํฐ๋ ๋ชจ๋ Primitive ํ์ (Byte ํ์ )์ ๋ฐ์ดํฐ ๋ฌถ์์ด๋ฉฐ, ์ด๊ฒ์ด ํ์ผ ์ ์ฅ์ด๋ ๋คํธ์ํฌ ์ ์ก ์ ํ์ฑํ ์ ์๋ ์ ์๋ฏธํ ๋ฐ์ดํฐ๊ฐ ๋๋ ๊ฒ์ด๋ค. ์ฆ, ์ ์ก/์ ์ฅ ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ฅผ ๋ง๋๋ ๊ฒ์ด ์ง๋ ฌํ(Serialization) ์ด๋ค.
- JSON, CSV ๋ฑ์ ํฌ๋งท์ ์ง๋ ฌํ/์ญ์ง๋ ฌํ ์์ ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋์
ํด์ผ ์ฝ๊ฒ ๊ฐ๋ฐ์ด ๊ฐ๋ฅํ๋ฉฐ, ๊ตฌ์กฐ๊ฐ ๋ณต์กํด์ง๋ฉด ์ง์ ๋งคํํด์ค์ผ ํ์ง๋ง, Java ์ง๋ ฌํ๋ ๋น๊ต์ ๋ณต์กํ ๊ฐ์ฒด๋ ํฐ ์์
์์ด
java.io.Serializable
์ธํฐํ์ด์ค๋ง ๊ตฌํํด์ฃผ๋ฉด ๊ธฐ๋ณธ Java ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ง ์ฌ์ฉํด๋ ์ง๋ ฌํ/์ญ์ง๋ ฌํ ๊ฐ๋ฅ
์ง๋ ฌํ์ ์กฐ๊ฑด
Java.io.Serializable
์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ์ ๊ฐ์ฒด์ Primitive ํ์ ์ ๋ฐ์ดํฐ๊ฐ ์ง๋ ฌํ์ ๋์์ด ๋ ์ ์๋ค.- ๊ธฐ๋ณธ์๋ฃํ(Primitive Type)์ ์ ํด์ง Byte์ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ Byte ๋จ์๋ก ๋ณํํ๋ ๊ฒ์ ๋ฌธ์ ๊ฐ ์์ง๋ง,
- ๊ฐ์ฒด์ ํฌ๊ธฐ๋ ๊ฐ๋ณ์ ์ด๋ฉฐ, ๊ฐ์ฒด๋ฅผ ๊ตฌ์ฑํ๋ ์๋ฃํ๋ค์ ์ข ๋ฅ์ ์์ ๋ฐ๋ผ ๊ฐ์ฒด์ ํฌ๊ธฐ๊ฐ ๋ค์ํ๊ฒ ๋ฐ๋ ์ ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ๊ธฐ ์ํด Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
- ๊ฐ์ฒด์ ๋ฉค๋ฒ๋ค ์ค Serializable ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ๋์ง ์์ ๊ฒ์ด ์กด์ฌํ๋ฉด ์๋๋ค.
Transient
๊ฐ ์ ์ธ๋ ๋ฉค๋ฒ๋ ์ ์ก๋์ง ์๋๋ค.- ๊ฐ์ฒด ๋ด์ Serializable ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ๋์ง ์์ ๋ฉค๋ฒ ๋๋ฌธ์
NonSerializableException
์ด ๋ฐ์ํ๋ ๊ฒฝ์ฐ, Transient๋ฅผ ์ ์ธํด์ฃผ๋ฉด ์ง๋ ฌํ ๋์์์ ์ ์ธ๋๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์์ด ํด๋น ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ ํ ์ ์๋ค.
- ๊ฐ์ฒด ๋ด์ Serializable ์ธํฐํ์ด์ค๊ฐ ๊ตฌํ๋์ง ์์ ๋ฉค๋ฒ ๋๋ฌธ์
์ง๋ ฌํ๊ฐ ์ฌ์ฉ๋๋ ์ํฉ์?
- JVM์ ๋ฉ๋ชจ๋ฆฌ์์ ์์ฃผํ๋ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์์ํ(Persistence)ํ ๋ ์ฌ์ฉ๋๋ค.
- ์์คํ ์ด ์ข ๋ฃ๋๋๋ผ๋ ์ฌ๋ผ์ง์ง ์์ผ๋ฉฐ, ์์ํ๋ ๋ฐ์ดํฐ์ด๊ธฐ ๋๋ฌธ์ ๋คํธ์ํฌ๋ก ์ ์ก๋ ๊ฐ๋ฅํ๋ค.
- Servlet Session
- Servlet ๊ธฐ๋ฐ์ WAS๋ค์ ๋๋ถ๋ถ ์ธ์ ์ Java ์ง๋ ฌํ๋ฅผ ์ง์ํ๋ค.
- ํ์ผ๋ก ์ ์ฅ, ์ธ์ ํด๋ฌ์คํฐ๋ง, DB๋ฅผ ์ ์ฅํ๋ ์ต์ ๋ฑ์ ์ ํํ๋ฉด ์ธ์ ์์ฒด๊ฐ ์ง๋ ฌํ๋์ด ์ ์ฅ ๋ฐ ์ ๋ฌ๋๋ค.
- Cache
- ์บ์ํ ๋ถ๋ถ์ ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํด์ ์ฌ์ฉ
- Java RMI(Remote Method Invocation)
- ์๊ฒฉ ์์คํ ์ ๋ฉ์๋๋ฅผ ํธ์ถํ ๋ ์ ๋ฌํ๋ ๋ฉ์ธ์ง(๊ฐ์ฒด)๋ฅผ ์ง๋ ฌํํ์ฌ ์ฌ์ฉ
- ๋ฉ์ธ์ง(๊ฐ์ฒด)๋ฅผ ์ ๋ฌ๋ฐ์ ์๊ฒฉ ์์คํ ์์๋ ๋ฉ์ธ์ง(๊ฐ์ฒด)๋ฅผ ์ญ์ง๋ ฌํํ์ฌ ์ฌ์ฉ
- ๊ฐ์ฒด๊ฐ ์ธ์ ์ ์ ์ฅํ์ง ์๋ ๋จ์ํ ๋ฐ์ดํฐ ์งํฉ์ด๊ณ , ์ปจํธ๋กค๋ฌ์์ ์์ฑ๋์ด์ ๋ทฐ์์ ์๋ฉธํ๋ ๋ฐ์ดํฐ์ ์ ๋ฌ์ฒด๋ผ๋ฉด ๊ฐ์ฒด ์ง๋ ฌํ๋ ๊ณ ๋ คํ์ง ์์๋ ๋๋ค.
- ์ธ์ ๊ด๋ฆฌ๋ฅผ ์คํ ๋ฆฌ์ง๋ ๋คํธ์ํฌ ์์์ ์ฌ์ฉํ๋ค๋ฉด ๊ฐ์ฒด ์ง๋ ฌํ๋ฅผ ํด์ผ ํ๊ณ , ๋ฉ๋ชจ๋ฆฌ์์๋ง ๊ด๋ฆฌํ๋ค๋ฉด ๊ฐ์ฒด ์ง๋ ฌํ๋ฅผ ํ ํ์๊ฐ ์๋ค. ๋ ๋ค ๊ณ ๋ คํ๋ค๋ฉด ์ง๋ ฌํ๊ฐ ํ์ํ๋ค.
Java ์ง๋ ฌํ ์์
Java.io.Serializable
์ธํฐํ์ด์ค๋ฅผ ์์๋ฐ๋๋ค.serialVersionUID
๋ฅผ ์ค์ ํ๋ค.@Entity @AllArgsConstructor @toString public class HubContent implements Serializable { private static final long serialVersionUID = 1L; private String title; private String subtitle; ...
Java ์ง๋ ฌํ๋
java.io.ObjectOutPutStream
๊ฐ์ฒด๋ฅผ ์ด์ฉํ๋ค.๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ์ฌ Byte ๋ฐฐ์ด ํํ๋ก ๋ณํํ๋ค.
HubContent hubcontent = new HubContent("์ ๋ชฉ", "๋ถ์ "); byte[] serializedHubContent; try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) { try (ObjectOutputStream oos = new ObjectOutputStream(baos)) { oos.writeObject(hubContent); // ์ง๋ ฌํ๋ HubContent ๊ฐ์ฒด serializedHubContent = baos.toByteArray(); } }
์ญ์ง๋ ฌํ ์์
์ญ์ง๋ ฌํ๋ฅผ ํ๊ธฐ ์ํด์๋ ์ง๋ ฌํ ๋์์ด ๋ ๊ฐ์ฒด์ ํด๋์ค๊ฐ ClassPath์ ์กด์ฌํด์ผ ํ๋ฉฐ import ๋์ด์์ด์ผ ํ๋ค.
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedHubContent)) { try (ObjectInputStream ois = new ObjectInputStream(bais)) { // ์ญ์ง๋ ฌํ๋ HubContent ๊ฐ์ฒด๋ฅผ ์ฝ์ด์จ๋ค. Object objectHubContent = ois.readObject(); HubContent hubContent = (HubContent) objectHubContent; } }
serialVersionUID
๋ฅผ ์ง์ ๊ด๋ฆฌํ๋ ์ด์ ?
- Java ์ง๋ ฌํ ๋์ ๊ฐ์ฒด๋ ๋์ผํ
serialVersionUID
๋ฅผ ๊ฐ์ง๊ณ ์์ด์ผ ํ๋ค. - ๊ทธ๋ฐ๋ฐ
serialVersionUID
๋ฅผ ์ง์ ์ ์ธํ์ง ์์๋, ๋ด๋ถ์ ์ผ๋ก ํด๋์ค์ ๊ตฌ์กฐ ์ ๋ณด๋ฅผ ์ด์ฉํด ์๋์ผ๋ก ์์ฑ๋ ํด์ฌ๊ฐ์ด ํ ๋น๋๋ค. - ๋๋ฌธ์ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์๊ฐ ์ถ๊ฐ๋๊ฑฐ๋ ์ญ์ ๋๋ฉด
serialVersionUID
๊ฐ ๋ฌ๋ผ์ง๋๋ฐ, - ์ญ์ง๋ ฌํ ํ ๋ ๊ธฐ์กด์
serialVersionUID
์ ๋ณ๊ฒฝ๋serialVersionUID
๊ฐ ๋ค๋ฅด๋ฉดjava.io.InvalidClassException
์์ธ๊ฐ ๋ฐ์ํ๋ค. - ๊ทธ๋ฌ๋ฏ๋ก ์์ ์ฝ๋(
private static final long serialVersionUID = 1L;
) ์ฒ๋ผ ์ง์ serialVersionUID ๊ฐ์ ๊ด๋ฆฌํด์ผ ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋์ด๋ ๋ฌธ์ ์์ด ์ง๋ ฌํ/์ญ์ง๋ ฌํ๋ฅผ ํ ์ ์๋ค. - ํ์ง๋ง
serialVersionUID
๊ฐ ๊ฐ๋ค๊ณ ๋ฌด์กฐ๊ฑด ๋ฌธ์ ์์ด ์ง๋ ฌํ/์ญ์ง๋ ฌํ ํ ์ ์๋ ๊ฒ์ ์๋๋ค.- ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์ ํ์ ์ด ๋ค๋ฅด๋ฉด ํ์ ์์ธ๊ฐ ๋ฐ์ํ๋ค.
- ๋ฉค๋ฒ ๋ณ์๋ฅผ ์ ๊ฑฐํ๊ฑฐ๋ ๋ณ์๋ช
์ ๋ฐ๊พธ๋ฉด ์์ธ๋ ๋ฐ์ํ์ง ์์ง๋ง ๋ฐ์ดํฐ๋ ๋๋ฝ๋๋ค.
์ค๋ฌด ์ฌ์ฉ ์กฐ์ธ
์๋ฐ ์ง๋ ฌํ, ๊ทธ๊ฒ์ด ์๊ณ ์ถ๋ค. ์ค๋ฌดํธ์์ ๋ฐ์ทํ ๋ด์ฉ
serialVersionUID
๋ ๊ฐ๋ฐ ์ ์ง์ ๊ด๋ฆฌ- ์ญ์ง๋ ฌํ ๋์ ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์ ํ์ ๋ณ๊ฒฝ ์ง์
- ์ธ๋ถ(DB, ์บ์ ์๋ฒ, NoSQL ์๋ฒ ๋ฑ)์ ์ฅ๊ธฐ๊ฐ ์ ์ฅ๋ ์ ๋ณด๋ Java ์ง๋ ฌํ ์ฌ์ฉ ์ง์ (ํด๋์ค ๋ณ๊ฒฝ์ ์์ธกํ ์ ์์ผ๋ฏ๋ก)
- ๊ฐ๋ฐ์๊ฐ ์ง์ ์ปจํธ๋กคํ ์ ์๋ ํด๋์ค(ํ๋ ์์ํฌ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ํด๋์ค)๋ ์ง๋ ฌํ ์ง์
- ์์ฃผ ๋ณ๊ฒฝ๋๋ ํด๋์ค๋ Java ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข๋ค.
- ์ญ์ง๋ ฌํ์ ์คํจํ๋ ์ํฉ์ ๋ํ ์์ธ์ฒ๋ฆฌ ํ์
- ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ ํ์ ์ ๋ณด๋ฑ์ ํด๋์ค ๋ฉํ์ ๋ณด๋ฅผ ํฌํจํ๊ธฐ ๋๋ฌธ์ JSON ํฌ๋งท์ ๋นํด ์ฝ 2~10๋ฐฐ ๋ ์ฌ์ด์ฆ๊ฐ ํฌ๋ค. ํนํ ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฉ๋ชจ๋ฆฌ ์๋ฒ(Redis, Memcached)์ ์ ์ฅํ๋ ํ๊ฒฝ์์ ํธ๋ํฝ์ ๋ฐ๋ผ ๋คํธ์ํฌ ๋น์ฉ๊ณผ ์บ์ ์๋ฒ ๋น์ฉ์ด ๊ธ์ฆํ ์ ์์ผ๋ฏ๋ก, JSON ํฌ๋งท์ผ๋ก์ ๋ณ๊ฒฝ์ ๊ณ ๋ คํด์ผ ํ๋ค.