JCF ์ HashMap ์ฝ๋๋ฅผ ๋ณด๋ค๊ฐ SerialVersionUID ๋ฅผ ๋ณด๊ณ ํธ๊ธฐ์ฌ์ ํ์ตํ ๋ด์ฉ

1. ํด๋์ค์ ๊ธฐ๋ณธ ํด์๊ฐ์ ํตํ SerialVersionUID ์ ๋ฌธ์
- ํด๋์ค์ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ๋์์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
- ์์: ๋ฉค๋ฒ ๋ณ์ ํ์ ๋ณ๊ฒฝ, ๋ฉค๋ฒ ๋ณ์ ์ญ์
- ํ๋ ์์ํฌ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ํด๋์ค์ ๊ฐ์ฒด๋ ๋ฒ์ ์ ์ ํตํด SerialVersionUID๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ์์ํ์ง ๋ชปํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
2. SerialVersionUID??
- SUID ๋ ์ง๋ ฌํ์ ์ญ์ง๋ ฌํ ๊ณผ์ ์์ ๊ฐ์ด ์๋ก ๋ง๋์ง ํ์ธํ ํ์ ์ฒ๋ฆฌํ๋ค.(๋ง์ง ์๋ค๋ฉด InvalidClassException ๋ฅผ ๋ฐํํ๋ค.)
- ์๋ฐ์ ์ง๋ ฌํ ์คํ ์ ์๋ฅผ ์ดํด๋ณด๋ฉด SUID ๊ฐ์ ํ์๊ฐ ์๋๋ฉฐ ์ ์ธ๋์ด ์์ง ์์ผ๋ฉด ํด๋์ค์ ๊ธฐ๋ณธ ํด์๊ฐ์ ์ฌ์ฉํ๋ค. (์ด ๊ฐ๋ค์ ํด๋์ค์ ์ด๋ฆ, ์์ฑ์ ๋ฑ๊ณผ ๊ฐ์ด ํด๋์ค์ ๊ตฌ์กฐ๋ฅผ ์ด์ฉํด์ ์์ฑ)
ํ๋ ์ถ๊ฐ ํ ์ญ์ง๋ ฌํ๊ฐ ๋ถ๊ฐ๋ฅํจ์ ํ์ธํ๋ ํ ์คํธ ์ฝ๋
class DefaultSerialEntity implements Serializable {
private String title;
private String pressName;
private String reporterName;
// ์๋ก์ด ํ๋ ์ถ๊ฐ
private String phoneNumber;
public DefaultSerialEntity(String title, String pressName, String reporterName) {
this.title = title;
this.pressName = pressName;
this.reporterName = reporterName;
}
@Override
public String toString() {
return "Article{" +
"title='" + title + '\'' +
", pressName='" + pressName + '\'' +
", reporterName='" + reporterName + '\'' +
'}';
}
}
// test code
class DefaultSerialEntityTest {
@Test
@DisplayName("DefaultSerialEntity ์ phoneNumber ํ๋๋ฅผ ์ถ๊ฐํ ๊ฒฝ์ฐ ๋ค๋ฅธ ์ญ์ง๋ ฌํ ๊ฐ์ ๋ฐํํ์ฌ ์์ธ๋ฅผ ๋ฐํํ๋ค")
void defaultSerializeWhenAddField() throws IOException, ClassNotFoundException {
//given, when
// phoneNumber ํ๋ ์ถ๊ฐ ์ด์ ์ง๋ ฌํ ๊ฐ
String serializedByteStrBeforeFieldAdd = "rO0ABXNyACtjb20uY29vcGVyLnNlcmlhbGl6YWJsZS5EZWZhdWx0U2VyaWFsRW50aX" +
"R54Lm3/1et2ggCAANMAAlwcmVzc05hbWV0ABJMamF2YS9sYW5nL1N0cmluZztMAAxyZXBvcnRlck5hbWVxAH4AAUwABXRpdGxlc" +
"QB+AAF4cHQAC3ByZXNzTmFtZTExdAAOcmVwb3J0ZXJOYW1lMTF0AAbsnbTrpoQ=";
//then
assertThatThrownBy(() -> SerializableUtil.<DefaultSerialEntity>deSerializeMethod(serializedByteStrBeforeFieldAdd))
.isInstanceOf(InvalidClassException.class);
}
}
ํ๋ ์ถ๊ฐ ํ ์ ์์ ์ผ๋ก ์ญ์ง๋ ฌํ๊ฐ ๋๋ ๊ฒ์ ํ์ธํ๋ ํ ์คํธ ์ฝ๋
public class SerialUIDEntity implements Serializable {
@Serial
private static final long serialVersionUID = -7116771609929351855L;
private String title;
private String pressName;
private String reporterName;
// ์๋ก์ด ํ๋ ์ถ๊ฐ
private String phoneNumber;
public SerialUIDEntity(String title, String pressName, String reporterName) {
this.title = title;
this.pressName = pressName;
this.reporterName = reporterName;
}
@Override
public String toString() {
return "SerialUIDEntity{" +
"title='" + title + '\'' +
", pressName='" + pressName + '\'' +
", reporterName='" + reporterName + '\'' +
", phoneNumber='" + phoneNumber + '\'' +
'}';
}
}
// test code
class SerialUIDEntityTest {
@Test
@DisplayName("serialVersionUID ์ ์ ์ธํ๋ฉด ํด๋์ค ์ ๋ณด ๊ด๊ณ์์ด serialVersionUID ๊ธฐ์ค์ผ๋ก ์ง๋ ฌํ๋๋ค.")
void SerialVersionUID() throws IOException, ClassNotFoundException {
//given, when
// phoneNumber ํ๋ ์ถ๊ฐ ์ด์ ์ง๋ ฌํ ๊ฐ : new SerialUIDEntity("title222", "pressName222", "reporter222");
String serializedByteStrBeforeFieldAdd = "rO0ABXNyACdjb20uY29vcGVyLnNlcmlhbGl6YWJsZS5TZXJpYWxVSURFbnRpdHmdPCX" +
"tUpN9UQIAA0wACXByZXNzTmFtZXQAEkxqYXZhL2xhbmcvU3RyaW5nO0wADHJlcG9ydGVyTmFtZXEAfgABTAAFdGl0bGVxAH4AAXh" +
"wdAAMcHJlc3NOYW1lMjIydAALcmVwb3J0ZXIyMjJ0AAh0aXRsZTIyMg==";
//then
Assertions.assertThat(SerializableUtil.<SerialUIDEntity>deSerializeMethod(serializedByteStrBeforeFieldAdd))
.isInstanceOf(SerialUIDEntity.class);
}
}
3. ํด๋์ค์ ๊ธฐ๋ณธ ํด์๊ฐ์ ํตํ SerialVersionUID ์ ๋ฌธ์
- ํด๋์ค์ ๊ตฌ์กฐ๊ฐ ๋ณ๊ฒฝ ๋์์ ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
- ์์: ๋ฉค๋ฒ ๋ณ์ ํ์ ๋ณ๊ฒฝ, ๋ฉค๋ฒ ๋ณ์ ์ญ์
- ํด๋์ค์ ๊ธฐ๋ณธ ํด์๊ฐ์ ํตํ SerialVersionUID ์ ๋ฌธ์
- ํ๋ ์์ํฌ ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ์ ๊ณตํ๋ ํด๋์ค์ ๊ฐ์ฒด๋ ๋ฒ์ ์ ์ ํตํด SerialVersionUID ๊ฐ ๋ณ๊ฒฝ๋ ๊ฒฝ์ฐ๊ฐ ์์ผ๋ฏ๋ก ์์ํ์ง ๋ชปํ ์ค๋ฅ๊ฐ ๋ฐ์ํ ์ ์๋ค.
4. ๐จ SerialVersionUID ๋ ๋๋๋ก์ด๋ฉด ๊ฐ๋ฐ์๊ฐ ์ง์ ๊ด๋ฆฌํ์!!
- intellij ์์๋ serialVersionUID ์๋ ์์ฑ์ ์ ๊ณตํ๋ ์ต์ ์ ์ ๊ณตํ๊ธฐ ๋๋ฌธ์ ๊ผญ ์ต์ ์ ์ถ๊ฐํ๋๋ก ํ์!! (์ด์์ด๋ฉด ๊ฒฝ๊ณ ๊น์ง ๋์ฐ๋๋ก ํ์!)
- (File > Settings > Serializable class without ‘serialVersionUID’)

5. Serialazable ์ ๊ถ์ฅํ์ง ์์ง๋ง ์ฌ์ฉํ ๋๋ ์ฃผ์ํด์ ์ฌ์ฉํ์.
- ์
์์ ์ธ ๊ณต๊ฒฉ ์์๊ฐ ๋ง๋ค.
- readObject : ํด๋น ๋ฉ์๋๋ ํด๋์ค ํจ์ค์ ์๊ณ Serializable interface ๋ฅผ ๊ตฌํํ ๋ชจ๋ ํ์ ์ ์์ฑํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์ญ์ง๋ ฌํ ํํฐ๋ง ์ ์ฌ์ฉํด ์์ ํ๋ค๊ณ ํ๋จ๋๋ ํด๋์ค ํ์ดํธ ๋ฆฌ์คํธ ์ ๊ฐ์ ๋ชฉ๋ก์ ์ญ์ง๋ ฌํ๋ฅผ ํ๋๋ฐ ์ ๊ณตํด์ผ ํ๋ค.
6. References
'๐ programming-language > java' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| ์๋ฐ์์ ๋์์ฑ์ ์ ๋ฐ์ํ ๊น? (4) | 2025.03.23 |
|---|---|
| Java Local Cache ๋น๊ตํ๊ธฐ (0) | 2025.03.09 |
| ์๋ฐ ๋น๋๊ธฐ๋ก ์นดํ ์ฝ์ ์์ ๋ง๋ค๊ธฐ (0) | 2024.11.26 |
| ์ด๋ํฐ ํจํด(adapter pattern) (1) | 2024.07.09 |
| ํผ์ฌ๋ ํจํด(Facade Pattern) (0) | 2024.07.08 |
