싱글톤 패턴

2022. 3. 29. 01:10·Web

싱글톤이란 객체가 JVM 안에 한 개만 존재하는 것이다.

 

싱글톤이 필요한 이유는 예를들어

웹 애플리케이션은 보통 여러 고객이 동시에 요청을 한다.

클라이언트 A memberService 호출 → new MemberServiceImpl 반환

클라이언트 B memberService 호출 → new MemberServiceImpl 반환

클라이언트 C memberService 호출 → new MemberServiceImpl 반환

고객이 3번 요청 → 객체를 3번 만들어서 반환 (문제점 발생)

위의 예제에서는 3번뿐이지만 MemberServiceImpl를 생성하기 위해 또 다른 객체를 생성해야 한다면

더 큰 낭비를 발생시킨다.

 

해결 방안은 해당 객체를 한 번만 생성하고 이것을 공유하게 동작시키면 된다 → 싱글톤 패턴

public class SingletonService() {
	private static final SingletonService instance = new SingletonService();

	public static getInstance() {
		return instance;
	}

	// private를 사용해서 객체 생성을 못하도록 막는다.
	private SingletonService() {
	}
}

초기에 instance를 생성해두고 getInstance()를 통해 생성되어있는 SingletonService 객체를 반환받는다.

이외에도 싱글톤 패턴을 구현하는 방법은 다양하다고 한다. (위의 예제는 미리 생성해두지만 요청 시에 생성하는 등)

 

싱글톤 패턴 문제점

  • 싱글톤 패턴을 구현하는 코드 자체가 많이 들어간다.
  • 클라이언트가 구체 클래스에 의존한다 → DIP 위반
  • 클라이언트가 구체클래스에 의존한다 → OCP 위반
  • 미리 설정을 끝내 놓기 때문에 테스트가 어려움
  • 내부 속성을 변경하거나 초기화하기 어려움
  • 결론적으로 유연성이 떨어진다.

 

하지만 스프링 컨테이너를 사용하면 객체를 싱글톤 컨테이너로 관리해 준다.

(@Configuration 사용 시 스프링의 기본 빈 등록 방식은 싱글톤)

또한 위의 문제점을 해결해준다.

 

싱글톤 방식의 주의점

여러 클라이언트가 하나의 같은 객체 인스턴스를 공유하기 때문에 싱글톤 객체는 상태를 유지하게 설계하면 안 된다.(지역 변수와 같은 것을 사용하여 상태가 유지되지 않도록 설계를 한다.)

'Web' 카테고리의 다른 글

IoC, DI, 컨테이너  (0) 2022.03.29
AppConfig (설정 정보)  (0) 2022.03.29
JPA N+1 문제  (0) 2022.03.16
관심사의 분리  (0) 2022.03.13
좋은 객체 지향 설계의 5가지 원칙(SOLID)  (0) 2022.03.13
'Web' 카테고리의 다른 글
  • IoC, DI, 컨테이너
  • AppConfig (설정 정보)
  • JPA N+1 문제
  • 관심사의 분리
마술사의 수습생
마술사의 수습생
언젠간 당신처럼 되고 싶어요.
  • 마술사의 수습생
    개발 기록 블로그
    마술사의 수습생
  • 전체
    오늘
    어제
    • 분류 전체보기 (53)
      • Web (50)
      • 일기 (2)
      • 잡담 (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
마술사의 수습생
싱글톤 패턴
상단으로

티스토리툴바