본문 바로가기

Web/기초

[WEB기초] 싱글톤 패턴(Singleton Pattern)

애플리케이션이 시작될 때 어떤 클래스가 최초 한번만 메모리를 할당하고(Static) 그 메모리에 인스턴스를 만들어 사용하는 디자인 패턴

생성자가 여러 차례 호출되더라도 실제로 생성되는 객체는 하나고 최초 생성 이후에 호출된 생성자는 최초에 생성한 객체를 반환한다.

인스턴스가 필요 할 때 똑같은 인스턴스를 만들어 내는 것이 아니라, 동일(기존) 인스턴스를 사용하게 한다.

싱글톤 패턴 쓰는 이유

고정된 메모리 영역을 얻으면서 한번의 new로 인스턴스를 사용하기 때문에 메모리 낭비를 방지할 수 있다.

싱글톤으로 만들어진 클래스의 인스턴스는 전역 인스턴스이기 때문에 다른 클래스의 인스턴스들이 데이터를 공유하기 쉽다.

DBCP(Database Connection Pool)처럼 공통된 객체를 여러개 생성해서 사용해야하는 상황에서 많이 사용한다.

싱글톤 패턴의 문제점

싱글톤 인스턴스가 너무 많은 일을 하거나 많은 데이터를 공유시킬 경우 다른 클래스의 인스턴스들 간에 결합도가 높아져 "OCP"을 위배하게 된다.(=객체 지향 설계 원칙에 어긋남)

따라서 수정이 어려워지고 테스트하기 어려워진다.

멀티 쓰레드 환경에서 동기화처리를 안하면 인스턴스가 두개가 생성되는 경우가 발생할 수 있음

여러 사용자가 API호출을 해서 동시에 DB Connection을 맺을 경우 어떻게 되는가?

1. 커넥션 풀(DBCP)란

웹 컨테이너(WAS)가 실행되면서 DB와 미리 connection(연결)을 해놓은 객체들을 pool에 저장해두었다가, 클라이언트의 요청이 오면 connection을 빌려주고, 처리가 끝나면 다시 connection을 반납받아 pool에 저장하는 방식을 말한다.

출차 : https://linked2ev.github.io/spring/2019/08/14/Spring-3-%EC%BB%A4%EB%84%A5%EC%85%98-%ED%92%80%EC%9D%B4%EB%9E%80/

2. 특징

  • 웹 컨테이너(WAS)가 실행되면서 connection 객체를 미리 pool에 생성해 준다.
  • HTTP 요청에 따라 pool에서 connection객체를 가져다 쓰고 반환한다.
  • 이와 같은 방식으로 물리적인 데이터베이스 connection(연결) 부하를 줄이고 연결을 관리한다.
  • pool에 미리 connection이 생성되어 있기 때문에 connection을 생성하는 데 드는 요청마다 연결 시간이 소비되지 않는다.
  • 커넥션을 계속해서 재사용하기 때문에 생성되는 커넥션 수를 제한적으로 설정한다.

3. 결론

  • 동시 접속할 경우 pool에서 미리 생성된 connection을 제공하고 없을 경우, 사용자는 connection이 반환될 때까지 번호순서대로 대기상태로 기다린다.
  • WAS에서 커넥션 풀을 크게 설정하면 메모리 소모가 큰 대신 많은 사용자가 대기시간이 줄어들고 반대로 커넥션 풀을 적게 설정하면 그 만큼 대기시간이 길어진다.

https://d2.naver.com/helloworld/5102792