싱글톤 패턴은 디자인 패턴을 잘 모르는 사람이라도 많이 들어보았을 것이라 생각한다. 기본적으로 스프링 빈도 싱글톤 패턴으로 생성된다. 그렇다면 싱글톤 패턴이란 무엇인지 알아보도록 하자
1. 싱글톤 패턴이란?
싱글톤 패턴은 클래스의 인스턴스가 딱 1개만 생성되는 것을 보장하는 디자인 패턴이다. 그래서 객체 인스턴스를 2개 이상 생성하지 못하도록 막아놓은것을 싱글톤 패턴이라고 한다. 이 부분은 코드를 보는것이 이해가 더 빠를 것이다.
1-1 싱글톤 코드
public class SingletonService {
private static final SingletonService instance = new SingletonService();
private SingletonService(){
}
public static SingletonService getInstance(){
return instance;
}
public void call(){
System.out.println("싱글톤 호출!");
}
}
코드를 설명하기 앞서 자바의 메모리 구조를 모른다면 먼저 공부하고 오는것을 추천한다. 자바의 메모리 구조
코드를 보면 instance변수에 static이 달려있다. 이것은 미리 static 영역에 instance를 미리 생성해서 올려둔 것이다. 메모리 구조 아키텍처를 먼저 살펴보자
1-2 아키텍처
static 영역 아키텍처를 살펴보면 SingletonService 클래스에 instance 변수가 static 키워드가 붙음으로써 할당된 것이다.
뿐만아니라 우리는 new SingletonService() 로 인스턴스를 생성해 값을 넣어주었다.
따라서 static 영역에는 인스턴스화 된 SingletonService 가 생성되어 있는 것이다.
그리고 우리는 getInstance()를 통해 이미 생성되어 있는 instance 를 사용할 수 있다.
1-3 private 생성자
그렇다면 누군가 new 를 통해 새로운 인스턴스를 생성할 수도 있지 않을까? 그걸 방지하기 위해 생성자를 private으로 막아놓은 것이다.
누군가 instance를 새로 생성하여 실행한다면 컴파일 오류가 발생할 것이다.
2. test
그런데 정말 인스턴스가 하나만 생성되는 것이 맞을까? 하고 의심이 되는 사람도 있을 것이다. 테스트 코드를 통해 확인해 보자
2-1. test 코드
@SpringBootTest
public class SingletonTest {
@Test
@DisplayName("싱글톤 객체가 정말 하나만 생성되는지 확인하는 테스트")
public void singletonServiceTest(){
SingletonService singletonService1 = SingletonService.getInstance();
SingletonService singletonService2 = SingletonService.getInstance();
System.out.println("singletonService1 : " + singletonService1);
System.out.println("singletonService2 : " + singletonService2);
assertThat(singletonService1).isSameAs(singletonService2);
}
}
2-2. 결과
결과를 보면 테스트 코드가 성공했고 두개의 출력문도 일치하는 것을 확인할 수 있다.!
'스프링' 카테고리의 다른 글
인터셉터(Interceptor) 란? (0) | 2024.09.23 |
---|---|
스프링부트 2.7x 버전과 스프링 부트 3.xx 의 차이 (0) | 2024.09.07 |
ResponseEntity와 Rest Api에 대하여 (0) | 2024.07.18 |
@NotNull, @NotEmpty, @NotBlank (0) | 2024.07.11 |
IOC/DI - 제어의 역전/의존성 주입 (0) | 2024.07.07 |