코드 그라데이션
싱글톤 컨테이너 본문
싱글톤 컨테이너
스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다.
지금까지 여기서 다뤄왔던 스프링 빈이 바로 싱글톤으로 관리되는 빈이다.
싱글톤 컨테이너
스프링 컨테이너를 사용하는 테스트 코드
SingletonTest - 테스트 추가
package inflearn.spring_core.singleton;
import inflearn.spring_core.config.AppConfig;
import inflearn.spring_core.member.MemberService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import static org.assertj.core.api.Assertions.assertThat;
public class SingletonTest {
/**
* Ctrl + Shift + enter => (); 이거까지 한 번에 입력됨
*/
@DisplayName("스프링 없는 순수한 DI 컨테이너")
@Test
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);
//cf. assertThat(memberService1).isNotEqualTo(memberService2);
}
@Test
@DisplayName("싱글톤 패턴을 적용한 객체 사용")
public void singletonServiceTest() {
//private으로 생성자를 막아두었다. 컴파일 오류가 발생한다.
//new SingletonService();
//1. 조회: 호출할 때 마다 같은 객체를 반환
SingletonService singletonService1 = SingletonService.getInstance();
//2. 조회: 호출할 때 마다 같은 객체를 반환
SingletonService singletonService2 = SingletonService.getInstance();
//참조값이 같은 것을 확인
System.out.println("singletonService1 = " + singletonService1);
System.out.println("singletonService2 = " + singletonService2);
// singletonService1 == singletonService2
assertThat(singletonService1).isSameAs(singletonService2);
singletonService1.logic();
}
// 추가!
@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);
// 검증
assertThat(memberService1).isSameAs(memberService2); //이건 값이 같음을 검증해야 하므로
}
}
실행 결과
동일한 값 출력
싱글톤 컨테이너 적용 후!
- 스프링 컨테이너 덕분에 고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 효율적으로 재사용할 수 있다.
728x90
'Spring > 핵심 원리 구현' 카테고리의 다른 글
@Configuration과 싱글톤 (0) | 2024.01.29 |
---|---|
싱글톤 방식의 주의점 (0) | 2024.01.27 |
싱글톤 패턴 (0) | 2024.01.26 |
웹 애플리케이션과 싱글톤 (0) | 2024.01.25 |
스프링 빈 설정 메타 정보 - BeanDefinition (0) | 2024.01.24 |
Comments