당니의 개발자 스토리
싱글톤 컨테이너 본문
싱글톤 컨테이너
이제 싱글톤 컨테이너에 대해서 알아보겠습니다.

스프링 컨테이너는 싱글톤 패턴의 문제점을 해결하면서, 객체 인스턴스를 싱글톤으로 관리합니다.
지금까지 우리가 학습했던 스프링 빈이 바로 싱글톤으로 관리되는 빈이에요.

스프링 컨테이너는 싱글톤 패턴을 적용하지 않아도, 객체 인스턴스를 싱글톤으로 관리해줍니다. 이전에 설명한 컨테이너의 생성 과정을 잘 생각해 보세요. 컨테이너가 스프링 빈 객체를 생성하면 하나만 생성해서 관리했어요.

스프링 컨테이너가 만들어지고, 그 다음에 @Bean 붙어있는 메서드마다 다 호출해서 빈 객체를 스프링 컨테이너가 미리 등록을 해서 관리를 해줘요. 객체 인스턴스를 미리 생성을 해놓고 관리해줘요.
그래서 조회하면 관리되고 있는 거를 조회해줘요. 두번 조회하면 이미 관리되던 걸 조회해줘요. 좀 이따 테스트코드로 확인해 볼게요.
그래서 스프링 컨테이너는 싱글톤 컨테이너의 역할을 합니다. 이렇게 싱글톤 객체를 생성하고 관리하는 기능을 싱글톤 레지스트리라고 해요. 스프링 컨테이너의 이런 기능 덕분에 싱글톤 패턴의 모든 단점을 해결하면서 객체를 싱글톤으로 유지할 수 있습니다.
자 싱글톤 패턴의 가장 큰 단점, 싱글톤 패턴을 위해서 적었던 이전에 그 지저분한 코드들을 이젠 미리 안 적어도 돼요. 싱글톤 패턴을 쓰면 유연성이 확 떨어진다고 그랬죠.
그리고 구체 클래스.getInstance() 이렇게 해야 되기 때문에, DIP나 OCP를 위반하거든요. 근데 그런 코드가 다 빠지잖아요.
그리고 스프링이 관리해주기 때문에 DIP, OCP, 그리고 테스트를 유연하게 하거나, private 생성자도 필요 없어요. 이런 걸로부터 자유롭게 싱글톤을 사용할 수가 있습니다.
테스트를 바로 해봅시다.
우리가 기존에 만들었던 SingletonTest에다가 하나 추가 할게요.

왜 springContainer 라고 했냐면, 이전의

pureContainer와 비교하기 위해서 입니다. pureContainer에 있는 걸 복사 붙이기 해보겠습니다.
그러고 나서, 스프링 컨테이너를 호출하면 되겠죠.

그 다음에 appConfig에서 직접 꺼내오던 걸, getBean으로 꺼내오면 됩니다.

이렇게 ac에서 getBean으로 꺼내오도록 바꾸고나서, 조회할 때마다 같은 객체를 반환하는지 봅시다.

실행해보면 참조 값이 똑같죠. isSameAs로 검증해서 성공한 걸 볼 수 있습니다.
isNotSameAs로 하면 안되죠. 실제로 테스트 케이스를 작성할 때, 테스트 자체를 잘못해서 오류가 생기는 경우도 있습니다.
지금 조회 할 때마다 어떻게 되나요? memberService1이랑 memberService2에다가 스프링이 처음에 컨테이너에다가 빈으로 등록했던 애를 계속 반환해주는 거에요. 싱글톤 맞죠.

지금 싱글톤과 관련된 코드가 하나라도 들어가 있나요? 없습니다.
어차피 스프링을 쓰면 스프링 컨테이너를 통해서 사용하기 때문에 MemberService를 직접 new로 생성하거나 그러진 않을 거에요. 이미 올라가 있는 걸 조회하겠죠.
우리는 스프링 컨테이너 내부에서 꺼내서 사용해야 됩니다. 라는 내부 규약을 가지고 개발합니다.
그리고 스프링 컨테이너가 주입하고 이럴 때 다들 싱글톤이기 때문에, 잘못되는 문제점이 없습니다.
그래서 싱글톤 컨테이너를 적용하면 어떻게 되느냐?

이렇게 됩니다. 고객인 클라이언트 A, B, C가 올때마다 어떻게 됩니까? 동일한 memberService를 반환해주죠. 굉장히 빠르게 처리가 되겠죠.
스프링 컨테이너 덕분에 고객의 요청이 올 때 마다 객체를 생성하는 것이 아니라, 이미 만들어진 객체를 공유해서 효율적으로 재사용할 수 있습니다.
제가 AppConfig를 만들면서 스프링 컨테이너로 넘어올 때, "이렇게 컨테이너로 바꿨는데, 코드가 복잡해진 것 같은데 도대체 뭐가 좋은지 잘 모르겠지만, 제가 강의를 계속 설명하면서 하나씩 말씀드릴게요." 라고 한 게 이런 부분이에요.
코드 자체는 내가 AppConfig를 사용하는 것보다 조금 더 많아지긴 해요. 그런데 싱글톤 컨테이너의 이런 기능까지 적용하려면 언제 다 만들고 있어요. 만들기 엄청 힘들겠죠. 스프링을 가져다 써야합니다.
아무튼 스프링 컨테이너를 사용하면 딱 기본적으로 "싱글톤으로 동작한다" 라고 이해하시면 돼요.

참고로 뒤에서 배울 건데, 스프링의 기본 빈 등록은 싱글톤 방식이에요. 그런데 싱글톤 방식 말고도, 요청할 때마다 객체를 새로 생성해서 반환하는 기능 역시 스프링이 제공합니다.
자세한 내용은 뒤에 나오는 빈 스코프에서 설명할 건데요. 거의 99%는 싱글톤 빈만 쓰신다고 이해하시면 돼요.
특별한 경우가 아니면, 기본적으로 스프링은 싱글톤 방식으로 동작한다고 이해하시면 됩니다.
다음 시간이 엄청나게 중요합니다. 싱글톤 방식의 주의점인데요. 이것 때문에 실무에서 정말 몇 년마다 한 번씩 큰 고난을 겪기 때문에 다음 시간에는 싱글톤 방식을 사용할 때의 주의점에 대해서 설명드리겠습니다.
'스프링 > 스프링 핵심 원리 - 기본편' 카테고리의 다른 글
| @Configuration과 싱글톤 (0) | 2024.01.23 |
|---|---|
| 싱글톤 방식의 주의점 (0) | 2024.01.23 |
| 싱글톤 패턴 (0) | 2024.01.23 |
| 웹 애플리케이션과 싱글톤 (0) | 2024.01.23 |
| 스프링 빈 설정 메타 정보 - BeanDefinition (0) | 2024.01.23 |