TIL
  • Contents
  • Book
    • 도메인 주도 설계
      • 1. 동작하는 도메인 모델 만들기
    • 오브젝트
      • 데이터 중심 설계
      • 책임 중심 설계
      • 책임 할당을 위한 GRASP 패턴
      • 메시지와 인터페이스
      • 객체 분해
    • Effective Java
      • Item 7 - 다 쓴 객체 참조를 해제하라
      • Item 7 발표 내용
      • Item 13 - clone 재정의는 주의해서 진행하라
      • Item 13 발표 내용
      • Item 16 - public 클래스에서는 public 필드가 아닌 접근자 메서드를 사용하라
      • Item 16 발표 내용
      • Item 26 - 로 타입은 사용하지 말라
      • Item 28 - 배열보다는 리스트를 사용하라
      • Item 28 발표 내용
      • Item 29 - 이왕이면 제네릭 타입으로 만들라
      • Item 30 - 이왕이면 제네릭 메서드로 만들라
      • Item 31 - 한정적 와일드 카드를 사용해 API 유연성을 높이라
      • Item 35 - ordinal 메서드 대신 인스턴스 필드를 사용하라
      • Item 37 - ordinal 인덱싱 대신 EnumMap을 사용하라
      • Item 37 발표 내용
      • Item 43 - 람다보다는 메서드 참조를 사용하라
      • Item 43 발표 정리
      • Item 56 - 공개된 API 요소에는 항상 문서화 주석을 작성하라
      • Item 56 발표 정리
      • Item 62 - 다른 타입이 적절하다면 문자열 사용을 피하라
      • Item 62 발표 정리
      • Item 73 - 추상화 수준에 맞는 예외를 던지라
      • Item 83 - 지연 초기화는 신중히 사용하라
      • Item 83 발표 내용
      • Item 89 - 인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라
      • Item 89 발표 내용
    • 개발자를 위한 SQL 튜닝
      • SQL 쿼리 실습을 위한 DB 서버 구축
      • 인덱스 튜닝
      • 인덱스 스캔 튜닝
      • 인덱스 스캔 튜닝 실습
      • 인덱스 패스트 풀 스캔
      • 테이블 풀 스캔 튜닝
      • 조인 튜닝
      • 중첩 루프 조인 튜닝
      • 중첩 루프 조인 튜닝 실습
      • 해시 조인 튜닝
      • 해시 조인 튜닝 실습
      • 세미 조인 튜닝
      • 세미 조인 튜닝 실습
      • 아우터 조인
      • 함수 튜닝
      • 부분 범위 처리 튜닝
      • 파티셔닝 튜닝
      • 파티션 인덱스 튜닝
      • 병렬 처리 튜닝
  • Java
    • Design Pattern
      • Intro
      • Types of Design Patterns
      • Creational
        • Builder Pattern
        • Singleton Pattern
        • Prototype Pattern
        • Factory Pattern
        • Abstract Factory Pattern
      • Structural
        • Adapter Pattern
        • Bridge Pattern
        • Composite Pattern
        • Decorator Pattern
        • Facade Pattern
        • Flyweight Pattern
        • Proxy Pattern
      • Behavioural
        • Chain of Responsibility Pattern
        • Command Pattern
        • Interpreter Pattern
        • Iterator Pattern
        • Mediator Pattern
        • Memento Pattern
        • Observer Pattern
        • State Pattern
        • Strategy Pattern
        • Template Method Pattern
        • Visitor Pattern
    • Java
      • Cracking the Coding Interview
      • TDD, Clean Code with Java 11기
        • 자동차 레이싱
        • 로또
        • 사다리 타기
        • 볼링 게임 점수판
    • 궁금증
      • 자바 8 버전의 인터페이스와 추상클래스
      • 자바의 제네릭은 어떻게 이전 버전과 호환되는 걸까?
      • 스프링 MVC 기본 구조
      • 마샬링과 직렬화
      • 인터뷰 질문 모음
      • Code Coverage
  • Database
    • Database
      • SQL 레벨업
      • DB 스터디
        • DBMS
          • MySQL
        • INDEX
        • Join(Nested Loop, Hash)
        • Join(Semi, Outer)
        • Partial Range Processing
        • Function
        • Partitioning
        • Parallel Processing
  • Network
  • Architecture
    • Issue
      • Git Push Error
      • SonarLint Warning - assertThatExceptionOfType()
  • Infra
  • Spring
    • Spring JPA
      • 1. 데이터 모델링 및 연관관계 설정
      • 2. 최적화 내용
      • 3. Spring-Data-Jpa
      • 4. Query DSL
    • Spring Security
      • Intro
    • Spring Batch
      • 배치용 디비 설치
      • 배치 데이터 분석하기
      • 배치 프로세스 구상하기 및 성능 차이 확인하기
  • Issue
  • Tistory
    • Tistory Blog
  • Design High Performing Architectures
  • Design Resilient Architectures
  • Design Secure Applications And Architectures
  • Design Cost-Optimized Architectures
Powered by GitBook
On this page
  • Intro
  • 싱글턴 상기시키기
  • readResolve() 가 동작하는 방식
  • 싱글턴 직렬화
  • 역직렬화의 취약점
  • 싱글턴을 보장하는 열거 타입 클래스
  • 정리

Was this helpful?

  1. Book
  2. Effective Java

Item 89 발표 내용

인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라

PreviousItem 89 - 인스턴스 수를 통제해야 한다면 readResolve보다는 열거 타입을 사용하라Next개발자를 위한 SQL 튜닝

Last updated 3 years ago

Was this helpful?

Intro

싱글턴 상기시키기

싱글턴

  • 인스턴스를 오직 하나만 생성하도록 하는 방법

  • 하나의 인스턴스를 갖기 때문에 상태 값을 갖지 않는 무상태 객체 또는 프로젝트 설계상 유일한 인스턴스로 컴포넌트 역할을 하는 클래스가 적당하다.

싱글턴을 만드는 세 가지 방법

  1. 생성자의 접근 제한자를 private으로 설정하여 외부에서 객체를 생성하지 못하도록 하고, 인스턴스에 접근하는 메서드를 public static final로 제공하는 방법

  2. 위와 동일하게 생성자의 접근 제한자를 private으로 설정, 외부에서 접근하는 방식을 정적 팩토리 메서드를 public static 멤버로 제공

  3. 원소가 하나인 열거 타입을 선언

싱글턴을 직렬화하는 방법

  • Serializable 구현하는 것만 으로는 싱글턴 직렬화를 유지할 수 없다.

  • 모든 인스턴스 필드를 일시적(transient)라고 선언 후, readResolve 메서드를 제공해야 한다.

readResolve() 가 동작하는 방식

싱글턴 직렬화

  • 객체의 싱글턴 직렬화 하기 위해 순차적으로 적용해본다.

싱글턴 클래스

  • 해당 클래스는 데이터를 갖고 있지 않아 직렬화 형태를 제공할 필요가 없다.

Serializable 구현한 싱글턴 클래스

  • 해당 클래스는 Serializable 인터페이스를 구현하였지만 의도한 대로 싱글턴 직렬화를 기대할 수 없다.

  • favoriteSongs라는 데이터를 갖는 필드가 존재하기 때문에 모든 인스턴스 필드를 transient로 선언해야할 필요가 있다.

  • readResolve를 인스턴스 통제 목적으로 사용하는 경우, 객체 참조 타입 인스턴스 필드는 모두 transient를 선언해야 한다.

Serializable 구현 및 readResolve 메서드를 제공하는 싱글턴 클래스

  • Serializable 인터페이스를 구현하고, readResolve() 메서드를 제공하여 싱글턴 직렬화를 기대할 수 있다.

  • readResolve() 는 기존에 인스턴스가 존재하는 경우, 기존의 인스턴스를 반환하고 역직렬화한 객체는 무시한다.

  • 그러나 아직 favoriteSongs 필드에 대한 transient 처리가 되지 않았기 때문에 역직렬화 시 공격에는 취약한 상태이다.

역직렬화의 취약점

역직렬화를 통한 공격

Stealer 클래스

싱글턴을 보장하는 열거 타입 클래스

정리

표지
참고
키워드 그래프
싱글턴 다시 보기
싱글턴을 유지하는 방법
코드
코드
코드
코드
역직렬화의 취약점
참조 필드를 훔치는 방식으로 공격하는 Stealer 클래스
싱글턴을 보장하는 방법 - Enum
싱글턴을 보장하는 방법 - Enum