스프링 컨테이너

Jake·2022년 3월 27일
0

Spring

목록 보기
2/2

1. 스프링 컨테이너의 생성 과정

ApplicationContext applicationContext = new AnnotationConfigApplicationContext();
  • 위 코드의 의미는 다음과 같습니다
    • ApplicationContext: 인터페이스
    • AnnotationConfigApplicationContext: 인터페이스의 구현체

      여기서 ApplicationContext가 곧 스프링 컨테이너입니다

  • 스프링 컨테이너를 생성할 때 구성정보를 지정해주는 방식은
    • AppConfig.class를 사용하는 방식과
    • .xml을 사용하는 방식이 있습니다

2. 싱글톤

  • 클래스의 인스턴스가 딱 1개(Single)만 생성되는 것을 보장하는 디자인 패턴
  • 따라서 객체 인스턴스가 생성되는 것을 아예 막아야 하기 때문에
    -> private 생성자를 만들어둬서 new로 객체 인스턴스가 생성되는 것을 원천봉쇄 해야합니다!

1_ How to (어떻게 싱글톤 패턴을 구현하는가)

//김영한님의 스프링 핵심원리 기본편 강의의 코드를 참조했습니다
public class SomeService {
	public static final SomeService instance = new SomeService();
    
    public static SomeService getInstance() {
    	return instance;
    }
    
    private SomeService() {}
}

위 코드를 하나하나 뜯어서 살펴보겠습니다

  • public static final SomeService instance = new SomeService();

    • public : 사실 getInstance() 메서드 때문에 접근제어자는 public일 이유는 없습니다 (오히려 캡슐화를 생각하면 private이 좋을지도 모르겠습니다..)
    • static : JVM의 static 영역에 인스턴스를 올리기 위함입니다. 이 경우, 해당 인스턴스는 프로그램 시작 시에 생성되어 종료 시점까지 GC의 대상이 되지 않습니다.
    • final : instance가 참조하는 인스턴스의 레퍼런스가 변경되지 못하도록 막습니다

  • public static SomeService getInstance()

    • static : 위에서 살펴본 static 사용 이유와 같습니다

  • private SomeService()

    • private : 생성자가 외부에서 절대 호출될 수 없도록 합니다. 이를 통해 SomeService의 인스턴스는 프로그램의 생명주기 동한 유일하게 존재함이 보장됩니다

2_ 단점

  • 구현 자체에 코드가 많이 들어갑니다
  • 클라이언트가 구체 클래스에 의존하게 되어 DIP를 위반합니다.
  • 구체 클래스에 의존하게 된다는 것은 OCP 원칙을 위반할 가능성이 높음을 의미합니다
  • 테스트하기 어렵습니다
  • 내부 속성을 변경하거나 초기화하기 어렵습니다
  • 자식 클래스를 만들기 어렵습니다

따라서 싱글톤 패턴은 전반적으로 유연성이 굉장히 떨어지게 됩니다


3. 싱글톤 컨테이너

스프링이 DI, IoC를 통해 OOP 원칙을 지킬 수 있도록 했던 것처럼, 여기서도 Spring 컨테이너는 싱글톤 컨테이너의 기능을 수행하여 싱글톤의 단점들을 커버합니다

단, 무상태(stateless)로 설계해야 합니다! 이를 위해서는 다음을 준수해야 합니다

  • 특정 클라이언트에 의존적인 필드가 있으면 안된다
  • 특정 클라이언트가 값을 변경할 수 있는 필드가 있으면 안된다
  • 가급적 읽기만 가능해야 한다
  • 필드 대신에 자바에서 공유되지 않는, 지역변수, 파라미터, ThreadLocal 등을 사용해야 한다

싱글톤을 가능하게 하는 @Configuration

AppConfig.class에 반드시 붙어야 하는 어노테이션인 @Configuration은 바이트코드를 조작하여 싱글톤을 가능하게 만듭니다.
AppConfig 내부에서 같은 클래스의 인스턴스를 여러 번 초기화 하는 경우가 발생한다면, 스프링 빈에 존재하는 빈으로 모두 통일하여 인스턴스를 반환합니다
자세한 사항은 김영한님의 인프런 강의 - 스프링의 핵심 원리를 참고해주세요!

profile
Java/Spring Back-End Developer

0개의 댓글