본문 바로가기
프로그래밍언어/Java

[Java]웹 어플리케이션과 싱글톤

by Yikanghee 2022. 1. 18.

웹 어플리케이션 개발할 떄 싱글톤 패턴을 사용하는 이유 

 

 

문제 : 웹 어플리케이션은 보통 여러 고객이 동시에 접속한다

@Test
 @DisplayName("스프링 없는 순수한 DI 컨테이너")
 void pureContainer() {

 AppConfig appConfig = new AppConfig();

 //1. 조회: 호출할 때 마다 객체를 생성
 MemberService memberService1 = appConfig.memberService();
 //2. 조회: 호출할 때 마다 객체를 생성
 MemberService memberService2 = appConfig.memberService();
 //참조값이 다른 것을 확인

 System.out.println("memberService1 = " + memberService1);
 System.out.println("memberService2 = " + memberService2);

 assertThat(memberService1).isNotSameAs(memberService2);
 }

여러 고객이 동시에 접속하면 인스턴스가 여러개 생길 것이다

그러면 가비지 컬렉터가 일을 해야되는데 많은 접속이 생기면 막을 수 없다

그래서 싱글톤을 사용하면 대처가 가능하다

해결 : 싱글톤으로 해결가능

  • 싱글톤 패턴은 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다
  • 그래서 객체 인스턴스를 2개 이상 생성하지 못하도록 막아한다
	//1. static 영역에 객체를 딱 1개만 생성해둔다.
 private static final SingletonService instance = new SingletonService();

 //2. public으로 열어서 객체 인스터스가 필요하면 이 static 메서드를 통해서만 조회하도록
허용한다.
 public static SingletonService getInstance() {
 return instance;
 }

 //3. 생성자를 private으로 선언해서 외부에서 new 키워드를 사용한 객체 생성을 못하게 막는다.
 private SingletonService() {
 }

인스턴스가 1개만 생성되는 것을 보장하기위해서 필드 형태로 static final 로 인스턴스를 생성해준다

그 후 getInstance() 메서드를 통해서만 접근 가능하도록 하고

private를 사용하여 혹시라도 new를 사용하여 불러 오는 상황이 없게 접근 제어를 해준다

//1. 조회: 호출할 때 마다 같은 객체를 반환
 SingletonService singletonService1 = SingletonService.getInstance();

 //2. 조회: 호출할 때 마다 같은 객체를 반환
 SingletonService singletonService2 = SingletonService.getInstance();

 //참조값이 같은 것을 확인
 System.out.println("singletonService1 = " + singletonService1);
 System.out.println("singletonService2 = " + singletonService2);

getInstance() 메서드를 사용하여 호출해주면 인스턴스가 1개만 생성되어 참조값이 같은것을 알 수 있다

댓글