컨테이너는 객체의 생성과 소멸을 컨트롤하고 이런 객체들로 만들어진 인스턴스에 추가적인 기능을 제공하는 것
스프링에서 생성된 Bean의 생성과 소멸, 사용, 생명 주기들을 관리한다.
Bean이 생성이 되면 스프링 컨테이너에 담기게 되고 개발자가 Bean의 주입을 원하면 주입을 해주는게 스프링 컨테이너이다.
여기서 개발자가 Bean을 스프링 컨테이너에 등록만 해주고 원할 때 Bean을 직접 넣는게 아니라 스프링 컨테이너를 통해서 주입을 받는 주체가 바뀐 이 현상을 IoC(제어권의 역전)이라고 한다.
객체의 생성부터 소멸까지 생명주기를 개발자가 내려주는 것이 아니라, 스프링 컨테이너에서 개발자의 요청에 의해서 내려주는 갑을 관계가 뒤바뀐 상황이다.
개발자가 객체를 컨트롤 했던 것을 스프링 컨테이너가 가져감, 개발자는 직접 객체를 관리할 필요없이 스프링 컨테이너에게 요구사항을 이야기하면 알아서 스프링 컨테이너가 처리해줌
객체마다 필요한 기능이 있으면 직접 만드는 것이 아니라 스프링 컨테이너에 있으면 가져다 사용하다. 수정 사항이 있으면 스프링 컨테이너에 등록된 Bean만 수정해주면 알아서 해당 Bean을 사용하는 객체들 까지 같이 수정이됨
Bean을 등록, 생성, 조회 하는 등 Bean을 관리하는 역할
Lazy loadding -> getBean()이 호출되면 Bean을 인스턴스화 하기 시작함
스프링은 SingleTon Pattern 패턴을 사용하고 있다. 자바에서도 SingleTon Pattern을 사용 할 수 있지만 너무 많은 오류와 단점이 존재한다. 그러나 스프링에서는 이런 단점과 오류를 개선하여 사용하고 있다. (스프링 개발자에게 무한한 찬사와 감사를...)
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의 출력 값이 같다.
}
https://velog.io/@jaeeunxo1/spring-singleton
https://shxrecord.tistory.com/132
https://sabarada.tistory.com/25
https://joont.tistory.com/144