์ด๋ฒ ๊ธ์์๋ ์๋ฐ ์ง๋ ฌํ์ ๋ํด ์จ๋ณด๊ณ ์ ํ๋ค. ํ๋ ๋ฐฑ์๋ ์์คํ ์์๋ ์๋์์ ์ค๋ช ํ ๋ค์ํ ์ด์ ๋ค๋ก ์ธํด ์๋ฐ์ ๋ฐ์ดํธ ์คํธ๋ฆผ ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ๊ฐ ๋๋ฌธ ๊ฒ์ด ์ฌ์ค์ด๋ค. ๊ทธ ๋์ JSON, XML. Avro์ ๊ฐ์ ์ง๋ ฌํ ํฌ๋งท์ ๋ง์ด ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด ๊ธ์ ์ธ๊น์ ๋ํ ๊ณ ๋ฏผ์ ํ์ง๋ง ์๋ฐ์ ๋ง์ ํด๋์ค๋ค์ด ์ง๋ ฌํ๋ฅผ ๊ตฌํํ๊ณ ์๊ธฐ๋ ํ๊ณ , ์ดํํฐ๋ธ ์๋ฐ์์ ์ฝ์ ๋ด์ฉ์ ๊ธฐ์ตํด๋๊ธฐ ์ํด ๊ธ์ ์ฐ๊ธฐ๋ก ๊ฒฐ์ ํ๋ค.
โ๏ธ ์ง๋ ฌํ
์ง๋ ฌํ๋ JVM์ ํ ๋๋ ์คํ ์์ญ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๊ฐ์ฒด ๋๋ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฅธ ์ปดํจํฐ์ JVM์์๋ ์ฌ์ฉํ ์ ์๋๋ก ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๋ ๊ฒ์ ๋งํ๋ค. ๋ค๋ฅธ ์ปดํจํฐ์ JVM์์ ์ฌ์ฉํ ๋๋ ์ญ์ง๋ ฌํ๋ฅผ ํตํด ์๋ฐ ๊ฐ์ฒด๋ก ๋ค์ ๋ณํ์์ผ ์ฌ์ฉํ๋ค.
์ง๋ ฌํ๋ Serializable์ด๋ผ๋ ์๋ฐ์ ๋ง์ปค ์ธํฐํ์ด์ค๋ฅผ Implements ํ์ฌ ์ฌ์ฉํ ์ ์๋ค. ์ด ๋ ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ์๋ ๊ฐ๊ฐ ObjectOutputStream์ ObjectInputStream์ด ์ฌ์ฉ๋๋ฉฐ ์ง๋ ฌํ๋ ๋๋ ์ค์ง ๊ฐ์ฒด์ ํ๋๊ฐ ๋ง์ ์ ์ฅํ๋ค.
์ง๋ ฌํ ์กฐ์
๊ฐ์ฒด์ ์ง๋ ฌํ๋ฅผ ์กฐ์ํ๋ ๋ฐฉ๋ฒ์๋ 2๊ฐ์ง ๋ฐฉ๋ฒ์ด ์๋ค.
๋จผ์ transient ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ํน์ ํ๋๊ฐ์ ์ง๋ ฌํ ๋์์์ ์ ์ธ ์ํค๋ ๋ฐฉ๋ฒ์ด๋ค. ์ด ๋ transient ํค์๋๊ฐ ๋ถ์ ํ๋ ๊ฐ์ ๊ธฐ๋ณธ๊ฐ์ผ๋ก ์ง๋ ฌํ๋๊ธฐ ๋๋ฌธ์ Primitive ํ์ ์ ๊ฐ ํ์ ์ ๋ํดํธ ๊ฐ, Reference ํ์ ์ null๋ก ์ง๋ ฌํ ๋๋ค.
๋๋ฒ์งธ ๋ฐฉ๋ฒ์, readObject์ writeObject๋ฅผ ์ฌ์ ์ํ๋ ๊ฒ์ด๋ค. ์ด๋ฅผ ํตํด ์ง๋ ฌํ, ์ญ์ง๋ ฌํ ๊ณผ์ ์์ ๊ฒ์ฆ ๋ก์ง ๋๋ ์กฐ๊ฑด๋ถ ๋ก์ง์ ์ถ๊ฐํ ์ ์๋ค.
class Player implements Serializable {
String name;
String password;
int age;
public Customer(String name, String password, int age) {
this.name = name;
this.password = password;
this.age = age;
}
private void writeObject(ObjectOutputStream out) throws IOException{
out.writeObject(name);
out.writeInt(age);
}
private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException{
this.name = (String) in.readObject();
this.age = in.readInt();
}
}
๊ฐ์ฒด ์์ ๊ด๊ณ์์ ์ง๋ ฌํ
๋ถ๋ชจ ํด๋์ค๊ฐ Serializable์ Implements ํ๊ณ ์๋ค๋ฉด ์์ ํด๋์ค๋ Implements ํ์ง ์์๋ ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํ๋ค. ํ์ง๋ง ์์ ํด๋์ค์์๋ง Serializable์ ๊ตฌํํ๋ค๋ฉด ๋ถ๋ชจ ํด๋์ค์ ํ๋๋ ๋ฌด์๋๊ณ ์์ ํด๋์ค์ ํ๋๋ง ์ง๋ ฌํ๋๋ค.
์ง๋ ฌํ ๋ฒ์ ๊ด๋ฆฌ
์ง๋ ฌํ๋ฅผ ๊ตฌํํ ํด๋์ค๋ serialVersionUID๋ผ๋ ๊ณ ์ ์๋ณ๋ฒํธ๋ฅผ ๋ถ์ฌ ๋ฐ์ผ๋ฉฐ, ์ด๋ฅผ ํตํด ์ง๋ ฌํ, ์ญ์ง๋ ฌํ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ ํ๋จํ๋ค. ์ด๋ ์๋์ผ๋ก ์ค์ ํ ์ ์์ผ๋ฉฐ, ์ค์ ํ์ง ์์ ๊ฒฝ์ฐ, ๋ฐํ์์ ๋ฉํ ๋ฐ์ดํฐ๋ฅผ ์ด์ฉํ ํด์ํจ์๋ฅผ ํตํด ์๋์ผ๋ก ์์ฑํ๋ค.
๋ง์ฝ ๋ฒ์ ์ ์ง์ ์ค์ ํด์ฃผ์ง ์๋ ๊ฒฝ์ฐ์๋ ํด๋์ค์ ๋ณ๊ฒฝ์ฌํญ์ด ์๊ธธ ๋๋ง๋ค ํด๋น ํด๋์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋ ๋ชจ๋ ์ฌ์ฉ์์๊ฒ ์ฌ๋ฐฐํฌํด์ผํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธฐ๊ธฐ ๋๋ฌธ์ ํด๋์ค ๋ฒ์ ์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ๊ถ์ฅํ๋ค.
ํ์ง๋ง ํ๋ ๊ฐ์ ์ถ๊ฐ, ์ญ์ , ๋ณ์ ์ด๋ฆ ๋ณ๊ฒฝ, ์ ์ด์ ๋ณ๊ฒฝ์ด ์๋ ํ๋ ๊ฐ์ ํ์ ์ด ๋ณ๊ฒฝ๋๋ค๋ฉด ํด๋์ค ๋ฒ์ ์ด ๊ฐ๋๋ผ๋ incompatible type ์๋ฌ๊ฐ ๋ฐ์ํ๋ค๋ ์ฃผ์ ์ฌํญ์ด ์๋ค.
class Player implements Serializable {
// private static final long์ผ๋ก ์ ์ธํด์ผ ํ๋ค.
private static final long serialVersionUID = 123L;
private String name;
private int age;
}
์ง๋ ฌํ๊ฐ ์ํํ ์ด์
์ง๋ ฌํ์ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ๋ ๊ณต๊ฒฉ ๋ฒ์๊ฐ ๋๋ฌด ๋๊ณ ์ง์์ ์ผ๋ก ๋ ๋์ด์ ธ ๋ฐฉ์ดํ๊ธฐ ์ด๋ ต๋ค๋ ์ ์ด๋ค.์ง๋ ฌํ๋ฅผ ํ ํ, ์ญ์ง๋ ฌํ๋ฅผ ํ ๋ ๋ฌธ์ ๊ฐ ๋๋ค.
- ๊ฐ์ฒด๋ฅผ ์ฝ๋ readObject ๋ฉ์๋๋ ํด๋์ค ํจ์ค์ ์กด์ฌํ๋ ์ง๋ ฌํ๋ ๊ฑฐ์ ๋ชจ๋ ํ์ ์ ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด๋ผ ์ ์๋ค.
- ๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ญ์ง๋ ฌํํ๋ ๊ณผ์ ์์ ํด๋น ํ์ ์์ ๋ชจ๋ ์ฝ๋๋ฅผ ์ํํ ์ ์๋ค.
- ๊ฐ์ฒด๋ฅผ ๋ถ๋ฌ์ฌ ์ ์์ผ๋ฏ๋ก ๋ชจ๋ ์ฝ๋๋ฅผ ์ํํ ์ ์๊ฒ๋๋ค. โก๏ธ ์ ์ฒด๊ฐ ๊ณต๊ฒฉ ๋ฒ์์ ๋ค์ด๊ฐ๊ฒ ๋๋ค.
- ๋ค๋ฅธ ํฌ๋งท์ ๋นํด์ ๋ช ๋ฐฐ ์ด์์ ํฌ๊ธฐ๋ฅผ ๊ฐ์ง๋ค.
- ์ญ์ง๋ ฌํ ํญํ์ ๋ง์ ์๋ ์๋ค.
- ์ง๋ ฌํ๋ฅผ ํ๋ฉด ๋ฆด๋ฆฌ์ฆ ํ ์์ ํ๊ธฐ๊ฐ ์ด๋ ต๋ค.
- ์ง๋ ฌํ๋ ๋ฐ์ดํธ ์คํธ๋ฆผ๋ ํ๋์ API๊ฐ ๋์ด ์ง์์ ์ผ๋ก ์ง์ํด์ผํ๋ค โก๏ธ Private ํ๋๋ค์ด ๋ ธ์ถ๋์ด ์บก์ํ๊ฐ ๊นจ์ง๋ค.
- ์ง๋ ฌํ ํด๋์ค๊ฐ ์์ ๋๋ฉด ์ ๋ฒ์ ์ ์ง๋ ฌํ ํ ํ ๊ตฌ๋ฒ์ ์ผ๋ก ์ญ์ง๋ ฌํ ํ ์ ์๋์ง, ๋ฐ๋์ ๊ฒฝ์ฐ๋ ๊ฐ๋ฅํ์ง ํ ์คํธ ํด์ผํ๊ธฐ ๋๋ฌธ์ ํ ์คํธ์์ด ๋์ด๋๋ค.
์ง๋ ฌํ ์ํ ํํผ ๋ฐฉ๋ฒ
- ์ง๋ ฌํ ์ํ์ ํํผํ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์๋ฌด๊ฒ๋ ์ญ์ง๋ ฌํํ์ง ์๋ ๊ฒ์ด๋ค.
- ๋ ๊ฑฐ์ ์์คํ ๋๋ฌธ์ ์ง๋ ฌํ๋ฅผ ๋ฐฐ์ ํ ์ ์์๋์๋ ์ ๋ขฐํ ์ ์๋ ๋ฐ์ดํฐ๋ ์ ๋ ์ญ์ง๋ ฌํํ์ง ๋ง์.
- ์ญ์ง๋ ฌํ ๋ฐฉ์ด ๊ธฐ๋ฒ
- readObject ๋ฉ์๋๋ ์ฌ์ค์ ๋ ๋ค๋ฅธ ์์ฑ์์ด๊ธฐ ๋๋ฌธ์ ๋ฐฉ์ด์ ์ผ๋ก ์์ฑํด์ผํ๋ค.
/**๋ฐฉ์ด์ ๋ณต์ฌ์ ์ ํจ์ฑ ๊ฒ์ฌ๋ฅผ ์ํํ๋ readObject ๋ฉ์๋**/
private void readObject(ObjectInputStream s) throws IOException, ClassNotFoundException {
s.defaultReadObject();
// ๊ฐ๋ณ ์์๋ค์ ๋ฐฉ์ด์ ์ผ๋ก ๋ณต์ฌํ๋ค.
start = new Date(start.getTime());
end = new Date(end.getTime());
// ๋ถ๋ณ์์ ๋ง์กฑํ๋์ง ๊ฒ์ฌํ๋ค.
if (start.compareto(end) > 0) {
throw new InvalidObjectException(start + " after " + end);
}
}
- ์ธ์คํด์ค ์๋ฅผ ํต์ ํด์ผํ๋ค๋ฉด readResolve๊ฐ ์๋ Enum์ ์ฌ์ฉํ์.
- readResolve๋ฅผ ์ฌ์ฉํ๋ฉด readObject๋ฅผ ํตํด ์์ฑ๋ ์๋ก์ด ๊ฐ์ฒด๋ฅผ ์ธ์๋ก readResolve๊ฐ ํธ์ถ๋๊ณ , readResolve๊ฐ ๋ฐํํ ๊ฐ์ฒด๊ฐ ์๋ก์ด ๊ฐ์ฒด ๋์ ์ ๋ฐํ๋๊ธฐ ๋๋ฌธ์ ์ด๋ฏธ ์์ฑํด๋์ ์ฑ๊ธํค ์ธ์คํด์ค๋ฅผ ๋ฐํํ ์ ์๋ค.
- ๋ง์ฝ ์ด๊ฑฐ ํ์ ์ผ๋ก ๊ตฌํํ๋ค๋ฉด ์ ์ธํ ์์ ์ธ์ ๋ค๋ฅธ ๊ฐ์ฒด๋ ์กด์ฌํ์ง ์์์ ์๋ฐ๊ฐ ๋ณด์ฅํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ๊ถ์ฅํ๋ค.