โ˜• ์ž๋ฐ” : JAVA

[Java] ์ž๋ฐ” ์ง๋ ฌํ™” (Serialization)

๊ฐœ๋ฐœ์ž HOON 2023. 1. 6. 15:43

 

๐Ÿค” 1. ์ž๋ฐ” ์ง๋ ฌํ™”๋ž€?

 

์ž๋ฐ” ์ง๋ ฌํ™”(Java Serialization)์€, ๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์˜์†ํ™” ํ•˜๋Š” ๋งค์ปค๋‹ˆ์ฆ˜์ž…๋‹ˆ๋‹ค.

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

 

๋‹จ์ˆœํžˆ ์ €์žฅ์ด๋ผ๊ณ  ํ‘œํ˜„ํ–ˆ์ง€๋งŒ, ์ผ๋ฐ˜์ ์œผ๋กœ ์šฐ๋ฆฌ๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ €์žฅ, ํŒŒ์ผ์˜ ํ˜•ํƒœ๋กœ ์ €์žฅ๋„ ํ•ด๋‹น์ด ๋˜์ง€๋งŒ, ๋ฉ”๋ชจ๋ฆฌ ๋ฐ ์บ์‹œ์— ์ €์žฅํ•˜๋Š” ๊ฒƒ ์—ญ์‹œ ์ง๋ ฌํ™”๋ผ๊ณ  ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 

 

์ž๋ฐ” ์ง๋ ฌํ™”๋ฅผ ํ†ตํ•ด ๊ฐ์ฒด๋ฅผ ์˜จ์ „ํžˆ ๋‹ค๋ฅธ ๊ณณ์— ์ €์žฅํ•˜๊ณ , ๋‹ค์‹œ ์˜จ์ „ํ•œ ๊ฐ์ฒด๋กœ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์‰ฝ๊ฒŒ ๋ถ„์‚ฐ ๊ฐ์ฒด ์ƒ์„ฑ์ด ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค. ์ž๋ฐ” ์ง๋ ฌํ™”์—์„œ ์ €์žฅํ•˜๋Š” ๋ฐฉ์‹์€, ๊ฐ์ฒด๋ฅผ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์˜ ํ˜•ํƒœ๋กœ ๋งŒ๋“ค์–ด ์ด๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค.

 

 

๐Ÿค” 2. ์ž๋ฐ” ์ง๋ ฌํ™”๋Š” ์–ธ์ œ ์“ฐ๋‚˜์š”?

 

๊ฐ์ฒด์˜ ์ƒํƒœ๋ฅผ ์˜์†(์–ด๋”˜๊ฐ€์— ์˜๊ตฌ์ ์œผ๋กœ ์ €์žฅ)ํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ฐ์ฒด๋กœ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ, ๋‹ค๋ฅธ VM์—๊ฒŒ ๊ฐ์ฒด์˜ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•  ๋•Œ ์‚ฌ์šฉํ•˜๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. (Remote Method Invocation ํ˜น์€ Socket์„ ์‚ฌ์šฉํ•ด์„œ.)

 

์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹จ์ˆœํ•ฉ๋‹ˆ๋‹ค.

package java.io;

public interface Serializable {}

public class MyObject implemets Serializable{
	public int value;
    
    public MyObject(final int value){
   		this.value = value;
    }
}

 

์œ„์˜ ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด Serializable ์ธํ„ฐํŽ˜์ด์Šค๋Š” ๊ณต๊ฐœ API๊ฐ€ ์—†๋Š” ๋‹จ์ˆœํ•œ ๋งˆ์ปค ์ธํ„ฐํŽ˜์ด์Šค์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implements ํ•ด์ฃผ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋„ ํ•ด๋‹น ๊ฐ์ฒด๋Š” ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•œ ๊ฐ์ฒด๋กœ ๋ณ€์‹ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!

๋งŒ์•ฝ Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ implementsํ•˜์ง€ ์•Š๋Š” ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํ™” ํ•˜๋ ค๊ณ  ํ•œ๋‹ค๋ฉด, NotSerializableException์ด ๋ฐœ๋ฐœํ•˜๊ฒŒ ๋˜๋ฏ€๋กœ ์ฃผ์˜๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค!

 

byte[] serailizedObject;

try (ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
	ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream)) {
    	MyObject myObject = new MyObject(1);
        objectOutputStream.writeObject(myObject);
        serializedObject = byteArrayOutputStream.toByteArray();
    }

์ง๋ ฌํ™”๋ฅผ ํ•˜๋Š” ๊ฒƒ์€ java.io.ObjectOutputStream์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. try-with-resource ๋ฌธ์„ ์‚ฌ์šฉํ•ด byteArrayOutputStream๊ณผ ObjectOutputStream์„ ์ƒ์„ฑํ•œ ๋’ค, writeObject ๋ฉ”์†Œ๋“œ์™€ toByteArray ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด ์ง๋ ฌํ™”๋ฅผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

๋ฐ˜๋Œ€๋กœ ์—ญ์ง๋ ฌํ™”๋Š” java.io.ObjectInputStream๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. 

์—ญ์ง๋ ฌํ™”๋Š”, ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ์ฒด๋กœ ์žฌ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

byte[] serializedObject = getSerializedObject();

try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(serializedObject);
	ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream)){
    	MyObject myObject = (MyObject) objectInputStream.readObject();
    }

๊ทธ๋ฆฌ๊ณ  ObjectInputStream์˜ readObject ๋ฉ”์†Œ๋“œ์™€ ํƒ€์ž… ์บ์ŠคํŒ…์„ ํ†ตํ•ด ์—ญ์ง๋ ฌํ™”๋ฅผ ์ง„ํ–‰ํ•ด ๊ฒฐ๊ตญ, ๊ฐ์ฒด๋ฅผ ์˜จ์ „ํžˆ ์žฌ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

https://www.youtube.com/watch?v=3iypR-1Glm0

์ „์ฒด์ ์ธ ํ”Œ๋กœ์šฐ๋Š” ์œ„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

 

๐Ÿค” 3. SerialVersionUID์˜ ์šฉ๋„๋Š” ๋ฌด์—‡์ผ๊นŒ?

 

Serialization์„ implementsํ•˜๋Š” ๊ฐ์ฒด๋“ค์€, ํด๋ž˜์Šค์˜ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•ด serialVersionUID ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด serialVersionUID ๋ณ€์ˆ˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉด, ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์•Œ์•„์„œ ๋ถ€์—ฌํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

์ด serialVersionUID๋Š” ์ง๋ ฌํ™” ํ•  ๋•Œ ๊ฐ™์ด ์ €์žฅ๋˜๊ฒŒ ๋˜๊ณ , ์—ญ์ง๋ ฌํ™”๋ฅผ ํ•  ๋•Œ์—๋Š” ๊ทธ ๊ฐ’์„ ์ฒดํฌํ•˜๋Š” ์šฉ๋„๋กœ ์‚ฌ์šฉํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์˜ˆ๋ฅผ ๋“ค์–ด serialVersionUID ๊ฐ’์„ 1L๋กœ ์„ค์ •ํ•œ ํ›„ ์ง๋ ฌํ™”๋ฅผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„, ํ•ด๋‹น ํด๋ž˜์Šค์˜ serialVersionUID ๊ฐ’์„ 2L๋กœ ๋ณ€๊ฒฝํ•œ ๋’ค, ์—ญ์ง๋ ฌํ™”๋ฅผ ์‹œ๋„ํ•˜๋ฉด invalidClassException์ด ๋ฐœ์ƒํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰ ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ๊ฐ€๋Šฅ์ผ€ ํ•˜๋Š” ๊ฒƒ์ด์ฃ .

 

SerialVersionUID๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ์ด์œ ๋Š” ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ž„์˜ ๋ถ€์—ฌ์— ์žˆ์Šต๋‹ˆ๋‹ค. JVM์˜ ๋‚ด๋ถ€ ์•Œ๊ณ ๋ฆฌ์ฆ˜์— ์˜ํ•ด ํ•ด๋‹น ๊ฐ’์ด ๊ฒฐ์ •๋˜๊ฒŒ ๋˜๋Š”๋ฐ, ๋ฌธ์ œ๋Š” ์–ด๋–ค JVM์„ ์‚ฌ์šฉํ•˜๋Š”์ง€์— ๋”ฐ๋ผ์„œ ์ด ๊ฐ’์ด ๋‹ฌ๋ผ์ง€๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

๋”ฐ๋ผ์„œ Client๊ฐ€ Windows, ์„œ๋ฒ„๊ฐ€ Linux์ธ ๊ฒฝ์šฐ ์„œ๋กœ ๋‹ค๋ฅธ JVM์„ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ์ด ๊ฐ’์ด ๋‹ฌ๋ผ์ ธ ์—ญ์ง๋ ฌํ™”๋ฅผ ์ง„ํ–‰ํ•  ๋•Œ Exception์ด ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

 

๐Ÿค” 4. ์™œ ์ž๋ฐ” ์ง๋ ฌํ™”๋Š” ์ž˜ ์•ˆ ์“ฐ๊ฒŒ ๋˜๋Š” ๊ฑธ๊นŒ?

 

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

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

์˜ˆ๋ฅผ ๋“ค์–ด ํ™•์ธํ•ด๋ด…์‹œ๋‹ค.

 

1) ๋ณด์•ˆ ๋ฌธ์ œ

์ง๋ ฌํ™”๋œ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์„ ์—ญ์ง๋ ฌํ™” ํ•  ๋•Œ์—๋Š” readObject ๋ฉ”์†Œ๋“œ๊ฐ€ ํ˜ธ์ถœ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ๊ทผ๋ฐ ์ด๊ฒƒ ์ž์ฒด๊ฐ€ ํ•˜๋‚˜์˜ ์ƒ์„ฑ์ž์™€ ๋‹ค๋ฅผ๊ฒŒ ์—†์Šต๋‹ˆ๋‹ค. ์ฆ‰, ๋ณด์ด์ง€ ์•Š๋Š” ์ƒ์„ฑ์ž์˜ ๋ฌธ์ œ๊ฐ€ ์ƒ๊ธฐ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

์ด๊ฒŒ ์™œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ƒ๋ฉด, ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์˜ ๋ฐฐ์—ด ๋‚ด๋ถ€์˜ ๊ฐ’์„ ์ง์ ‘ ์ ‘๊ทผํ•ด ์ˆ˜์ •์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ด ์ƒํƒœ๋กœ objectInputStream์„ ์ƒ์„ฑํ•˜๊ณ , readObject๋ฅผ ํ•œ๋‹ค๋ฉด ๊ทธ๋Œ€๋กœ ์ƒ์„ฑ์ด ๋ฉ๋‹ˆ๋‹ค. ๊ธฐ์กด์˜ ์ƒ์„ฑ์ž์—์„œ๋Š” validation๋กœ์ง์„ ๋„ฃ์–ด์„œ ๊ฐ’์˜ ์œ ํšจ์„ฑ์„ ํŒ๋‹จํ–ˆ์ง€๋งŒ, readObject๋ฅผ ํ†ตํ•ด ๋งŒ๋“ค์–ด์ง„ ๊ฐ์ฒด๋Š” ๋ณด์ด์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์ƒ์„ฑ์ž๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

 

์ด๋ฅผ ๋ฐฉ์–ดํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ๋Š”, ์ปค์Šคํ…€ ์ง๋ ฌํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค. readObject๋ฅผ ์ƒˆ๋กญ๊ฒŒ ์ •์˜ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ๊ธฐ์กด์˜ objectInputStream.defaultReadObject() ๋ฉ”์„œ๋“œ๋ฅผ ํ†ตํ•ด ๊ธฐ์กด์˜ ์—ญ์ง๋ ฌํ™” ๊ณผ์ •์„ ์‹œํ‚ค๊ณ , ์ถ”๊ฐ€์ ์ธ validation ์ฝ”๋“œ๋ฅผ ์—ฌ๊ธฐ์— ์‚ฝ์ž…ํ•ด์ฃผ๋ฉด ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

private void readObject(ObjectInputStream objectInputStream) throws IOException, ClassNotFoundException {
	objectInputStream.defaultReadObject(); // ๊ธฐ๋ณธ์ ์ธ ์—ญ์ง๋ ฌํ™” ๊ณผ์ •
    // ์ƒ๋žต, ์ถ”๊ฐ€์ ์ธ validation ์ฝ”๋“œ.
}

 

2) ์‹ฑ๊ธ€ํ†ค ๋ฌธ์ œ

 

์‹ฑ๊ธ€ํ†ค ํŒจํ„ด์œผ๋กœ ์–ด๋– ํ•œ ํด๋ž˜์Šค๋ฅผ ๋งŒ๋“ค๊ณ , ์ด๋ฅผ ์ง๋ ฌํ™” ๊ฐ€๋Šฅํ•˜๋„๋ก Serializable ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ–ˆ๋‹ค๊ณ  ํ•ฉ์‹œ๋‹ค.

์‹ฑ๊ธ€ํ†ค ๊ฐ์ฒด๋ฅผ ๋‹ค์‹œ ์—ญ์ง๋ ฌํ™” ํ•˜๋ฉด, ์‹ฑ๊ธ€ํ†ค์˜ ํŠน์„ฑ์„ ์žƒ์–ด๋ฒ„๋ฆฌ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. readObject๊ฐ€ ํ˜ธ์ถœ๋˜๋ฉด ๋‹ค๋ฅธ ๊ฐ์ฒด๊ฐ€ ์ƒ์„ฑ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹ฑ๊ธ€ํ†ค์€ ๋‹จ ํ•˜๋‚˜์˜ ๊ฐ์ฒด๋งŒ ์กด์žฌํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ํ•ญ์ƒ ์œ ์ง€ํ•˜๋Š”๋ฐ ์ด๋ฅผ ๊นจ๋ฒ„๋ฆฌ๊ฒŒ ๋œ๋‹ค๋Š” ๊ฒƒ์ด์ฃ .

 

์ด๋Ÿฌํ•œ ์‹ฑ๊ธ€ํ†ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด readResolve()๋ฅผ ์ •์˜ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. readResolve() ๋ฉ”์†Œ๋“œ๋Š” readObject()๊ฐ€ ํ˜ธ์ถœ๋œ ์ดํ›„์— ํ˜ธ์ถœ๋˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์—ญ์ง๋ ฌํ™”๋ฅผ ๊ฑฐ์นœ ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ , readResolve()์—์„œ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฐ์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์—, ์‹ฑ๊ธ€ํ†ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ฃ .

 

๋‹ค๋งŒ ์ด ๊ฒฝ์šฐ, ํด๋ž˜์Šค์˜ ํ•„๋“œ ์ค‘์—, ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜๊ฐ€ ์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๊ฐ€ ๋˜์ง€ ์•Šํ† ๋ก transient ํ‚ค์›Œ๋“œ๋ฅผ ๋ถ™์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์•ผ ์ฐธ์กฐํ•„๋“œ์˜ ์˜์—ญ๊ฐ’์„ ํ›”์ณ์˜ค๋Š” ํ–‰์œ„๋ฅผ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ์ถ”ํ›„์— ๊ณต๋ถ€๋ฅผ ๋” ํ•ด๋ด์•ผ๊ฒ ์Šต๋‹ˆ๋‹ค.

 

๋ชจ๋“  ์ธ์Šคํ„ด์Šค ๋ณ€์ˆ˜์— ์‚ฌ์šฉํ•ด์•ผ ํ•˜๊ณ , ์ด๋ฅผ ๊ฐ„๊ณผํ•œ๋‹ค๋ฉด ๋ณด์•ˆ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‹ฑ๊ธ€ํ†ค๊ฐ™์ด ๊ฐ์ฒด ๊ฐฏ์ˆ˜ ํ†ต์ œ ํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์—๋Š” readResolve๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ต‰์žฅํžˆ ๋ถˆํŽธํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

์ž๋ฐ” ์ง๋ ฌํ™”๋Š” ์ƒ๊ฐํ•  ๊ฒƒ์ด ๋งŽ์€ ๊ธฐ์ˆ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋Ÿฐ ์ƒ๊ฐ ์—†์ด ์‚ฌ์šฉํ•˜๋‹ค๊ฐ€๋Š” ์—ฌ๋Ÿฌ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์—ฌ์ง€๊ฐ€ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ 10๋ถ„ ํ…Œ์ฝ”ํ†ก์—์„œ๋„ ์›ฌ๋งŒํ•˜๋ฉด ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ–ˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ์‹œ์Šคํ…œ์— ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ์ข‹์€ ๋งค์ปค๋‹ˆ์ฆ˜์ด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. 

 

์˜ˆ๋ฅผ ๋“ค์–ด, ํฌ๋กœ์Šค ํ”Œ๋žซํผ์— ์ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ ํ‘œํ˜„์œผ๋กœ JSON, CSV, ํ”„๋กœํ† ์ฝœ ๋ฒ„ํผ ๋“ฑ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•œ๋‹ค๊ณ  ํ•˜๋„ค์š”.

์ดํŽ™ํ‹ฐ๋ธŒ ์ž๋ฐ”์—์„œ๋„ ์ง๋ ฌํ™” ํŒŒํŠธ์—์„œ ๋งŽ์€ ๋‚ด์šฉ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ๋‹ค๋‹ˆ, ์ถ”๊ฐ€ ํ•™์Šต์„ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

 

 

 

 

๐Ÿ ์ถœ์ฒ˜

[๋งํฌ] https://blog.naver.com/kkson50/220564273220 (SerialVersionUID)
[๋งํฌ] https://www.youtube.com/watch?v=3iypR-1Glm0 (10๋ถ„ ํ…Œ์ฝ”ํ†ก : ์ž๋ฐ” ์ง๋ ฌํ™”)