โ๏ธ ์ ๋ฌด๋ฅผ ์งํํ๋ฉด์ 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
'Programming > Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Effective Java] ์ EnumSet ๊ณผ EnumMap ์ ์ฌ์ฉํด์ผ ํ๋๊ฐ (0) | 2022.11.20 |
---|---|
F019 - Socket (0) | 2021.06.22 |
F017 - Blocking, Non-Blocking / Synchronous, Asynchronous (2) | 2021.06.15 |
F016 - File, I/O, Stream (0) | 2021.06.14 |
F015 - Set (์์ฑ ์ค) (0) | 2021.05.31 |