웹 어플리케이션과 싱글톤은 어떠한 관계가 있을까?
스프링의 태생
1. 기업용 온라인 서비스 기술을 지원하기 위해 탄생.
2. 대부분의 스프링 어플리케이션은 웹 어플리케이션이다.
3. 웹 애플리케이션은 여러 고객이 동시에 요청한다.
싱글톤이란?
혹시나 모르는 사람을 위해 간단하게 싱글톤의 정의를 살펴보자
어플리케이션 실행시 하나의 객체만 생성하도록 구현하여 사용하는 디자인 패턴이다.
간단한 싱글톤 구현
pulic class Singleton {
// static 으로 만들어 한번만 생성되게 구현
// java가 한번 올라올때 생성하여 가지고 있게됨.
private static final Singleton instance = new Singleton();
// getInstance를 통해서만 객체를 가져온다.
public static Singleton getInstance() {
retutn instance;
}
// 생성자를 오버라이딩 하여 외부에서 생성자를 통해 생성할수 없도록 변경
private Singleton() {
}
}
웹 애플리케이션에서 싱글톤이 아닐경우
아래의 그림처럼 클라인트가 동시에 서비스를 요청한다면?
1. 객체를 여러개 생성한다.
- 메모리에 객체가 계속 올라간다.
- 요즘은 컴퓨터가 좋아져서 어느 정도 감당은 하겠지만 좋지 않다.
- 객체를 만들고 해제 하는 과정을 여러번 반복해야 한다.
싱글톤의 단점
하지만 싱글톤 자체도 단점이 존재한다.
1. 싱글톤을 구현해야 되는 코드가 들어간다.
2. 의존관계상 클라이언트가 구체클래스에 의존해야한다.
- getInstance를 꼭 사용을 해야된다.
3. 싱글톤은 이미 설정이 정해져 있다.
- 유연성 떨어짐
4. 자식클래스 만들기가 힘들다.
5. 안티패턴으로 불리기도 한다.
해결법
스프링을 사용한다.
1. 싱글톤을 가진 단점을 알아서 해결해 주고 관리해준다.
2. 기본 빈 등록방식이 싱글톤이다.
스프링 빈 호출 시 주소값
자 이번에는 직접 싱글톤을 만들지 않고
빈에 등록되어 있는 서비스를 가져와서 주소 값을 찍어 보는 예제이다.
public class SingletonService {
@Test
@DisplayName("스프링 컨테이너와 싱글톤")
void springContainer() {
ApplicationContext ac = new AnnotationConfigApplicationContext(AppConfig.class);
//1. 조회: 호출할 때 마다 객체를 생성
MemberService memberService1 = ac.getBean("memberService", MemberService.class);
//2. 조회: 호출할 때 마다 객체를 생성
MemberService memberService2 = ac.getBean("memberService", MemberService.class);
System.out.println("memberService1 = "+memberService1);
System.out.println("memberService2 = "+memberService2);
}
}
출력
memberService1 = hello.core.member.MemberServiceImpl@59f63e24
memberService2 = hello.core.member.MemberServiceImpl@59f63e24
출력시 주소값이 동일하다
그말은 하나의 객체만 생성하여 관리하고 사용한다는 말이다.
이처럼 컨테이너에 등록하면 스프링이 알아서 싱글톤으로 관리해준다는 것을
직접 출력으로통해 알아 보았다.
문제점
하지만 싱글톤으로 하면 여러 문제점 들이 있다.
웹 애플리케이션과 싱글톤2 에서 한번 어떻게 문제가 발생하고 해결하는지 공부해본다.
'Spring > spring 기초 스터디' 카테고리의 다른 글
[Spring] Configuration과 Singleton (0) | 2021.05.05 |
---|---|
[Spring] 웹 애플리케이션과 싱글톤2 (0) | 2021.05.05 |
[Spring] BeanFactory 와 ApplicationContext (0) | 2021.05.01 |
[Spring] Spring Bean 값 조회 하기 (0) | 2021.04.28 |
[Spring] Spring container 와 Spring bean (0) | 2021.04.25 |
댓글