스프링 컨테이너

Viva의 놀이터·2021년 5월 16일
0

spring

목록 보기
11/13

컨테이너?

컨테이너는 객체의 생성과 소멸을 컨트롤하고 이런 객체들로 만들어진 인스턴스에 추가적인 기능을 제공하는 것

객체, 클래스, 인스턴스

  • 객체(Object)는 소프트웨어 세계에 구현할 대상 (목표)
  • 클래스(Class)는 객체를 구현하기 위한 설계도 (방법)
  • 인스턴스(Instance)는 클래스에 따라 소프트웨어 세계에 구현된 실체 (결과)

스프링 컨테이너?

스프링에서 생성된 Bean의 생성과 소멸, 사용, 생명 주기들을 관리한다.
Bean이 생성이 되면 스프링 컨테이너에 담기게 되고 개발자가 Bean의 주입을 원하면 주입을 해주는게 스프링 컨테이너이다.

여기서 개발자가 Bean을 스프링 컨테이너에 등록만 해주고 원할 때 Bean을 직접 넣는게 아니라 스프링 컨테이너를 통해서 주입을 받는 주체가 바뀐 이 현상을 IoC(제어권의 역전)이라고 한다.

IoC(제어권의 역전)

객체의 생성부터 소멸까지 생명주기를 개발자가 내려주는 것이 아니라, 스프링 컨테이너에서 개발자의 요청에 의해서 내려주는 갑을 관계가 뒤바뀐 상황이다.

Ioc의 장점

  • 개발자의 부담이 줄어든다 -> 코드가 단순해진다

개발자가 객체를 컨트롤 했던 것을 스프링 컨테이너가 가져감, 개발자는 직접 객체를 관리할 필요없이 스프링 컨테이너에게 요구사항을 이야기하면 알아서 스프링 컨테이너가 처리해줌

  • 객체간의 의존성이 줄어든다 -> 코드 수정에 용이하다

객체마다 필요한 기능이 있으면 직접 만드는 것이 아니라 스프링 컨테이너에 있으면 가져다 사용하다. 수정 사항이 있으면 스프링 컨테이너에 등록된 Bean만 수정해주면 알아서 해당 Bean을 사용하는 객체들 까지 같이 수정이됨

Ioc의 특징을 가진 스프링 컨테이너의 종류

BeanFactory

  • Bean을 등록, 생성, 조회 하는 등 Bean을 관리하는 역할

  • Lazy loadding -> getBean()이 호출되면 Bean을 인스턴스화 하기 시작함

ApplicationContext

  • BeanFactory를 상속 받는다.
  • BeanFactory를 확장한 향상된 컨테이너이다.
  • 국제화가 지원된 텍스트 메시지를 관리해준다.(UTF-8 한국)
  • 리스너로 등록된 빈에게 이벤트 발생을 알려준다.
  • 우리가 일반적으로 spring boot를 사용할 때 사용한다.

스프링 컨테이너가 가진 디자인 패턴(살짝 매운맛)

SingleTon Pattern

스프링은 SingleTon Pattern 패턴을 사용하고 있다. 자바에서도 SingleTon Pattern을 사용 할 수 있지만 너무 많은 오류와 단점이 존재한다. 그러나 스프링에서는 이런 단점과 오류를 개선하여 사용하고 있다. (스프링 개발자에게 무한한 찬사와 감사를...)

what's that?

SingleTon Pattern은 인스턴스를 1개로 제한하여 global하게 어디서든 접근 할수 있도록 하는 디자인 패턴이다. 스프링에서는 스프링 컨테이너가 모든 Bean들을 싱글톤으로 관리한다.

스프링 컨테이너에서 Bean을 인스턴스화 시켜놓고 Bena이 호출 될때 마다 인스턴스화된 Bean을 반환해준다. 즉 Bean을 딱 1번만 인스턴스화 시켜놓고 이것을 공유하는 것이다.

이렇게 인스턴스를 공유하면 호출 될때마다 새로운 인스턴스가 생기지 않기 때문에 메모리 낭비를 방지 할 수 있다. 공통된 객체의 재생성을 방지한다

public class example(){
	private final testRepository test1;
    	private final testRepository test2;
	// testRepository는 스프링 컨테이너에서 바로 인스턴스화 시켜놓고 대기함
        // example class와 같이 호출이 되면 미리 인스턴스화 시킨 testRepository를 반환해줌
        //test1과 test2는 같은 testRepository의 인스턴스를 공유함
    
    
    
    	System.out.println(test1);
    	System.out.println(test2);
    	// test1과 test2의 출력 값이 같다. 
}

SingleTon Pattern의 문제점

  • 위의 코드 처럼 private 생성자를 가지고 있기에 상속 할 수 없다.
  • test 코드를 작성하기 어렵다
  • 상태를 유지하게 설계하면 안된다. - 멀티 쓰레드이기에 동시에 같은 인스턴스를 공유하다보면 오류가 생기기 때문에 반드시 사용하고 상태를 종료시켜줘야 된다.

https://velog.io/@jaeeunxo1/spring-singleton
https://shxrecord.tistory.com/132
https://sabarada.tistory.com/25
https://joont.tistory.com/144

profile
역사를 잊은 기술에겐 미래가 없다

0개의 댓글