참고
Spring core basic 시리즈는 김영한 님의 "스프링 핵심 원리 - 기본편" 강의를 정리한 글입니다. 글에 첨부된 사진은 해당 강의의 강의 자료에서 캡쳐한 것입니다. 제 Github에만 올려뒀다가, 정보 공유와 강의 홍보(?)를 위해 블로그에도 업로드합니다. 마크다운을 잘 쓰지 못해서 가독성이 조금 떨어지는 점 양해 바랍니다.
스프링 핵심 원리 - 기본편 - 인프런 | 강의
스프링 입문자가 예제를 만들어가면서 스프링의 핵심 원리를 이해하고, 스프링 기본기를 확실히 다질 수 있습니다., - 강의 소개 | 인프런...
www.inflearn.com
싱글톤 컨테이너
스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤(1개만 생성)으로 관리한다. 지금까지 우리가 학습한 스프링 빈이 바로 싱글톤으로 관리되는 빈이다.
싱글톤 컨테이너
스프링 컨테이너는 작성한 코드에 싱글턴 패턴을 적용하는 코드를 추가하지 않아도, 알아서 객체 인스턴스를 싱글톤으로 관리한다.
이전에 설명한 컨테이너 생성 과정을 자세히 보자. 컨테이너는 객체를 하나만 생성해서 관리한다.
스프링 컨테이너는 싱글톤 컨테이너 역할을 한다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라 한다.
스프링 컨테이너의 이런 기능 덕분에 싱글턴 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있다.
- 싱글톤 패턴을 위한 지저분한 코드가 들어가지 않아도 된다.
- DIP, OCP, 테스트의 불편함, private 생성자로부터 자유롭게 싱글톤을 사용할 수 있다.
SingletonContainerTest.java
package com.kloong.corebasic1.singleton;
//import 생략
public class SingletonContainerTest {
@Test
@DisplayName("스프링 컨테이너와 싱글톤")
void springContainer() {
ApplicationContext ac =
new AnnotationConfigApplicationContext(AppConfig.class);
//스프링 빈 조회
MemberService memberService1 =
ac.getBean("memberService", MemberService.class);
MemberService memberService2 =
ac.getBean("memberService", MemberService.class);
//두 객체의 주소가 같은 것을 확인
System.out.println("memberService1 = " + memberService1);
System.out.println("memberService2 = " + memberService2);
Assertions.assertThat(memberService1).isSameAs(memberService2);
}
}
MemberService 클래스의 코드에는 싱글톤 패턴과 관련된 어떠한 코드도 없다. private 생성자도 없고, getInstance() 메소드도 없다.
그런데 스프링 컨테이너가 스프링 빈을 싱글톤으로 관리해주기 때문에 여러 번 조회를 해도 같은 객체가 반환되는 것을 확인할 수 있다.
스프링 컨테이너 덕분에 고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 효율적으로 재사용할 수 있다.
이런 작업을 스프링 프레임워크의 도움 없이 직접 처음부터 개발한다고 해보자. 아주 끔찍한 일이다.
*참고: 스프링의 기본 빈 등록 방식은 싱글톤이지만, 싱글톤 방식만 지원하는 것은 아니다. 요청할 때 마다 새로운 객체를 생성해서 반환하는 기능도 제공한다(물론 대부분의 경우 싱글톤 방식을 사용한다). 자세한 내용은 뒤에 빈 스코프에서 다룬다.
'Spring > Spring core basic' 카테고리의 다른 글
[Spring core basic] 26 - @Configuration과 싱글톤 (0) | 2022.05.02 |
---|---|
[Spring core basic] 25 - 싱글톤 패턴 주의점 (0) | 2022.05.02 |
[Spring core basic] 23 - 웹 애플리케이션과 싱글톤 패턴 (0) | 2022.05.02 |
[Spring core basic] 22 - BeanDefinition, 스프링 빈 설정 메타 정보 (0) | 2022.05.02 |
[Spring core basic] 21 - Spring의 다양한 설정 방식 (0) | 2022.05.02 |
댓글