# [Java] ์ง๋ ฌํ(Serialization)
์๋ฐ ์์คํ
๋ด๋ถ์์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ธ๋ถ์ ์๋ฐ ์์คํ
์์๋ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐ์ดํธ(byte) ํํ๋ก ๋ฐ์ดํฐ ๋ณํํ๋ ๊ธฐ์
๊ฐ์ PC์ OS๋ง๋ค ์๋ก ๋ค๋ฅธ ๊ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ ๊ณต๊ฐ์ ๊ฐ๊ธฐ ๋๋ฌธ์, Reference Type์ ๋ฐ์ดํฐ๋ค์ ์ธ์คํด์ค๋ฅผ ์ ๋ฌ ํ ์ ์๋ค.
๋ฐ๋ผ์, ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด์ ์ฃผ์๊ฐ์ด ์๋ Byte ํํ๋ก ์ง๋ ฌํ๋ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํด์ผ ํ๋ค.
์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ค์ ๋ชจ๋ Primitive Type(๊ธฐ๋ณธํ)์ด ๋๊ณ , ์ด๋ ํ์ผ ์ ์ฅ์ด๋ ๋คํธ์ํฌ ์ ์ก ์ ํ์ฑ์ด ๊ฐ๋ฅํ ์ ์๋ฏธํ ๋ฐ์ดํฐ๊ฐ ๋๋ค. ๋ฐ๋ผ์, ์ ์ก ๋ฐ ์ ์ฅ์ด ๊ฐ๋ฅํ ๋ฐ์ดํฐ๋ก ๋ง๋ค์ด์ฃผ๋ ๊ฒ์ด ๋ฐ๋ก **์ง๋ ฌํ(Serialization)**์ด๋ผ๊ณ ๋งํ ์ ์๋ค.
# ์ง๋ ฌํ ์กฐ๊ฑด
์๋ฐ์์๋ ๊ฐ๋จํ java.io.Serializable
์ธํฐํ์ด์ค ๊ตฌํ์ผ๋ก ์ง๋ ฌํ/์ญ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํ๋ค.
์ญ์ง๋ ฌํ๋ ์ง๋ ฌํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋์ชฝ์์ ๋ค์ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ก ๋ณํํ๊ธฐ ์ํ ์์ ์ ๋งํ๋ค.
์ง๋ ฌํ ๋์ : ์ธํฐํ์ด์ค ์์ ๋ฐ์ ๊ฐ์ฒด, Primitive ํ์ ์ ๋ฐ์ดํฐ
Primitive ํ์ ์ด ์๋ Reference ํ์ ์ฒ๋ผ ์ฃผ์๊ฐ์ ์ง๋ ๊ฐ์ฒด๋ค์ ๋ฐ์ดํธ๋ก ๋ณํํ๊ธฐ ์ํด Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผ ํ๋ค.
# ์ง๋ ฌํ ์ํฉ
- JVM์ ์์ฃผํ๋ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ์์ํํ ๋ ์ฌ์ฉ
- Servlet Session
- Cache
- Java RMI(Remote Method Invocation)
# ์ง๋ ฌํ ๊ตฌํ
@Entity
@AllArgsConstructor
@toString
public class Post implements Serializable {
private static final long serialVersionUID = 1L;
private String title;
private String content;
serialVersionUID
๋ฅผ ๋ง๋ค์ด์ค๋ค.
Post post = new Post("์ ๋ชฉ", "๋ด์ฉ");
byte[] serializedPost;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(post);
serializedPost = baos.toByteArray();
}
}
ObjectOutputStream
์ผ๋ก ์ง๋ ฌํ๋ฅผ ์งํํ๋ค. Byte๋ก ๋ณํ๋ ๊ฐ์ ์ ์ฅํ๋ฉด ๋๋ค.
# ์ญ์ง๋ ฌํ ์์
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedPost)) {
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
Object objectPost = ois.readObject();
Post post = (Post) objectPost;
}
}
ObjectInputStream
๋ก ์ญ์ง๋ ฌํ๋ฅผ ์งํํ๋ค. Byte์ ๊ฐ์ ๋ค์ ๊ฐ์ฒด๋ก ์ ์ฅํ๋ ๊ณผ์ ์ด๋ค.
# ์ง๋ ฌํ serialVersionUID
์์ ์ฝ๋์์ serialVersionUID
๋ฅผ ์ง์ ์ค์ ํ์๋ค. ์ฌ์ค ์ ์ธํ์ง ์์๋, ์๋์ผ๋ก ํด์๊ฐ์ด ํ ๋น๋๋ค.
์ง์ ์ค์ ํ ์ด์ ๋ ๊ธฐ์กด์ ํด๋์ค ๋ฉค๋ฒ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋๋ฉด serialVersionUID
๊ฐ ๋ฌ๋ผ์ง๋๋ฐ, ์ญ์ง๋ ฌํ ์ ๋ฌ๋ผ์ง ๋๋ฒ๋ก Exception์ด ๋ฐ์๋ ์ ์๋ค.
๋ฐ๋ผ์ ์ง์ serialVersionUID
์ ๊ด๋ฆฌํด์ผ ํด๋์ค์ ๋ณ์๊ฐ ๋ณ๊ฒฝ๋์ด๋ ์ง๋ ฌํ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๊ฒ ๋๋ค.
serialVersionUID
์ ๊ด๋ฆฌํ๋๋ผ๋, ๋ฉค๋ฒ ๋ณ์์ ํ์ ์ด ๋ค๋ฅด๊ฑฐ๋, ์ ๊ฑฐ ํน์ ๋ณ์๋ช ์ ๋ฐ๊พธ๊ฒ ๋๋ฉด Exception์ ๋ฐ์ํ์ง ์์ง๋ง ๋ฐ์ดํฐ๊ฐ ๋๋ฝ๋ ์ ์๋ค.
# ์์ฝ
๋ฐ์ดํฐ๋ฅผ ํต์ ์์์ ์ ์ก ๋ฐ ์ ์ฅํ๊ธฐ ์ํด ์ง๋ ฌํ/์ญ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ๋ค.
serialVersionUID
๋ ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ด๋ฆฌํ๋ค.ํด๋์ค ๋ณ๊ฒฝ์ ๊ฐ๋ฐ์๊ฐ ์์ธกํ ์ ์์ ๋๋ ์ง๋ ฌํ ์ฌ์ฉ์ ์ง์ํ๋ค.
๊ฐ๋ฐ์๊ฐ ์ง์ ์ปจํธ๋กค ํ ์ ์๋ ํด๋์ค(๋ผ์ด๋ธ๋ฌ๋ฆฌ ๋ฑ)๋ ์ง๋ ฌํ ์ฌ์ฉ์ ์ง์ํ๋ค.
์์ฃผ ๋ณ๊ฒฝ๋๋ ํด๋์ค๋ ์ง๋ ฌํ ์ฌ์ฉ์ ์ง์ํ๋ค.
์ญ์ง๋ ฌํ์ ์คํจํ๋ ์ํฉ์ ๋ํ ์์ธ์ฒ๋ฆฌ๋ ํ์๋ก ๊ตฌํํ๋ค.
์ง๋ ฌํ ๋ฐ์ดํฐ๋ ํ์ , ํด๋์ค ๋ฉํ์ ๋ณด๋ฅผ ํฌํจํ๋ฏ๋ก ์ฌ์ด์ฆ๊ฐ ํฌ๋ค. ํธ๋ํฝ์ ๋ฐ๋ผ ๋น์ฉ ์ฆ๊ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ธฐ ๋๋ฌธ์ JSON ํฌ๋งท์ผ๋ก ๋ณ๊ฒฝํ๋ ๊ฒ์ด ์ข๋ค.
JSON ํฌ๋งท์ด ์ง๋ ฌํ ๋ฐ์ดํฐ ํฌ๋งท๋ณด๋ค 2~10๋ฐฐ ๋ ํจ์จ์