Serializable

์ง๋ ฌํ™”๋ž€?

Serializeable์ด๋ž€ ์ž๋ฐ” ์‹œ์Šคํ…œ ๋‚ด๋ถ€์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฐ์ฒด ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์™ธ๋ถ€์˜ ์ž๋ฐ” ์‹œ์Šคํ…œ์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก byte ํ˜•ํƒœ๋กœ ๋ฐ์ดํ„ฐ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ๊ณผ byte๋กœ ๋ณ€ํ™˜๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ์„ ํ•ฉ์ณ์„œ ๋งํ•œ๋‹ค.

์‹œ์Šคํ…œ ์ ์œผ๋กœ ๋งํ•˜๋ฉด, JVM(Java Virtual Machine)์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์ƒ์ฃผ(ํž™/์Šคํƒ)๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐ”์ดํŠธ ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ธฐ์ˆ ๊ณผ ์ง๋ ฌํ™”๋œ ๋ฐ”์ดํŠธ ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•ด์„œ JVM์œผ๋กœ ์ƒ์ฃผ์‹œํ‚ค๋Š” ํ˜•ํƒœ๋ฅผ ๋งํ•œ๋‹ค.

์ด์ „์— Django์—์„œ๋Š” python ๊ธฐ๋ณธ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„, JSON, XML ํ˜•ํƒœ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ–ˆ์—ˆ๋‹ค. Django restframework serializers

์กฐ๊ธˆ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๋ฉด,

  • ๋Œ€๋ถ€๋ถ„ OS์˜ ํ”„๋กœ์„ธ์Šค ๊ตฌํ˜„์€ ์„œ๋กœ ๋‹ค๋ฅธ ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ์ฃผ์†Œ๊ณต๊ฐ„(VAS)๋ฅผ ๊ฐ–๊ธฐ ๋•Œ๋ฌธ์— Object ํƒ€์ž…์˜ ์ฐธ์กฐ๊ฐ’ ๋ฐ์ดํ„ฐ ์ธ์Šคํ„ด์Šค๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค.(์ „๋‹ฌํ•˜๋”๋ผ๋„, ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ ์ „๋‹ฌ๋œ ์ฐธ์กฐ๊ฐ’์ด๋ฏ€๋กœ ๋ฌด์˜๋ฏธ) ๋•Œ๋ฌธ์— ์„œ๋กœ ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„ ์‚ฌ์ด์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์˜ ์ฃผ์†Œ๊ฐ’์ด ์•„๋‹Œ Byte ํ˜•ํƒœ๋กœ ์ง๋ ฌํ™”๋œ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ด ์‚ฌ์šฉํ•˜๋Š” ์ชฝ์—์„œ ์—ญ์ง๋ ฌํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค.

  • Java ํด๋ž˜์Šค๋Š” ๊ฐ์ฒด ์•ˆ์— ๊ฐ์ฒด๊ฐ€ ์กด์žฌํ•  ์ˆ˜ ์žˆ๋‹ค. ๊ฐ์ฒด A์•ˆ์— ๋“ค์–ด์žˆ๋Š” ๊ฐ์ฒด B๋ฅผ ์ง๋ ฌํ™”ํ•˜๋ฉด, ๊ฐ์ฒด B์ž์ฒด์˜ ๋ฐ์ดํ„ฐ๋ฅผ Primitive type(Byte type)์˜ ๋ฐ์ดํ„ฐ๋กœ ๋ณ€ํ™˜ํ•œ๋‹ค. ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ๋ชจ๋‘ Primitive ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ ๋ฌถ์Œ์ด๋ฉฐ, ํŒŒ์ผ ์ €์žฅ์ด๋‚˜ ๋„คํŠธ์›Œํฌ ์ „์†ก ์‹œ ํŒŒ์‹ฑํ•  ์ˆ˜ ์žˆ๋Š” ์œ ์˜๋ฏธํ•œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ด๋‹ค.

  • JSON, CSV ๋“ฑ์˜ ํฌ๋งท์€ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ์‹œ์— ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋„์ž…ํ•˜๋ฉด ์‰ฝ๊ฒŒ ๊ฐœ๋ฐœ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์ง€๋ฉด ์ง์ ‘ ๋งคํ•‘ํ•ด์ค˜์•ผํ•œ๋‹ค.

์ง๋ ฌํ™” ์กฐ๊ฑด

  1. Java.io.Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์† ๋ฐ›์€ ๊ฐ์ฒด์™€ Primitive ํƒ€์ž…์˜ ๋ฐ์ดํ„ฐ

    • ๊ธฐ๋ณธ์ž๋ฃŒํ˜•(Primitive Type)์€ ์ •ํ•ด์ง„ Byte ๋ณ€์ˆ˜

  2. ๊ฐ์ฒด์˜ ๋ฉค๋ฒ„๋“ค ์ค‘ Serializable ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ๊ตฌํ˜„๋˜์ง€ ์•Š์€ ๊ฒƒ์ด ์กด์žฌํ•˜๋ฉด ์•ˆ๋œ๋‹ค.

  3. transient ๊ฐ€ ์„ ์–ธ๋œ ๋ฉค๋ฒ„๋Š” ์ „์†กํ•˜์ง€ ์•Š๋Š”๋‹ค.

    • transient์„ ์–ธ์‹œ ์ง๋ ฌํ™” ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋จ

์™œ ์‚ฌ์šฉํ• ๊นŒ?

์ž๋ฐ” ์ง๋ ฌํ™” ํ˜•ํƒœ์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜์€ ์ž๋ฐ” ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ๊ตํ™˜์„ ์œ„ํ•ด ์กด์žฌํ•œ๋‹ค.

์žฅ์ 

  • ์ž๋ฐ” ์‹œ์Šคํ…œ์—์„œ์˜ ๊ฐœ๋ฐœ์— ์ตœ์ ํ™” ๋˜์–ด์žˆ๋‹ค. ๋ณต์žกํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์˜ ํด๋ž˜์Šค ๊ฐ์ฒด์ผ์ง€๋ผ๋„, ์ง๋ ฌํ™”์˜ ๊ธฐ๋ณธ๋งŒ ์ง€ํ‚ค๋ฉด ํฐ ์ž‘์—… ์—†์ด ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

  • ๋ฐ์ดํ„ฐ ํƒ€์ž…์ด ์ž๋™์œผ๋กœ ๋งž์ถฐ์ง€๊ธฐ ๋•Œ๋ฌธ์— ๊ด€๋ จ ๋ถ€๋ถ„์„ ํฌ๊ฒŒ ์‹ ๊ฒฝ์“ฐ์ง€ ์•Š์•„๋„ ๋œ๋‹ค.

์–ธ์ œ ์–ด๋””์„œ ์‚ฌ์šฉํ•ด์•ผํ• ๊นŒ?

  • JVM์˜ ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋งŒ ์ƒ์ฃผ๋˜์–ด์žˆ๋Š” ๊ฐ์ฒด๋ฅผ ๊ทธ๋Œ€๋กœ ์˜์†ํ™”(Persistence)๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋œ๋‹ค.

    • ์‹œ์Šคํ…œ์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ์—†์–ด์ง€์ง€ ์•Š๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๋ฉฐ, ์˜์†ํ™”๋œ ๋ฐ์ดํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋„คํŠธ์›Œํฌ๋กœ ์ „์†ก์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

  • Servlet Session

    • Servlet ๊ธฐ๋ฐ˜ WAS(ํ†ฐ์บฃ, ์›น๋กœ์ง ๋“ฑ)๋“ค์€ ๋Œ€๋ถ€๋ถ„ ์„ธ์…˜์˜ ์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค. ๋‹จ์ˆœํžˆ ์„ธ์…˜์„ ์„œ๋ธ”๋ฆฟ ๋ฉ”๋ชจ๋ฆฌ ์œ„์—์„œ ์šด์šฉํ•œ๋‹ค๋ฉด, ์ง๋ ฌํ™”๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ, ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์„ธ์…˜ ํด๋Ÿฌ์Šคํ„ฐ๋ง, DB ์ €์žฅํ•˜๋Š” ์˜ต์…˜๋“ฑ์„ ์„ ํƒํ•˜๋ฉด ์„ธ์…˜ ์ž์ฒด๊ฐ€ ์ง๋ ฌํ™”๋˜์–ด ์ „๋‹ฌ๋œ๋‹ค. ์ฆ‰, ์„ธ์…˜์— ํ•„์š”ํ•œ ๊ฐ์ฒด๋Š” java.io.Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์„ ์ถ”์ฒœํ•œ๋‹ค.

  • Cache

    • ์ž๋ฐ” ์‹œ์Šคํ…œ์—์„œ ํผํฌ๋จผ์Šค๋ฅผ ์œ„ํ•ด ์บ์‹œ(Ehcache, Redis, Memcached) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค. ์บ์‹œํ•  ๋ถ€๋ถ„์„ ์ž๋ฐ” ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•ด์„œ ์‚ฌ์šฉ๋œ๋‹ค. ์ž๋ฐ” ์ง๋ ฌ ํ™”๋งŒ ์ด์šฉํ•ด์„œ๋งŒ ์บ์‹œ๋ฅผ ์ ์šฉํ•˜์ง€ ์•Š์ง€๋งŒ, ๊ฐ€์žฅ ๊ฐ„ํŽธํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์ด ์‚ฌ์šฉํ•œ๋‹ค.

  • Remote Method Inovation

    • RMI๋Š” ์›๊ฒฉ ์‹œ์Šคํ…œ ๊ฐ„์˜ ๋ฉ”์„ธ์ง€ ๊ตํ™˜์„ ์œ„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์ˆ ์ด๋‹ค. ๋ณดํ†ต ์›๊ฒฉ ์‹œ์Šคํ…œ๊ณผ ํ†ต์‹ ์„ ์œ„ํ•ด IP์™€ ํฌํŠธ๋ฅผ ์ด์šฉํ•ด ์†Œ์ผ“ํ†ต์‹ ์„ ํ•˜์ง€๋งŒ, RMI๋Š” ๊ทธ ๋ถ€๋ถ„์„ ์ถ”์ƒํ™”ํ•ด ์›๊ฒฉ์— ์žˆ๋Š” ์‹œ์Šคํ…œ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ๋กœ์ปฌ ์‹œ์Šคํ…œ์˜ ๋ฉ”์„œ๋“œ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. ์›๊ฒฉ ์‹œ์Šคํ…œ์˜ ๋ฉ”์„œ๋“œ๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ ์ „๋‹ฌํ•˜๋Š” ๋ฉ”์„ธ์ง€๋ฅผ ์ž๋™์œผ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•˜๊ณ , ์ „๋‹ฌ๋ฐ›์€ ์›๊ฒฉ ์‹œ์Šคํ…œ์—์„œ ํ•ด๋‹น ๋ฉ”์„ธ์ง€๋ฅผ ์—ญ์ง๋ ฌํ™”ํ•˜์—ฌ ์‚ฌ์šฉํ•œ๋‹ค.

  • ๊ฐ์ฒด๊ฐ€ ์„ธ์…˜์— ์ €์žฅํ•˜์ง€ ์•Š๋Š” ๋‹จ์ˆœํ•œ ๋ฐ์ดํ„ฐ ์ง‘ํ•ฉ์ด๊ณ , ์ปจํŠธ๋กค๋Ÿฌ์—์„œ ์ƒ์„ฑ๋˜์–ด ๋ทฐ์—์„œ ์†Œ๋ฉธํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์ „๋‹ฌ์ฒด๋ผ๋ฉด ๊ฐ์ฒด ์ง๋ ฌํ™”๋Š” ๊ณ ๋ คํ•˜์ง€ ์•Š์•„๋„๋œ๋‹ค.

  • ์„ธ์…˜ ๊ด€๋ฆฌ๋ฅผ ์Šคํ† ๋ฆฌ์ง€๋‚˜ ๋„คํŠธ์›Œํฌ ์ž์›์„ ์ด์šฉํ•œ๋‹ค๋ฉด ๊ฐ์ฒด ์ง๋ ฌํ™”๋ฅผ ํ•ด์•ผํ•˜๋ฉฐ, ๋ฉ”๋ชจ๋ฆฌ์—์„œ๋งŒ ๊ด€๋ฆฌํ•œ๋‹ค๋ฉด ๊ฐ์ฒด ์ง๋ ฌํ™”๋ฅผ ํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค.

์‹ค์ œ๋กœ ์ƒํ’ˆ์ƒ์„ธ ๊ฐœ๋ฐœ์‹œ Dto๋ฅผ ์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ํ•˜์—ฌ ์ƒ์„ฑํ–ˆ์—ˆ๋‹ค. ์ „์‹œ ์„œ๋ฒ„ - ํ”„๋ก ํŠธ ์„œ๋ฒ„ ๊ฐ„ ์ง๋ ฌํ™”๋ฅผ ํ†ตํ•ด ๋ณ„๋„ ์ž‘์—… ์—†์ด ๋ฐ”๋กœ ๋ฐ์ดํ„ฐ ํƒ€์ž…์„ ๋งž์ถฐ์ฃผ๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ–ˆ๋‹ค.

์˜ˆ์‹œ

import java.io.Serializable;

import lombok.Data;

@Entity
@Getter
@Setter
@toString
public class AllnItem implements Serializable {
    private static final long serialVersionUID = 4140042043347990835L;

    private String chnlId;
    private String salestrNo;
    private String itemId;
    private String siteNo;
  private String applyYn;
}
AllnItem allnItem = new AllnItem("0000000","1234", "1000000001", "1001", "Y");
byte[] selializedAllnItem;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
    try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
        oos.writeObject(allnItem);

        // ์ง๋ ฌํ™”๋œ AllnItem ๊ฐ์ฒด
        selializedAllnItem = baos.toByteArray();
    }
}
try (ByteArrayInputStream bais = new ByteArrayInputStream(selializedAllnItem)) {
    try (ObjectInputStream ois = new ObjectInputStream(bais)) {

        // ์—ญ์ง๋ ฌํ™”๋œ AllnItem ๊ฐ์ฒด๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
        Object obj = ois.readObject();
        AllnItem allnItem = (AllnItem) obj;
    }
}

serialVersionUID

Java ์ง๋ ฌํ™” ๋Œ€์ƒ ๊ฐ์ฒด๋Š” ๋™์ผํ•œ serialVersionUID ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์•ผํ•œ๋‹ค. ํ•˜์ง€๋งŒ, ์ง์ ‘ ์„ ์–ธํ•˜์ง€ ์•Š๋”๋ผ๋„, ๋‚ด๋ถ€์ ์œผ๋กœ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ ์ •๋ณด๋ฅผ ์ด์šฉํ•ด ์ž๋™์œผ๋กœ ์ƒ์„ฑ๋œ ํ•ด์‰ฌ๊ฐ’์ด ํ• ๋‹น๋œ๋‹ค. ๊ทธ๋Ÿฌ๋ฏ€๋กœ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ์ถ”๊ฐ€๋˜๊ฑฐ๋‚˜ ์‚ญ์ œ๋˜๋ฉด serialVersionUID ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋˜๋Š”๋ฐ, ๊ธฐ์กด serialVersionUID ๊ฐ€ ๋ณ€๊ฒฝ๋˜๋ฉด java.io.InvalidCalssException ์ด ๋ฐœ์ƒํ•˜๊ฒŒ๋œ๋‹ค.

private static final long serialVersionUID = 1L;

์ฆ‰, ์œ„์™€ ๊ฐ™์ด ์ง์ ‘ ๊ด€๋ฆฌ๋ฅผ ํ•ด์•ผ ํด๋ž˜์Šค๊ฐ€ ๋ณ€๊ฒฝ๋˜์–ด๋„ ๋ฌธ์ œ์—†์ด ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ด๋•Œ, serialVersionUID๊ฐ€ ๊ฐ™๋‹ค๊ณ  ๋ฌธ์ œ์—†์ด ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค. ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ํƒ€์ž…์ด ๊ฐ™์•„์•ผํ•˜๋ฉฐ, ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜๋ช…์„ ๋ฐ”๊พธ๋ฉด ์˜ˆ์™ธ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฐ์ดํ„ฐ๋Š” ๋ˆ„๋ฝ๋œ๋‹ค.

์ง๋ ฌํ™” ์‚ฌ์šฉ์‹œ ์ฃผ์˜์‚ฌํ•ญ

  • ํŠน๋ณ„ํ•œ ๋ฌธ์ œ๊ฐ€ ์—†์œผ๋ฉด serialVersionUID ๊ฐ’์€ ์ง์ ‘ ๊ด€๋ฆฌํ•œ๋‹ค.

  • ์™ธ๋ถ€(DB, ์บ์‹œ์„œ๋ฒ„, NoSQL ์„œ๋ฒ„)์— ์žฅ๊ธฐ๊ฐ„ ์ €์žฅ๋  ์ •๋ณด๋Š” ์ž๋ฐ” ์ง๋ ฌํ™”์‚ฌ์šฉ์„ ์ง€์–‘ํ•ด์•ผํ•œ๋‹ค. ์—ญ์ง๋ ฌํ™” ๋Œ€์ƒ ํด๋ž˜์Šค๊ฐ€ ์–ธ์ œ ๋ณ€๊ฒฝ์ด ์ผ์–ด๋‚ ์ง€ ๋ชจ๋ฅด๋Š” ํ™˜๊ฒฝ์—์„œ ๊ธด ์‹œ๊ฐ„๋™์•ˆ ์™ธ๋ถ€์— ์กด์žฌํ–ˆ๋˜ ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” Garbage๊ฐ€ ๋  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’๋‹ค.

  • ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ๋ง์ž

  • ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ปจํŠธ๋กค ๊ฐ€๋Šฅํ•œ ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ์—๋Š” ์ง๋ ฌํ™”๋ฅผ ์ง€์–‘ํ•ด์•ผํ•œ๋‹ค. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ปจํŠธ๋กคํ•˜๊ธฐ ํž˜๋“  ๊ฐ์ฒด๋ž€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ํ”„๋ ˆ์ž„ ์›Œํฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค ๊ฐ์ฒด๋ฅผ ๋งํ•œ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ์ฒด๊ฐ€ ์ง์ ‘ serialVersionUID ๋ฅผ ๊ฐ–๊ณ  ์žˆ๊ธฐ๋„ํ•ด, ๊ฐœ๋ฐœ์‹œ ํŽธ์˜์ƒ ์ง๋ ฌํ™” ํ•˜์—ฌ DB๋˜๋Š” ์บ์‹œ์— ๋ฐ”๋กœ ์ €์žฅํ•œ๋‹ค๋ฉด ๊ทธ๋กœ ์ธํ•ด ๋งŽ์€ ๋ฌธ์ œ๊ฐ€ ์•ผ๊ธฐ๋œ๋‹ค.

    • ํ”„๋ ˆ์ž„์›Œํฌ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฒ„์ „์—…์„ ํ•˜๋ฉด์„œ serialVersionUID ๋ณ€๊ฒฝ

์ฆ‰, ๋ณ€๊ฒฝ์— ์ทจ์•ฝํ•˜๋ฏ€๋กœ ์ž๋ฐ” ์ง๋ ฌํ™” ์‚ฌ์šฉ์‹œ์—๋Š” ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ํด๋ž˜์Šค์˜ ๊ฐ์ฒด๋Š” ์‚ฌ์šฉ ์•ˆํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค. ์—ญ์ง๋ ฌํ™”๊ฐ€ ๋˜์ง€ ์•Š์„ ๋•Œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค.

์šฉ๋Ÿ‰ ๋ฌธ์ œ

์ž๋ฐ” ์ง๋ ฌํ™”์‹œ ๊ธฐ๋ณธ์ ์œผ๋กœ ํƒ€์ž…์— ๋Œ€ํ•œ ์ •๋ณด ๋“ฑ ํด๋ž˜์Šค์˜ ๋ฉ”ํƒ€์ •๋ณด๋„ ๊ฐ€์ง€๊ณ  ์žˆ์–ด ์ƒ๋Œ€์ ์œผ๋กœ ๋‹ค๋ฅธ ํฌ๋งท์— ๋น„ํ•ด ์šฉ๋Ÿ‰์— ๋Œ€ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค. ํŠนํžˆ ํด๋ž˜์Šค์˜ ๊ตฌ์กฐ๊ฐ€ ๊ฑฐ๋Œ€ํ•ด์งˆ ์ˆ˜๋ก ์šฉ๋Ÿ‰์ฐจ์ด๊ฐ€ ๋ฐœ์ƒํ•˜๊ฒŒ ๋œ๋‹ค.

  • ์šฐํ•˜ํ•œ ํ˜•์ œ๋“ค ๊ธฐ์ˆ ๋ธ”๋กœ๊ทธ ์˜ˆ์ œ ์ฝ”๋“œ

             String base64Member = "rO0ABXNyABp3b293YWhhbi5ibG9nLmV4YW0xLk1lbWJlcgAAAAAAAAABAgAESQADYWdlSQAEYWdlMkwABWVtYWlsdAASTGphdmEvbGFuZy9TdHJpbmc7TAAEbmFtZXEAfgABeHAAAAAZAAAAAHQAFmRlbGl2ZXJ5a2ltQGJhZW1pbi5jb210AAnquYDrsLDrr7w=";
        byte[] serializedMember = Base64.getDecoder().decode(base64Member);
        System.out.printf("serializedMember (byte size = %s) \n", serializedMember.length);
        try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedMember)) {
            try (ObjectInputStream ois = new ObjectInputStream(bais)) {
                // ์—ญ์ง๋ ฌํ™”๋œ Member ๊ฐ์ฒด๋ฅผ ์ฝ์–ด์˜จ๋‹ค.
                Object objectMember = ois.readObject();
                Member member = (Member) objectMember;
                // JSON์œผ๋กœ ์ง๋ ฌํ™” ํ–ˆ์„ ๋•Œ ์šฉ๋Ÿ‰ ์ฒดํฌ
                String memberJson = objectMapper.writeValueAsString(member);
                System.out.println(memberJson);
                System.out.printf("json (byte size = %s)\n", memberJson.getBytes("utf-8").length);
            }
        }
    serializedMember (byte size = 146)         
    {"name":"๊น€๋ฐฐ๋ฏผ","email":"deliverykim@baemin.com","age":25}
    json (byte size = 62)

๊ฐ„๋‹จํ•œ ๋ฐ์ดํ„ฐ์ด์ง€๋งŒ JSON์œผ๋กœ ์ง๋ ฌํ™” ํ–ˆ์„๋•Œ ๋ณด๋‹ค ๋‘๋ฐฐ ์ด์ƒ์˜ ์šฉ๋Ÿ‰ ํฌ๊ธฐ๊ฐ€ ์ฐจ์ด๋‚˜๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋‹ค. ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์„œ๋ฒ„(Redis, Memcached)์— ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ๋ฅผ ๊ฐ€์ง„ ์‹œ์Šคํ…œ์—์„œ ๋”์šฑ ๋‘๋“œ๋Ÿฌ์ง„๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์„œ๋ฒ„ ํŠน์„ฑ์ƒ ๋ฉ”๋ชจ๋ฆฌ ์šฉ๋Ÿ‰์ด ํฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ํ•ต์‹ฌ๋งŒ ์š”์•ฝํ•ด ์‚ฌ์šฉํ•˜๋Š” ํ˜•ํƒœ๊ฐ€ ํšจ์œจ์ ์ด๋‹ค.

์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ์บ์‹œ ๋ชจ๋“ˆ(Spring Data Redis, Spring Session) ์ค‘ ์™ธ๋ถ€ ์‹œ์Šคํ…œ์— ์ €์žฅํ•˜๋Š” ํ˜•ํƒœ์—์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ž๋ฐ” ์ง๋ ฌํ™” ํ˜•ํƒœ๋กœ ์ œ๊ณต๋˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ถ€๋ถ„์€ ๊ผญ ์ฃผ์˜ํ•ด์•ผํ•œ๋‹ค.

ํ˜ธํ™˜์„ฑ

์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ์ด์šฉํ•ด ์™ธ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ฉด, ์ž๋ฐ”์—์„œ๋งŒ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ ์ด ๊ฐ€์žฅ ์•„์‰ฌ์šด ์ ์ด๋‹ค. JSON ํ˜•ํƒœ๋กœ ์ €์žฅ๋˜์–ด์žˆ๋‹ค๋ฉด, ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋„ ์กฐ์ž‘์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

์ฐธ๊ณ 

Last updated