[Effective-Java] Chapter12 #88. readObject 메서드는 방어적으로 작성하라
·
Reference/Effective-Java
✨ readObject 메서드를 작성하는 지침 • private여야 하는 객체 참조 필드는 각 필드가 가리키는 객체를 방어적으로 복사하라. • 모든 불변식을 검사하고, 어긋나면 InvalidObjectException을 던진다. (불변식 복사 → 불변식 검사) • 역직렬화 후 그래프 전체 유효성 검사가 필요하다면 ObjectInputValidation 인터페이스를 사용하라 • readObject에서 직접적이든 간접적이든, 재정의 가능한 메서드를 호출하지 마라. (초기화 되기 전에 호출된다.) 🛡️ 역직렬화 방어적 수행 🟡 As-is public final class Period implements Serializable { private final Date start; private final Date ..
[Review] INFCON 2023 후기
·
Review
멘토링은 워낙 많이 다녀봐서 개발자 컨퍼런스는 어떤 내용을 다루는지 궁금해졌다. 주위에서 인프콘에 가보라고 권유를 많이 해주셔서 그냥 지원해놓고 잊고 있었는데, 얼떨결에 붙어버렸다. 이런 거 하면 맨날 떨어지던데, 이번엔 또 어째 붙었다. 오전 10시부터 개회식이 시작된다길래, 10시 30분 쯤 도착하게끔 기차표를 예매했었는데 같이 가게 된 분이 그러다가 사람 몰린다고 해서 6시 30분 기차를 예매하게 됐다. (전날 대회 준비 때문에 2시간 자고 일어나는데 죽는 줄 알았다..) 내 시간표는 이랬었다. 10시 40분 건 듣다가 나왔고, (너무 당연한 얘기라서) 14시 강의는 못 들었고, (밥 먹느라..^^) 16시 40분 건 너무 좋은 강의였는데, 듣다가 졸아버렸다. (피로의 극한) 꿀팁아닌 꿀팁이라면, ..
[Effective-Java] Chapter12 #87. 커스텀 직렬화 형태를 고려해보라
·
Reference/Effective-Java
📌 기본 직렬화가 괜찮은 경우 1️⃣ 직접 설계하더라도 기본 직렬화 형태와 거의 같은 결과가 나올 경우 어떤 객체의 기본 직렬화 형태는 해당 객체를 root로 하는 객체 그래프의 물리적 모습을 나름 효율적으로 인코딩한다. 객체가 포함한 데이터, 접근 가능한 모든 객체, 객체들이 연결된 위상(topology)까지 기술한다. 그러나, 이상적인 직렬화 형태는 물리적 모습과 독립된 논리적 모습만을 표현해야 한다. (공간 문제) 2️⃣ 객체의 물리적 표현과 논리적 내용이 같은 경우 public class Name implements Serializable { /** * 성. null이 아니어야 함. * @serial */ private final Stirng lastName; /** * 이름. null이 아니어야..
[Effective-Java] Chapter12 #86. Serializable을 구현할지는 신중히 결정하라
·
Reference/Effective-Java
직렬화를 지원하기란 짧게 보면 손쉬워 보이지만, 길게 보면 아주 값비싼 일이다. 📌 직렬화 단점 1️⃣ 릴리즈한 뒤에 수정하기 어렵다. 직렬화된 byte stream encoding(직렬화 형태)도 하나의 공개 API가 된다. 기본 직렬화 형태를 사용하면 private와 package-private 인스턴스 필드마저 API로 공개하는 꼴이다. (캡슐화와 정보 은닉성이 깨진다.) 적용 당시 클래스 내부 구형 방식에 영원히 묶이게 된다. 뒤늦게 클래스 내부 구현을 손보면 직렬화 형태가 달라지므로 버전 호환성이 깨진다. 직렬화 형태를 유지하면서 내부 표현을 바꿀 수는 있지만, 어려우면서 지저분한 혹을 남긴다. 직렬화 클래스를 만들 대는 길게 보고 감당할 수 있는 만큼 고품질 직렬화 형태도 주의해서 함께 설계하..