웹 어플리케이션 개발할 떄 싱글톤 패턴을 사용하는 이유
문제 : 웹 어플리케이션은 보통 여러 고객이 동시에 접속한다
@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개만 생성되어 참조값이 같은것을 알 수 있다
'프로그래밍언어 > Java' 카테고리의 다른 글
[Java] 의존관계 주입 방법 (0) | 2022.01.20 |
---|---|
[Java] 스프링과 싱글톤 패턴의 관계 (Configuration) (0) | 2022.01.19 |
[Java] DIP, OCP 원칙 (0) | 2022.01.17 |
스프링 자동 의존관계 , 수동 의존관계 (0) | 2022.01.13 |
스프링 회원 조회 기능 구현 (0) | 2022.01.12 |
댓글