Untitled

싱글톤 패턴은 이처럼 특정 클래스의 인스턴스가 단 하나만 생성되도록 보장하는 디자인 패턴을 의미합니다. 만약 여러 개의 동시다발적인 고객 요청을 처리해야 하는 웹 애플리케이션에서 요청이 있을 때마다 new 연산자를 사용하여 객체를 생성해야 한다면, 매번 이를 위한 메모리 영역을 할당받아야 하는데 이것은 결과적으로 큰 메모리 낭비를 초래할 수 있습니다.

이런 경우 싱글톤 패턴을 구현하여, 최초에 단 하나의 객체를 생성해 두고 요청이 돌아올 때마다 같은 객체를 공유하는 방법으로 메모리 낭비를 최소화할 수 있습니다.

package com.codestates.burgerqueenspring.singleton;

import com.codestates.burgerqueenspring.AppConfigurer;
import com.codestates.burgerqueenspring.Cart;
import org.assertj.core.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;

public class CartSingletonTest {

    @Test
    void checkCartSingleton() {

				// given - 컨테이너 생성
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfigurer.class);

				// when - 빈 조회
				Cart cart = applicationContext.getBean("cart", Cart.class);
        Cart cart2 = applicationContext.getBean("cart", Cart.class);

				// 출력
        System.out.println("cart = " + cart);
        System.out.println("cart2 = " + cart2);

				// then - 검증
        Assertions.assertThat(cart).isSameAs(cart2);

    }
}

위의 테스트 코드를 작성하고, 프로그램을 동작시켜 보면 아래와 같은 실행 화면을 확인할 수 있습니다.

0NYFVfYsNsYvBiHObJNSn-1681354641871.png

이로써 스프링 컨테이너가 내부적으로 객체들을 싱글톤으로 관리한다는 사실이 확실하게 확인되었습니다. 결론적으로, 스프링 컨테이너는 싱글톤 컨테이너 역할을 수행합니다. 그리고 이렇게 싱글톤으로 객체를 생성 및 관리하는 기능을 **싱글톤 레지스트리(Singleton Registry)**라 부릅니다.