[Java] 스프링 컨테이너와 싱글톤 컨테이너
웹/백엔드, Spring

[Java] 스프링 컨테이너와 싱글톤 컨테이너

이전 시간에 이어서 DI, IoC컨테이너를 스프링 컨테이너로 바꿔봅시다.

 

목차

  • 컨테이너 생성 과정
  • 컨테이너 생성 방법
  • 싱글톤 패턴

 

스프링 컨테이너란?

프레임워크를 사용해서 빈을 생성하고 관리하는 저장소

 

종류

스프링 컨테이너는 BeanFactory와 ApplicationContext가 있습니다.

둘의 구분은 상속관계를 보면 알 수 있듯이 ApplicationContext가 더 기능이 많습니다.

 

생성 방법

  • 컨테이너 생성
  • 빈 등록

먼저 컨테이너를 생성해봅시다.

ApplicationContext ac = new AnotationConfigApplicationContext(AppConfig.class);
//AppConfig클래스를 스프링 컨테이너로 등록하겠다.

그러면 빈 이름과 객체로 구성된 저장소가 생성됩니다.

빈 등록은 @Bean어노테이션을 사용하면 됩니다.

그림처럼 해당하는 빈 이름과 객체에 저장됩니다.

 

생성 과정

생성과정에 대해선 알았으니 생성 방법에 대해서 알아봅시다.

생성 방법은 대표적으로 Java방식과 xml방식이 있습니다.

각 방법에 맞는 컨테이너를 생성해줍니다.

//자바 기반
ApplicationContext ac = new new AnnotationConfigApplicationContext(AppConfig.class);
//xml 기반
ApplicationContext ac = new new GenericXmlApplictionContext(AppConfig.class);

 

자바 기반

단순하다. @Configuration과 @Bean을 달아주면 됩니다.

참고로 @Configuration이 없어도 빈을 등록하는데 무리가 없습니다. 하지만 싱글톤 컨테이너를 만들기 위해 꼭 필요합니다.

xml기반

/resources/appConfig.xml

 

싱글톤 컨테이너

 

우선 싱글톤 패턴에 대해서 알아봅시다

클래스의 객체가 딱 1개만 생성되도록 하는 패턴

  • static 영역에 객체를 1개 생성
  • public static으로 객체를 받을 수 있는 메서드 생성
  • private로 생성자를 선언해서 접근을 막음
public class SingletonService {
  
  private static final SingletonService instance = new SingletonService();
  public static SingletonService getInstance() {
  	return instance;
  }
  private SingletonService() {}
  
}

 

그럼 왜 싱글톤 패턴을 적용해야 할까요?

만약 싱글톤 패턴을 적용하지 않는다면 AppConfig는 요청을 받을 때마다, 새로운 객체를 생성해야 합니다. 왼쪽 그림처럼.. 하지만 싱글톤 패턴을 적용하면 하나의 객체만 공유할 수 있습니다.

 

그럼에도 불구하고 DI 컨테이너의 싱글톤 패턴의 문제점은 있습니다.

DIP, OCP를 위반할 가능성이 높습니다.

 

이런 문제점을 해결하기 위해 스프링 컨테이너를 쓰면 되고 @Configuration 어노테이션으로 인해 싱글톤 패턴까지 적용됐습니다.

 


출처

김영한. 스프링 핵심 원리 - 기본 편