# [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๋ฐฐ ๋” ํšจ์œจ์ 



# [์ฐธ๊ณ ์ž๋ฃŒ]

์ตœ์ข… ์ˆ˜์ • : 8/5/2022, 3:54:50 PM