Serializable ์ธํฐํ์ด์ค
DTO๋ฅผ ์ฌ์ฉํ ๋ Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ ์๋๋ฐ, ๊ทธ ์ด์ ๋ฅผ ์์๋ณด์.
Serializable ์ธํฐํ์ด์ค์ API์ ์ ์ธ๋ ๋ณ์๋ ๋ฉ์๋๊ฐ ์๋ค.
๊ตฌํํด์ผํ ๋ฉ์๋๊ฐ ์๋ฌด๊ฒ๋ ์๋๋ฐ ์ ์์๊น.
๐ ์๋ฐ์์ ์ง๋ ฌํ๋ ?
๐ ์๋ฐ ์์คํ ๋ด๋ถ์์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด ๋๋ ๋ฐ์ดํฐ(JVM์ ๋ฉ๋ชจ๋ฆฌ์ ์์ฃผ)๋ฅผ ์ธ๋ถ์ ์๋ฐ ์์คํ ์์๋ ์ฌ์ฉํ ์ ์๋๋ก byte ํํ๋ก ๋ฐ์ดํฐ ๋ณํํ๋ ๊ธฐ์ (์ง๋ ฌํ)๊ณผ byte๋ก ๋ณํ๋ ๋ฐ์ดํฐ๋ฅผ ๋ค์ ๊ฐ์ฒด๋ก ๋ณํํ๋ ๊ธฐ์ (์ญ์ง๋ ฌํ)์ด๋ค.
Serializable์ด ํ์ํ ๋๋ ๋ค์๊ณผ ๊ฐ๋ค.
- ์์ฑํ ๊ฐ์ฒด๋ฅผ ํ์ผ๋ก ์ ์ฅํ ๋
- ์ ์ฅํ ๊ฐ์ฒด๋ฅผ ์ฝ์ ๋
- ๊ฐ์ฒด๋ฅผ ๋ค๋ฅธ ์๋ฒ๋ก ๋ณด๋ผ ๋
- ๋ค๋ฅธ ์๋ฒ์์ ์์ฑํ ๊ฐ์ฒด๋ฅผ ๋ฐ์ ๋
๐ ์ฆ, ๋ง๋ ํด๋์ค๊ฐ ํ์ผ์ ์ฝ๊ฑฐ๋ ์ธ ์ ์๋๋ก ํ๊ฑฐ๋ ๋ค๋ฅธ ์๋ฒ๋ก ๋ณด๋ด๊ฑฐ๋ ๋ฐ์ ์ ์๋๋ก ํ๋ ค๋ฉด ์ด ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ผํ๋ค.
โณ๏ธ ์ง๋ ฌํ ์์
// ์ง๋ ฌํํ ํ์ ํด๋์ค
public class Member implements Serializable {
private String name;
private String email;
private int age;
public Member(String name, String email, int age) {
this.name = name;
this.email = email;
this.age = age;
}
// Getter ์๋ต
@Override
public String toString() {
return String.format("Member", name, email, age);
}
}
Member member = new Member("๊น๋ฐฐ๋ฏผ", "deliverykim@baemin.com", 25);
byte[] serializedMember;
try (ByteArrayOutputStream baos = new ByteArrayOutputStream()) {
try (ObjectOutputStream oos = new ObjectOutputStream(baos)) {
oos.writeObject(member);
// serializedMember -> ์ง๋ ฌํ๋ member ๊ฐ์ฒด
serializedMember = baos.toByteArray();
}
}
// ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ์์ฑ๋ ์ง๋ ฌํ ๋ฐ์ดํฐ๋ฅผ base64๋ก ๋ณํ
System.out.println(Base64.getEncoder().encodeToString(serializedMember));
โณ๏ธ ์ญ์ง๋ ฌํ ์์
// ์ง๋ ฌํ ์์ ์์ ์์ฑ๋ base64 ๋ฐ์ดํฐ
String base64Member = "...์๋ต";
byte[] serializedMember = Base64.getDecoder().decode(base64Member);
try (ByteArrayInputStream bais = new ByteArrayInputStream(serializedMember)) {
try (ObjectInputStream ois = new ObjectInputStream(bais)) {
// ์ญ์ง๋ ฌํ๋ Member ๊ฐ์ฒด๋ฅผ ์ฝ์ด์จ๋ค.
Object objectMember = ois.readObject();
Member member = (Member) objectMember;
System.out.println(member);
}
}
ํ๋ก์ ํธ๋ฅผ ์งํํ๋ฉด์ ํ ๋ฒ๋ ๊ตฌํํด๋ณธ ์ ์ด ์๋๋ฐ....?
ํ๋ถ์ ๋๋ถํฐ ๋ช๋ช ํ๋ก์ ํธ๋ฅผ ํ๋ฉด์ ์ง๋ ฌํ์ ๋ํ ๊ฐ๋ ์ ๋ค์ด๋ดค์ผ๋ Serializable ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํด์ ํ์ฉํ ์ ์ ๋ฑํ ๊ธฐ์ต์ ์๋ค. ํ์ง๋ง ์ค๋ฌด์์๋ Serializable๋ฅผ ๊ตฌํํ๋ DTO๋ฅผ ์ฌ์ฉํ๊ณ ์์๋ค.
Spring Boot๋ ๊ธฐ๋ณธ์ ์ผ๋ก Jackson์ ์ฌ์ฉํด์ ๊ฐ์ฒด๋ฅผ JSON์ผ๋ก ๋ณํํด์ค๋ค.
Jackson, GSON ๋ฑ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๊ธฐ ๋๋ฌธ์ ๊ตณ์ด Serializable์ด ์์ด๋ ๋ฌธ์ ๊ฐ ์์๋ค.
Jackson์ด ์์ฒด์ ์ผ๋ก ์ง๋ ฌํ/์ญ์ง๋ ฌํ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๊ธฐ ๋๋ฌธ์ด๋ค.
ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(baseDto); // ์ง๋ ฌํ
BaseDto dto = objectMapper.readValue(json, BaseDto.class); // ์ญ์ง๋ ฌํ
์์ ๊ฐ์ ๊ณผ์ ์ด ํ์์์๋ ๊ฒ์ด๋ค.
ํ์ง๋ง, ๊ตฌ์กฐ๊ฐ ๋ณต์กํ๋ฉด ์ง์ ๋งคํ์์ผ์ค์ผ ํ๋ ์์ ๋ ํฌํจํ๊ธฐ ๋๋ฌธ์ ์ด๋ค ์ํฉ์์๋ JSON ๋๋ CSV ๋ฑ ํํ์ ํฌ๋งท์ ์ด์ฉํ๋ ๊ฒ์ด ๋ ๊ท์ฐฎ์ ์๋ ์๋ค.
์คํ๋ ค ์๋ฐ ์ง๋ ฌํ๋ ๋ณต์กํ ๊ฐ์ฒด๋ ํฐ ์์ ์์ด Serializable ์ธํฐํ์ด์ค๋ง ๊ตฌํํ๋ฉด ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ๊ฐ ๊ฐ๋ฅํ๋ฏ๋ก ์ด ๋ฐฉ๋ฒ์ด ๋ ํธํ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ํฉ์ ๋ฐ๋ผ ์ ํํ๋ฉด ๋๋ค.
๐ค ๊ทธ๋ผ ์ธ์ ํ์ํ๊ฑธ๊น ?
- Redis ๊ฐ์ ์บ์์์ ๊ฐ์ฒด๋ฅผ ์ ์ฅํ ๋
- Java RMI(Remote Method Invocation) ๊ฐ์ ๊ธฐ์ ์์ ํ์
- RMI : ์๊ฒฉ ์์คํ ๊ฐ์ ๋ฉ์์ง ๊ตํ
- ํ์ผ ์ ์ฅ๊ณผ ๋คํธ์ํฌ ์ ์ก(๋ฐ์ด๋๋ฆฌ ๋ฐฉ์)
์ง๋ ฌํ์ ์ฅ๋จ์
โณ๏ธ ์ฅ์
- JVM์ ๋ฉ๋ชจ๋ฆฌ์์๋ง ์์ฃผ๋์ด์๋ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ทธ๋๋ก ์์ํ๊ฐ ํ์ํ ๋ ์ฌ์ฉ๋จ
- ์์คํ ์ด ์ข ๋ฃ๋๋๋ผ๋ ์์ด์ง์ง ์๋ ์ฅ์ ์ ๊ฐ์ง๋ฉฐ ์์ํ๋ ๋ฐ์ดํฐ์ด๋ฏ๋ก ๋คํธ์ํฌ๋ก ์ ์ก๋ ๊ฐ๋ฅ
- ํ์ํ ๋ ์ง๋ ฌํ๋ ๊ฐ์ฒด ๋ฐ์ดํฐ๋ฅผ ๊ฐ์ ธ์์ ์ญ์ง๋ ฌํํ์ฌ ๊ฐ์ฒด๋ฅผ ๋ฐ๋ก ์ฌ์ฉ ๊ฐ๋ฅ
โณ๏ธ ๋จ์
- ๋ค๋ฅธ ์ธ์ด์ ํธํ ์ด๋ ค์
- ๋ค๋ฅธ ์ธ์ด์์ ๋ฐ์ดํฐ๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด JSON ์ง๋ ฌํ๊ฐ ๋ ์ ํฉ
- ์ญ์ง๋ ฌํ์ ํด๋์ค ๊ตฌ์กฐ ๋ณ๊ฒฝ ๋ฌธ์ ๋ฐ์
- ํด๋์ค์ ๋ฉค๋ฒ ๋ณ์ ํ๋๋ง ์ถ๊ฐ๋์ด๋ serialVersionUID์ ์ ๋ณด๊ฐ ์ผ์นํ์ง ์์ผ๋ฏ๋ก InvalidClassException ๋ฐ์
- ํด๋์ค๋ฅผ ๋ณ๊ฒฝํ ๋์ ์ง์ serialVersionUID ๊ฐ์ ๊ด๋ฆฌํด์ฃผ์ด์ผ ํจ
- ์ฉ๋๋ฌธ์
- ์๋ฐ ์ง๋ ฌํ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ํ์ ์ ๋ํ ์ ๋ณด ๋ฑ ํด๋์ค์ ๋ฉํ ์ ๋ณด๋ ๊ฐ๊ณ ์์ผ๋ฏ๋ก ์๋์ ์ผ๋ก ๋ค๋ฅธ ํฌ๋งท์ ๋นํด์ ์ฉ๋์ด ํผ
๐ ๊ฒฐ๋ก
- ์๋ฐ ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ ๋์๋ ๊ฐ๋ฅํ ์์ฃผ ๋ณ๊ฒฝ๋๋ ํด๋์ค์ ๊ฐ์ฒด๋ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ด ์ข์
- ์ญ์ง๋ ฌํ๊ฐ ๋์ง ์์ ๋์ ๊ฐ์ ์์ธ์ฒ๋ฆฌ ๊ธฐ๋ณธ์ ์ผ๋ก ํด๋๊ธฐ
- ๊ธด ์๊ฐ ๋์ ์ธ๋ถ์ ์ ์ฅํ๋ ์๋ฏธ ์๋ ๋ฐ์ดํฐ๋ค์ ์๋ฐ ์ง๋ ฌํ๋ฅผ ์ฌ์ฉํ์ง ๋ง๊ธฐ !
์ฌ๊ธฐ์์๋ ์ ์ฌ์ฉ๋๊ฑธ๊น
๊ฒฐ๋ก ๋ถํฐ ๋งํ์๋ฉด, ๊ตณ์ด ์ฌ์ฉํ์ง ์์๋ ๋๋ค.
LocalDateTimeSerializer๋ฅผ ํ๊ณ ๋ค์ด๊ฐ๋ค๋ณด๋ฉด Serializable์ ๊ตฌํํ ํด๋์ค๋ผ๋ ๊ฒ์ ์ ์ ์๋ค.
์์์ ์ธ๊ธํ serialVersionUID๋ ํ์ธํ ์ ์์๋ค !
Java์ LocalDateTime์ JSON์ผ๋ก ๋ณํํ ๋ ์ฌ์ฉํ๊ธฐ ์ํด LocalDateTimeSerializer๋ฅผ ์์ฑํ ๊ฒ ๊ฐ์๋ฐ,
@JsonFormat์ผ๋ก๋ ๋ ์ง ํฌ๋งท ๋ณ๊ฒฝ์ด ๊ฐ๋ฅํ๋ค. (์ฌ์ค ๋ด๊ฐ ์์ฑํ ์ฝ๋๊ฐ ์๋๋ผ ์ ์ ๊ฑธ ์ฌ์ฉํ์ ์ง๋ ์ ๋ชจ๋ฅด๊ฒ ์. ํด์ฌํ์ ๋ถ์ด ์์ฑํ๊ฑฐ๋ผ ๋ฌผ์ด๋ณด์ง๋ ๋ชปํจใ )
๋ค์์ ์๋ก ๊ฐ๋ฐํ ๋๋ ์ด๋ฌํ ์ ๋ค์ ๊ณ ๋ คํด์ ๊ฐ๋จํ๊ฒ ํด๋ด์ผ๊ฒ ๋ค.
์ฐธ๊ณ ์๋ฃ
https://techblog.woowahan.com/2550/
https://techblog.woowahan.com/2551/
'Java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Java] ์ ๋ค๋ฆญ (0) | 2025.03.05 |
---|---|
[Java ๊ณ ๊ธํธ] ์ค๋ ๋ ์์ฑ๊ณผ ์คํ (0) | 2024.09.30 |
[Java] CompletableFuture ๋น๋๊ธฐ ์์ (0) | 2024.05.06 |