Programming/Java

F018 - Serializable (์ง๋ ฌํ™”, ์—ญ์ง๋ ฌํ™”)

osean 2021. 6. 16. 01:12
โœ๏ธ ์—…๋ฌด๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ Domain ํด๋ž˜์Šค์— Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒฝ์šฐ๋ฅผ ๋ดค๋˜ ๊ฒฝํ—˜์ด ์žˆ๋Š”๋ฐ, ๋‹น์‹œ์—๋Š” ์™œ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š”์ง€ ์ฐพ์•„๋ณด์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœํ–ˆ์—ˆ๋‹ค.

์ด๋ฒˆ ์‹œ๊ฐ„์—๋Š” Serializable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ์–ด๋–ค ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๋Š”์ง€ ๊ณต๋ถ€ํ•ด๋ณด์ž

Serializable

public class SerializableTest implements Serializable {
	...
}

์‚ฌ์ „์  ์˜๋ฏธ๋กœ๋Š” ์ง๋ ฌํ™”๋ผ๋Š” ๋œป์„ ๊ฐ€์ง„๋‹ค. ์ง๋ ฌํ™”๋Š” ๋ฌด์—‡์ผ๊นŒ?

๋ชจ๋ž˜์‹œ๊ณ„ ์•ˆ์— ์žˆ๋Š” ๋ชจ๋ž˜๋ญ‰์น˜๊ฐ€ ์ข์€ ํ†ต๋กœ๋ฅผ ํ†ต๊ณผ ํ•  ๋•Œ ๊ฐ๊ฐ์˜ ์•Œ๊ฐฑ์ด๋กœ ๋‚˜๋‰˜์–ด์ ธ ์ง€๋‚˜๊ฐ€๋Š” ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” Serializable ๊ณผ ๋น„์Šทํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋œ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์™ธ๋ถ€์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ  ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ Stream ์ด์šฉํ•˜์—ฌ ํ†ต์‹ ํ•˜๋Š”๋ฐ, ์ด ๋•Œ Stream์€ byte ํ˜น์€ byte[] ๋งŒ ํ†ต๊ณผ ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฐฐ์› ๋‹ค.

์ด ๋ง์€ ๋ฐ์ดํ„ฐ๋ฅผ byte ๋‹จ์œ„๋กœ ๋‚˜๋ˆ„์–ด์•ผ๋งŒ Stream์„ ํ†ตํ•ด ์™ธ๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์ด๋‹ค.

์ฆ‰, ๋ฐ์ดํ„ฐ(๋ชจ๋ž˜๋ญ‰์น˜)๋ฅผ ์ข์€ ํ†ต๋กœ(Stream)์— ์ง€๋‚˜๊ฐ€๊ฒŒ ํ•˜๋ ค๋ฉด ๋ชจ๋ž˜ ์•Œ๊ฐฑ์ด(byte ํ˜น์€ byte[])๋กœ ๋‚˜๋ˆ„๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•œ๋ฐ, Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด ํ•ด๊ฒฐ ํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ“ ํ˜„์žฌ ๋™์ž‘ ์ค‘์ธ JVM์—์„œ ์ƒˆ๋กญ๊ฒŒ ๋งŒ๋“  ๊ฐ์ฒด๋ฅผ JVM ์™ธ๋ถ€์— ํŒŒ์ผ๋กœ ์ €์žฅํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

๐Ÿ“ ์ €์žฅ์žฅ์น˜์— ์ €์žฅ๋˜์–ด ์žˆ๋Š” ๊ฐ์ฒด ํŒŒ์ผ์„ ์ฝ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

๐Ÿ“ ๋‹ค๋ฅธ ์„œ๋ฒ„์—์„œ ์ „์†กํ•œ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ฑฐ๋‚˜, ํ˜„์žฌ ๋™์ž‘ ์ค‘์ธ ์„œ๋ฒ„์—์„œ ์™ธ๋ถ€ ์„œ๋ฒ„ ํ˜น์€ ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

์œ„์˜ ๊ฒฝ์šฐ ์™ธ์—์„œ๋„ ๋‹ค์–‘ํ•œ ์ƒํ™ฉ์—์„œ ์‚ฌ์šฉ๋˜๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์™ธ๋ถ€๋กœ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๋ ค๊ณ  ํ•  ๋•Œ Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜์ง€ ์•Š๋Š”๋‹ค๋ฉด InvalidClassException ์˜ˆ์™ธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

์ด๋Š” ๊ฐ„๋‹จํžˆ ์˜ˆ๋ฅผ ๋“ค๋ฉด Stream์„ ํ†ต๊ณผํ•˜๋ ค๊ณ  ํ•˜๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ Stream ์ž…๊ตฌ์— ๋งž์ง€ ์•Š์•„ ํ†ต๊ณผ๋ฅผ ๋ชปํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

SerialVersionUID - ์—ญ์ง๋ ฌํ™”์˜ ์กฐ๊ฑด

public class HashMap<K,V> extends AbstractMap<K,V>
    implements Map<K,V>, Cloneable, Serializable {

    private static final long serialVersionUID = 362498820763181265L;
        ...
}

Java API ๋‚ด๋ถ€์— ์žˆ๋Š” ํด๋ž˜์Šค๋“ค์„ ์‚ดํŽด๋ณด๋ฉด ์ข…์ข… ์œ„์˜ ์ฝ”๋“œ์ฒ˜๋Ÿผ UID๊ฐ€ ๋ฉค๋ฒ„ ํ•„๋“œ๋กœ ์„ ์–ธ๋˜์–ด ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธ ํ•  ์ˆ˜ ์žˆ๋‹ค. ํ•ด๋‹น ๋ณ€์ˆ˜์˜ ์˜๋ฏธ๋Š” ๋ฌด์—‡์ผ๊นŒ?

์•„๋ž˜์™€ ๊ฐ™์€ ๊ฐ์ฒด์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด๋ณด์ž.

public static class SerialDto implements Serializable {
        private String name;
        private String address;
        private String phoneNumber;
        private String sex;

        public SerialDto(String name, String address, String phoneNumber, String sex) {
            super();
            this.name = name;
            this.address = address;
            this.phoneNumber = phoneNumber;
            this.sex = sex;
        }

        @Override
        public String toString() {
            return "์ด๋ฆ„ : " + name + " / ์ฃผ์†Œ : " + address + " / ์ „ํ™”๋ฒˆํ˜ธ : " + phoneNumber + " / ์„ฑ๋ณ„ : " + sex;
        }
    }

ํ•ด๋‹น ๊ฐ์ฒด๋Š” Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •์ƒ์ ์œผ๋กœ JVM ์™ธ๋ถ€์— ๋ฐ์ดํ„ฐ๋ฅผ ์“ฐ๊ฑฐ๋‚˜ ๋™์ผํ•œ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์–ด์˜ฌ ์ˆ˜ ์žˆ๋‹ค.

๊ทธ๋Ÿฐ๋ฐ ๋งŒ์•ฝ ์™ธ๋ถ€์—์„œ ์ฝ์–ด์˜จ SerialDto ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ํ˜„์žฌ ์ˆ˜ํ–‰ ์ค‘์ธ JVM์— ์กด์žฌํ•˜๋Š” SerialDto ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ๋ณ€์ˆ˜๊ฐ€ ๋‹ค๋ฅด๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ?

์ด ๋•Œ, ์‚ฌ๋žŒ์˜ ์ž…์žฅ์—์„œ๋Š” ๋ฉค๋ฒ„ ํ•„๋“œ๊ฐ€ ์กฐ๊ธˆ ๋‹ค๋ฅด๊ธฐ๋Š” ํ•˜์ง€๋งŒ ๊ฐ™์€ SerialDto์ด๋‹ค. ํ•˜์ง€๋งŒ JVM ์ž…์žฅ์—์„œ๋Š” ๋ฉค๋ฒ„ ํ•„๋“œ๊ฐ€ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ „ํ˜€ ๋‹ค๋ฅธ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•œ๋‹ค.
์ด๋Š” ๋ณ€์ˆ˜์˜ ์ถ”๊ฐ€๋‚˜ ๋ณ€๊ฒฝ ๋“ฑ์˜ ์ž‘์—…์ด ์ง„ํ–‰๋˜๋ฉด serialVersionUID์˜ ๊ฐ’์ด ์ž๋™์œผ๋กœ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ™์€ ๊ฐ์ฒด๋กœ ์ธ์‹ํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

์ด๋ ‡๊ฒŒ ๋ณ€๊ฒฝ์ด ์ž์ฃผ ์ผ์–ด๋‚˜๋Š” ๊ฒฝ์šฐ์— ๋ฐœ์ƒํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ serialVersionUID ๋ณ€์ˆ˜๋ฅผ ๋ฉค๋ฒ„ ํ•„๋“œ๋กœ ์„ ์–ธํ•œ๋‹ค.

public static class SerialDto implements Serializable {
                final static long serialVersionUID = 1L;

        private String name;
        private String address;
        private String phoneNumber;
        private String sex;

                ...
}

์ด๋ ‡๊ฒŒ ํด๋ž˜์Šค์˜ ๋ฉค๋ฒ„ ํ•„๋“œ๋กœ serialVersionUID ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๋ฉด ๋ณ€์ˆ˜์˜ ์ถ”๊ฐ€๋‚˜ ๋ณ€๊ฒฝ ๋“ฑ์— ์˜ํ–ฅ ๋ฐ›์ง€ ์•Š๊ณ  ๊ฐ™์€ ๊ฐ์ฒด๋กœ ์ธ์‹ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

trasient

์ง๋ ฌํ™” ๋œ ๊ฐ์ฒด ์ค‘ ํŠน์ • ๋ฉค๋ฒ„ ํ•„๋“œ๋Š” ์ œ์™ธํ•˜๊ณ  ์ €์žฅํ•˜์—ฌ ์™ธ๋ถ€์—์„œ ํ•ด๋‹น ๊ฐ์ฒด๋ฅผ ์—ญ์ง๋ ฌํ™” ํ•  ๋•Œ ์ œ์™ธ๋œ ๋ฉค๋ฒ„ ํ•„๋“œ๋Š” ํ™•์ธ ํ•  ์ˆ˜ ์—†๊ฒŒ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์กด์žฌํ•œ๋‹ค.

์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์—๋Š” ๋ฉค๋ฒ„ ํ•„๋“œ์— ํ•œํ•ด transient ์˜ˆ์•ฝ์–ด๋ฅผ ์„ ์–ธํ•ด์ฃผ๋ฉด ํ•ด๋‹น ๋ฉค๋ฒ„ ํ•„๋“œ๋Š” ๊ฐ์ฒด ์ง๋ ฌํ™”์—์„œ ์ œ์™ธ๋œ๋‹ค.

private transient String nickname;

์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ?

์ง๋ ฌํ™”์˜ ๋ฐฉ๋ฒ•์—๋Š” ๋ฌธ์ž์—ด ์ง๋ ฌํ™”(csv, json)์™€ ์ด์ง„ ์ง๋ ฌํ™” ๊ทธ๋ฆฌ๊ณ  Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ด์šฉํ•œ ์ง๋ ฌํ™” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
์œ„์˜ ๋ฐฉ๋ฒ• ์ค‘ ์ƒํ™ฉ์— ๋งž๊ฒŒ ์‚ฌ์šฉํ•˜๋ฉด ๋˜์ง€๋งŒ, Java ํ”„๋กœ๊ทธ๋ž˜๋ฐ์—์„œ ์™œ ๊ตณ์ด Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•˜๋Š”๊ฑธ๊นŒ?

๐Ÿ“ Java ์‹œ์Šคํ…œ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ๋Š” ๊ตฌ์กฐ
โ†’ ๋ณ„๋„์˜ ์ž‘์—…์—†์ด ๋ฉค๋ฒ„ ํ•„๋“œ์˜ ํƒ€์ž…์„ ์•Œ์•„์„œ ๋งคํ•‘ํ•ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ์‹ ๊ฒฝ ์จ์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์ค„์–ด๋“ ๋‹ค.

๐Ÿ“ ๋•Œ๋ฌธ์— ์—ญ์ง๋ ฌํ™”๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ๋ฐ”๋กœ ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ์— ์ ‘๊ทผ ํ•  ์ˆ˜ ์žˆ๋‹ค.
ํ•˜์ง€๋งŒ SerialVersionUID ๊ฐ’์„ ๋ชจ๋“  ๊ฐ์ฒด์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ์ž๊ฐ€ ์ผ์ผํžˆ ์ž‘์—…ํ•ด์ค˜์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€์ด ์กด์žฌํ•œ๋‹ค.

๐Ÿ“ ์ด๋กœ ์ธํ•ด ๋ณ„๋„๋กœ SUID๋ฅผ ์ง€์ •ํ•˜์ง€ ์•Š์€ ๊ฐ์ฒด๋Š” ํ•ด๋‹น ๊ฐ์ฒด์˜ ๋‚ด๋ถ€ ๊ตฌ์กฐ๊ฐ€ ๋ณ€๊ฒฝ๋  ๊ฒฝ์šฐ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์—†๊ฒŒ ๋œ๋‹ค.

์ด๋Ÿฌํ•œ ์ง๋ ฌํ™”๋Š” JVM ๋ฉ”๋ชจ๋ฆฌ์—๋งŒ ์ƒ์ฃผํ•˜๊ณ  ์žˆ๋Š” ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๋ฅผ ๊ทธ๋Œ€๋กœ ์˜์†ํ™”๊ฐ€ ํ•„์š”ํ•  ๋•Œ ์‚ฌ์šฉ๋˜๋Š”๋ฐQueryDSL ๊ธฐ์ˆ ์ด ๋– ์˜ค๋ฅธ๋‹ค.
์ด๋Š” ์‹œ์Šคํ…œ์ด ์ข…๋ฃŒ๋˜๋”๋ผ๋„ ๊ฐ์ฒด ๋ฐ์ดํ„ฐ๊ฐ€ ์—†์–ด์ง€์ง€ ์•Š๋Š” ์žฅ์ ์„ ๊ฐ€์ง€๋Š”๋ฐ, ๋•๋ถ„์— ๋„คํŠธ์›Œํฌ๋กœ์˜ ์ „์†ก๋„ ๊ฐ€๋Šฅํ•ด์ง„๋‹ค.


์ฐธ๊ณ  ์‚ฌ์ดํŠธ

 

์ž๋ฐ” ์ง๋ ฌํ™”, ๊ทธ๊ฒƒ์ด ์•Œ๊ณ ์‹ถ๋‹ค. ํ›‘์–ด๋ณด๊ธฐํŽธ - ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ

์ž๋ฐ”์˜ ์ง๋ ฌํ™” ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๋Œ€ํ•œ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค. ๊ฐ„๋‹จํ•œ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€ ํ˜•ํƒœ๋กœ ์ž๋ฐ” ์ง๋ ฌํ™”์— ๋Œ€ํ•œ ๊ฐ„๋‹จํ•œ ์„ค๋ช…๊ณผ ์ง์ ‘ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ๊ฒช์€ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค ํ•ฉ๋‹ˆ๋‹ค.

woowabros.github.io

 

 

์ž๋ฐ” ์ง๋ ฌํ™”, ๊ทธ๊ฒƒ์ด ์•Œ๊ณ ์‹ถ๋‹ค. ์‹ค๋ฌดํŽธ - ์šฐ์•„ํ•œํ˜•์ œ๋“ค ๊ธฐ์ˆ  ๋ธ”๋กœ๊ทธ

์ž๋ฐ”์˜ ์ง๋ ฌํ™” ๊ธฐ์ˆ ์— ๋Œ€ํ•œ ๋Œ€ํ•œ ๋‘ ๋ฒˆ์งธ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.์‹ค์ œ ์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ์‹ค๋ฌด์— ์ ์šฉํ•ด๋ณด๋ฉด์„œ ์ฃผ์˜ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด๋ณด๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

woowabros.github.io