JAVA

싱글톤 패턴과 프록시 패턴

ohyujeong 2024. 5. 1. 15:16

디자인 패턴

  • 프로그래밍 시 자주 발생하는 문제를 해결하기 위한 최적의 방법

 

싱글톤 패턴

  • 클래스의 인스턴스를 하나만 생성해서 사용하기 위한 패턴
  • 전역 접근 지점을 제공

When

  • 단 하나의 인스턴스만 필요한 경우
    • 공유 자원(데이터베이스 연결 등)에 대한 일관된 접근이 필요한 경우
    • 시스템 설정, 환경 설정과 같은 시스템 전반에 걸쳐 하나만 존재해야 하는 구성 요소을 적용해야 하는 경우

Why & Benefit

  • 자원의 효율적 관리 : 중복 생성 방지해서 메모리 사용 최적화
  • 일관된 접근 제어 : 전역 인스턴스를 통해 일관되게 하나의 인스턴스에 접근
  • 데이터 공유 : 하나의 인스턴스를 통해 다양한 클라이언트, 프로세스 간에 데이터 공유

Key Point

  • new 로 새로운 인스턴스를 생성할 수 없도록 private 접근 제어자 필수
  • 유일한 단일 객체를 반환할 수 있는 정적 메서드가 필요
  • 유일한 단일 객체를 참조할 정적 참조 변수가 필요

Warning

  • 멀티스레드 환경에서 동기화 문제 주의
  • 전역 상태로 인한 의존성 문제 주의 -> 여러 구성요소들이 단일한 싱글턴 인스턴스에 강한 의존성을 지니게 되면 코드의 결합도가 높아질 수 있음

ex

- Enum 타입

  • 생성자가 단 한 번만 호출
  • 상수로 정의된 인스턴스들 중 단 하나만 존재

프록시 패턴

  • 객체의 대리자(Proxy)로서 동작하는 객체를 제공하는 패턴
  • 실제 객체에 대한 간접적인 접근을 하게 함
  • 제어 흐름을 조정하기 위한 목적으로 중간에 대리자를 두는 패턴

When

  • 객체에 대한 접근을 제어해야 하는 경우
  • 객체의 생성 비용이 크거나, 복잡한 초기화 과정이 필요한 경우
  • 객체에 대한 추가적인 기능(로깅, 인증, 캐싱) 등을 제공하고 싶은 경우

Why & Benefit

  • 실제 객체에 대한 접근을 제어하여 보안 및 권환 관리를 강화
  • 실제 객체에 대한 접근을 제어하여, 요청을 필요한 경우에만 전달함으로써 성능 향상

Key Point

  • 대리자는 실제 서비스와 같은 이름의 메서드를 구현하고, 인터페이스 사용
  • 대리자는 실제 서비스 메서드 반환값에는 영향 주는 것이 아니기 때문에, 클라이언트는 대리자 객체를 통한 호출로 반환값이 나오는지, 실제 객체 직접 호출로 반환값이 나오는 지 몰라야 함

Warning

  • 너무 많은 프록시 층은 코드의 복잡도를 높이고 성능 저하시킬 수 있음
  • 프록시를 통해 실제 객체에 대한 접근을 제어함으로, 보안 취약점이 있는 프록시를 사용하면 보안 문제가 발생할 수 있음

ex

가상 프록시, 원격 프록시

'JAVA' 카테고리의 다른 글

[이펙티브 자바] 객체 생성과 파괴  (0) 2024.07.13
IoC, DI, AOP 와 Spring  (1) 2024.05.01
자바의 제네릭(Generic)  (0) 2024.04.08
자바의 신 인사이트 정리  (0) 2024.03.21