Java Serialization ๊ฐœ๋… ์ •๋ฆฌ

๋ธ”๋กœ๊ทธ ์˜ฎ๊ฒผ์Šต๋‹ˆ๋‹ค! ๐Ÿก’ 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๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ์ง๋ ฌํ™” ๋Œ€์ƒ์—์„œ ์ œ์™ธ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ œ์—†์ด ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ๋‹ค.

์ง๋ ฌํ™”๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ์ƒํ™ฉ์€?

  • 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๊ฐ€ ๊ฐ™๋‹ค๊ณ  ๋ฌด์กฐ๊ฑด ๋ฌธ์ œ์—†์ด ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์€ ์•„๋‹ˆ๋‹ค.
    • ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ํƒ€์ž…์ด ๋‹ค๋ฅด๋ฉด ํƒ€์ž… ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค.
    • ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๋ฅผ ์ œ๊ฑฐํ•˜๊ฑฐ๋‚˜ ๋ณ€์ˆ˜๋ช…์„ ๋ฐ”๊พธ๋ฉด ์˜ˆ์™ธ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์ง€๋งŒ ๋ฐ์ดํ„ฐ๋Š” ๋ˆ„๋ฝ๋œ๋‹ค.

์‹ค๋ฌด ์‚ฌ์šฉ ์กฐ์–ธ

์ž๋ฐ” ์ง๋ ฌํ™”, ๊ทธ๊ฒƒ์ด ์•Œ๊ณ ์‹ถ๋‹ค. ์‹ค๋ฌดํŽธ์—์„œ ๋ฐœ์ทŒํ•œ ๋‚ด์šฉ

  1. serialVersionUID๋Š” ๊ฐœ๋ฐœ ์‹œ ์ง์ ‘ ๊ด€๋ฆฌ
  2. ์—ญ์ง๋ ฌํ™” ๋Œ€์ƒ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜ ํƒ€์ž…๋ณ€๊ฒฝ ์ง€์–‘
  3. ์™ธ๋ถ€(DB, ์บ์‹œ ์„œ๋ฒ„, NoSQL ์„œ๋ฒ„ ๋“ฑ)์— ์žฅ๊ธฐ๊ฐ„ ์ €์žฅ๋  ์ •๋ณด๋Š” Java ์ง๋ ฌํ™” ์‚ฌ์šฉ ์ง€์–‘ (ํด๋ž˜์Šค ๋ณ€๊ฒฝ์„ ์˜ˆ์ธกํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ)
  4. ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ปจํŠธ๋กคํ•  ์ˆ˜ ์—†๋Š” ํด๋ž˜์Šค(ํ”„๋ ˆ์ž„์›Œํฌ ๋˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค)๋Š” ์ง๋ ฌํ™” ์ง€์–‘
  5. ์ž์ฃผ ๋ณ€๊ฒฝ๋˜๋Š” ํด๋ž˜์Šค๋Š” Java ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ์ข‹๋‹ค.
  6. ์—ญ์ง๋ ฌํ™”์— ์‹คํŒจํ•˜๋Š” ์ƒํ™ฉ์— ๋Œ€ํ•œ ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•„์ˆ˜
  7. ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋Š” ํƒ€์ž… ์ •๋ณด๋“ฑ์˜ ํด๋ž˜์Šค ๋ฉ”ํƒ€์ •๋ณด๋ฅผ ํฌํ•จํ•˜๊ธฐ ๋•Œ๋ฌธ์— JSON ํฌ๋งท์— ๋น„ํ•ด ์•ฝ 2~10๋ฐฐ ๋” ์‚ฌ์ด์ฆˆ๊ฐ€ ํฌ๋‹ค. ํŠนํžˆ ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์„œ๋ฒ„(Redis, Memcached)์— ์ €์žฅํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ํŠธ๋ž˜ํ”ฝ์— ๋”ฐ๋ผ ๋„คํŠธ์›Œํฌ ๋น„์šฉ๊ณผ ์บ์‹œ ์„œ๋ฒ„ ๋น„์šฉ์ด ๊ธ‰์ฆํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, JSON ํฌ๋งท์œผ๋กœ์˜ ๋ณ€๊ฒฝ์„ ๊ณ ๋ คํ•ด์•ผ ํ•œ๋‹ค.

Reference