์ผ | ์ | ํ | ์ | ๋ชฉ | ๊ธ | ํ |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- java์ฑํ
- React
- db์ ๋ต
- ์๋ฐ
- GoogleLogin
- dockerhub
- ํฐ์คํ ๋ฆฌ์ฑ๋ฆฐ์ง
- node.js mysql ์ฐ๋
- docker network
- ์ค๋ธ์
- @scheduler
- CICD
- docker
- spring
- Personal Access Token
- ์๊ณ ๋ฆฌ์ฆ
- oauth
- MySQL
- Node.js
- SpringBoot
- ๋์์ธํจํด
- injection๊ณต๊ฒฉ
- ์ฝ๋ฉํ ์คํธ
- Java
- ์ฝํ
- ๋ ผ๋ธ๋กํน
- ํฌ๋ก์ค์ฌ์ดํธ ์คํฌ๋ฆฝํธ
- Jenkins
- db์ํคํ ์ณ
- spring scheduler
- Today
- Total
<Hello Hosung๐/>
[Java] ์ง๋ ฌํ(Serialization)๋? ๋ณธ๋ฌธ
[Java] ์ง๋ ฌํ(Serialization)๋?
์ข์ถฉ์ฐ๋ ๋ฐฑ์๋ ๊ฐ๋ฐ์ ์ผ๊ธฐ๐ง 2024. 11. 12. 14:25Java์์ **์ง๋ ฌํ(Serialization)**๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ์ฌ ํ์ผ์ ์ ์ฅํ๊ฑฐ๋ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ ์ ์๋๋ก ๋ง๋๋ ๊ณผ์ ์
๋๋ค. ๋ฐ๋๋ก, ๋ฐ์ดํธ ์คํธ๋ฆผ์ ๋ค์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ณผ์ ์ **์ญ์ง๋ ฌํ(Deserialization)**๋ผ๊ณ ํฉ๋๋ค.
์ง๋ ฌํ๋ ์ฃผ๋ก ๋ฐ์ดํฐ๋ฅผ ์์ํํ๊ฑฐ๋ ์๊ฒฉ ํต์ ์์ ๊ฐ์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ์ ๋ ์ฌ์ฉ๋ฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์น ์ ํ๋ฆฌ์ผ์ด์
์์ ์๋ฒ์ ํด๋ผ์ด์ธํธ ๊ฐ์ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ ๋ ์ง๋ ฌํ๊ฐ ์ ์ฉํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค.
์ด ๋ธ๋ก๊ทธ์์๋ Java์์ ์ง๋ ฌํ๊ฐ ๋ฌด์์ธ์ง, ์ด๋ป๊ฒ ์ฌ์ฉํ๋์ง, ๊ทธ๋ฆฌ๊ณ ์์ ์ฝ๋๋ก ์ฝ๊ฒ ์ค๋ช
ํด ๋ณด๊ฒ ์ต๋๋ค.
1. ์ง๋ ฌํ์ ๊ธฐ๋ณธ ๊ฐ๋
์ง๋ ฌํ๋ ๊ฐ์ฒด์ ์ํ๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ์ฌ ์ ์ฅํ๊ฑฐ๋ ์ ์กํ ์ ์๋๋ก ํด์ฃผ๋ ๊ณผ์ ์ ๋๋ค. ์ง๋ ฌํ๋ ๊ฐ์ฒด๋ ๋์ค์ ์ญ์ง๋ ฌํ ๊ณผ์ ์ ๊ฑฐ์ณ ๋ค์ ์๋์ ๊ฐ์ฒด๋ก ๋ณต์๋ฉ๋๋ค.
์ง๋ ฌํ ์ฌ์ฉ ์์
- ํ์ผ ์ ์ฅ: ๊ฐ์ฒด๋ฅผ ํ์ผ์ ์ ์ฅํ์ฌ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ ํ์๋ ๋ค์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋คํธ์ํฌ ํต์ : ๊ฐ์ฒด๋ฅผ ๋คํธ์ํฌ๋ฅผ ํตํด ๋ค๋ฅธ ์ปดํจํฐ๋ก ์ ์กํ ์ ์์ต๋๋ค.
- ์ธ์ ๊ด๋ฆฌ: ์น ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ์ ์ธ์ ์ ๋ณด๋ฅผ ๊ฐ์ฒด๋ก ์ ์ฅํ๊ณ ์ ์กํ ์ ์์ต๋๋ค.
2. Java์์ ์ง๋ ฌํ ์ฌ์ฉ๋ฒ
Java์์๋ java.io.Serializable ์ธํฐํ์ด์ค๋ฅผ ์ฌ์ฉํ์ฌ ์ง๋ ฌํ๋ฅผ ๊ตฌํํฉ๋๋ค. ์ด ์ธํฐํ์ด์ค๋ marker interface๋ก, ์ด๋ฅผ ๊ตฌํํ ํด๋์ค๋ ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํด์ง๋๋ค.
Serializable ์ธํฐํ์ด์ค
Serializable ์ธํฐํ์ด์ค๋ ๋ฉ์๋๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ผ๋ฉฐ, ๋จ์ํ ํด๋น ํด๋์ค๊ฐ ์ง๋ ฌํ๋ ์ ์์์ JVM์๊ฒ ์๋ฆฌ๋ ์ญํ ์ ํฉ๋๋ค.
import java.io.Serializable;
public class Person implements Serializable {
private String name;
private int age;
// ์์ฑ์
public Person(String name, int age) {
this.name = name;
this.age = age;
}
// Getter/Setter
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
3. ์ง๋ ฌํ ์์
์ง๋ ฌํ๋ ObjectOutputStream ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๊ณ , ์ญ์ง๋ ฌํ๋ ObjectInputStream ํด๋์ค๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ๊ฐ์ฒด๋ก ๋ณํํฉ๋๋ค.
์ง๋ ฌํ ์์
import java.io.*;
public class SerializationExample {
public static void main(String[] args) {
// ์ง๋ ฌํํ ๊ฐ์ฒด ์์ฑ
Person person = new Person("Alice", 30);
try {
// ๊ฐ์ฒด๋ฅผ ํ์ผ๋ก ์ง๋ ฌํ
FileOutputStream fileOut = new FileOutputStream("person.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(person);
out.close();
fileOut.close();
System.out.println("๊ฐ์ฒด๊ฐ person.ser ํ์ผ์ ์ง๋ ฌํ๋์์ต๋๋ค.");
} catch (IOException i) {
i.printStackTrace();
}
}
}
์ ์ฝ๋์์๋ Person ๊ฐ์ฒด๋ฅผ person.ser๋ผ๋ ํ์ผ๋ก ์ง๋ ฌํํฉ๋๋ค. ObjectOutputStream์ ์ฌ์ฉํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ๊ณ , ์ด๋ฅผ ํ์ผ์ ์ ์ฅํฉ๋๋ค.
์ญ์ง๋ ฌํ ์์
import java.io.*;
public class DeserializationExample {
public static void main(String[] args) {
Person person = null;
try {
// ์ง๋ ฌํ๋ ํ์ผ์ ์ฝ์ด ๊ฐ์ฒด๋ก ์ญ์ง๋ ฌํ
FileInputStream fileIn = new FileInputStream("person.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
person = (Person) in.readObject();
in.close();
fileIn.close();
System.out.println("์ญ์ง๋ ฌํ๋ ๊ฐ์ฒด: " + person.getName() + ", " + person.getAge());
} catch (IOException | ClassNotFoundException i) {
i.printStackTrace();
}
}
}
์ ์ฝ๋์์๋ person.ser ํ์ผ์์ ๊ฐ์ฒด๋ฅผ ์ฝ์ด์ Person ๊ฐ์ฒด๋ก ์ญ์ง๋ ฌํํฉ๋๋ค. ObjectInputStream์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํธ ์คํธ๋ฆผ์ ์ฝ๊ณ ๊ฐ์ฒด๋ก ๋ณํํฉ๋๋ค.
4. ์ง๋ ฌํ์ ์ ์์ฌํญ
serialVersionUID ํ๋
์ง๋ ฌํ๋ ๊ฐ์ฒด๋ ํด๋์ค์ ๋ฒ์ ์ ๋ณด๋ ํจ๊ป ์ ์ฅ๋ฉ๋๋ค. ์ด๋ฅผ ์ํด serialVersionUID๋ผ๋ ๊ณ ์ ํ ๋ฒ์ ID๋ฅผ ๋ช
์์ ์ผ๋ก ์ง์ ํ ์ ์์ต๋๋ค. ํด๋์ค๊ฐ ๋ณ๊ฒฝ๋๋ฉด ๋ฒ์ ์ด ๋ฌ๋ผ์ ธ ์ญ์ง๋ ฌํ๊ฐ ์คํจํ ์ ์๋๋ฐ, ์ด๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด serialVersionUID๋ฅผ ์ฌ์ฉํฉ๋๋ค.
private static final long serialVersionUID = 1L;
transient ํค์๋
์ง๋ ฌํ์์ ์ ์ธํ๊ณ ์ถ์ ํ๋๋ transient ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ง๋ ฌํ ๋์์์ ์ ์ธํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ณด์์ ์ ์ฅํ์ง ์์์ผ ํ๋ ๋น๋ฐ๋ฒํธ๋ ์ธ์
์ ๋ณด ๊ฐ์ ๋ฐ์ดํฐ์ ์ฌ์ฉํฉ๋๋ค.
private transient String password;
์ ์ ๋ณ์
ํด๋์ค์ ์ ์ ๋ณ์(static ๋ณ์)๋ ์ง๋ ฌํ๋์ง ์์ต๋๋ค. ์ด๋ ์ ์ ๋ณ์๋ ํด๋์ค ๋ก๋ฉ ์์ ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋๋๊ธฐ ๋๋ฌธ์ ์ง๋ ฌํ์ ๋์์ด ์๋๋ผ๋ ํน์ง์ด ์์ต๋๋ค.
์์ ๊ด๊ณ์์์ ์ง๋ ฌํ
์์ ๊ด๊ณ์ ์๋ ํด๋์ค์์ ๋ถ๋ชจ ํด๋์ค๊ฐ Serializable์ ๊ตฌํํ๊ณ , ์์ ํด๋์ค์์ ์ด๋ฅผ ์์๋ฐ์ ๊ฒฝ์ฐ, ์์ ํด๋์ค๋ ์๋์ผ๋ก ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ํ์ง๋ง ์์ ํด๋์ค์์ ์ง๋ ฌํ๊ฐ ํ์ํ ํ๋๋ฅผ transient๋ก ์ง์ ํ๋ค๋ฉด ํด๋น ํ๋๋ ์ง๋ ฌํ๋์ง ์์ต๋๋ค.
5. ์ง๋ ฌํ์ ์ฑ๋ฅ
์ง๋ ฌํ์ ์ญ์ง๋ ฌํ๋ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค. ํนํ ๋์ฉ๋ ๊ฐ์ฒด๋ ๋ณต์กํ ๊ฐ์ฒด๋ฅผ ์ง๋ ฌํํ๊ณ ์ ์กํ๋ ๊ฒฝ์ฐ, ์ฑ๋ฅ์ด ์ ํ๋ ์ ์์ต๋๋ค. ์ด๋ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ObjectInputStream๊ณผ ObjectOutputStream ๋์ , JSON, XML, Protocol Buffers, Avro์ ๊ฐ์ ๋ค๋ฅธ ๋ฐ์ดํฐ ํฌ๋งท์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ๋ ๊ณ ๋ คํ ์ ์์ต๋๋ค.
๋ง๋ฌด๋ฆฌ
Java์์ ์ง๋ ฌํ๋ ๊ฐ์ฒด๋ฅผ ๋ฐ์ดํธ ์คํธ๋ฆผ์ผ๋ก ๋ณํํ์ฌ ํ์ผ์ ์ ์ฅํ๊ฑฐ๋ ๋คํธ์ํฌ๋ฅผ ํตํด ์ ์กํ ์ ์๋๋ก ํด์ฃผ๋ ์ค์ํ ๊ธฐ์ ์
๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ๋ฉด ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ์์ํํ๊ฑฐ๋, ๋ค๋ฅธ ์์คํ
๊ณผ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ฒ ์ฃผ๊ณ ๋ฐ์ ์ ์์ต๋๋ค.
์ง๋ ฌํ ๊ณผ์ ์์ serialVersionUID์ transient ๊ฐ์ ๊ฐ๋
์ ์ดํดํ๊ณ ์ ํ์ฉํ๋ฉด, ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ ์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ์๋ฐฉํ๊ณ ์ฑ๋ฅ์ ์ต์ ํํ ์ ์์ต๋๋ค.
์ง๋ ฌํ๋ ๋งค์ฐ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ด์ง๋ง, ๋ฐ๋์ ํ์ํ ๊ฒฝ์ฐ์๋ง ์ฌ์ฉํ๊ณ , ์ฑ๋ฅ์ ๊ณ ๋ คํ์ฌ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ํํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
'๐ป Java > ใ คJava(Basic)' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ๋์์ธ ํจํด (3) | 2024.11.14 |
---|---|
[Java] ์ธํฐํ์ด์ค๋? (0) | 2024.11.10 |
[Java] ํ์ผ ์ ์ถ๋ ฅ (IO) ์ดํดํ๊ธฐ (1) | 2024.11.09 |
[Java] ์์ผํต์ ์ ๊ธฐ์ด(+์ฑํ ๐ง) (0) | 2024.11.07 |