객체의 생성, 생명 주기의 관리 모든 객체에 대한 제어권이 바뀌었다는 의미이다. 좀 더 쉽게 말하면 객체의 생성과 소멸, 객체간 관계와 같은 제어를 개발자가 아닌 외부로 위임해 여러 프레임워크나 컨테이너가 수행하도록 하는 설계 원칙이다.
제어의 역전에서는 오브젝트가 사용할 오브젝트를 결정하지도, 생성하지도 않는다.
애플리케이션의 제어 책임이 개발자가 아닌 외부에 위임되므로, 개발자는 핵심 비즈니스 로직 처리에 더 집중할 수 있다는 장점이 있다.
제어의 역전은 클래스간 결합을 느슨하게 설계하여 테스트가 가능하고 유지보수에 용이하게 해준다.
스프링도 객체를 생성하고 관리하고 책임지고 의존성을 관리하는 컨테이너가 있는데, 그게 바로 IoC Container(= 스프링 컨테이너)이다.
인스턴스의 생성부터 소멸까지 생명주기 관리를 개발자가 아닌 스프링 컨테이너가 대신 해주는데 객체관리의 주체가 프레임워크(Container)가 되기 때문에 개발자는 핵심 비즈니스 로직에 집중할 수 있다.
DL
의존관계 검색
의존관계가 있는 객체를 외부에서 주입받는 것이 아닌, 의존관게가 필요한 객체에서 직접 검색하는 방식을 의미한다.
즉 Bean에 접근하기 위해 컨테이너가 제공하는 API를 이용하여 Bean을 찾는 것이다.
DI
의존관계 주입
각 클래스간 의존관계를 빈 설정(Bean Definition)정보를 바탕하여 컨테이너가 자동으로 연결해주는 것을 의미한다.
객체 레퍼런스를 컨테이너로부터 주입 받아서 실행 시,동적으로 의존관계가 생성되도록 하는 것 (컨테이너가 흐름의 주체가 되어 애플리케이션 코드에 의존 관계를 주입하게 되는 것이다.)
DL을 사용하면 컨테이너 종속이 증가해 주로 DI를 사용한다.
스프링 컨테이너가 관리하는 객체로 이 빈들을 관리한다는 의미로 컨테이너를 빈 팩토리(Bean Factory)라고 부른다.
ApplicationContext가 알고있는 객체, 즉 ApplicationContext가 만들어서 그 안에 담고있는 객체를 의미한다.
빈을 만드는 방법은 크게 두 가지가 있다.
- Componet Scanning 컴포넌트 스캔과 자동 의존관계 설정
- 빈 설정 파일에 자바 코드로 직접 등록
스프링 부트에서 사용자가 클래스를 스프링 빈으로 등록하는 쉬운 방법은 클래스 선언부에 @Component
어노테이션을 사용하는 것이다.
개발할 때 사용하는 @Controller, @Service, @Repository는 모두 @Component를 포함하고 있고, 해당 어노테이션으로등록된 클래스들은 스프링 컨테이너에 의해 자동 생성되어 스프링 빈으로 등록된다.
@Controller
public class SampleController {
...
}
수동으로 빈을 등록하려면 자바 설정 파일을 만들어 사용해야 한다.
xml로 스프링 빈을 등록하는 방법은 최근 거의 사용 X
자바 설정 파일은 자바 클래스를 생성해 작성할 수 있고 ㅇㅇConfiguration나 ㅇㅇConfig와 같이 이름을 짓는다.
그리고 상단부에 @Configuration
어노테이션을 추가하고 그 안에
특정 타입을 리턴하는 메소드를 만들어 @Bean
어노테이션을 붙여 직접 빈을 정의한다. 그러면 자동으로 해당 타입의 빈 객체가 생성된다.
@Configuration
public class SampleConfig{
@Bean
public SampleController sampleController{
return new SampleController;
}
}
sampleController()에서 리턴되는 객체가 IoC 컨테이너 안의 빈으로 등록된다.
빈이 존재할 수 있는 범위를 의미하며 Spring은 다양한 스코프를 지원하는데 기본적으로 Singleton으로 생성하여 관리한다.
여기서는 Singleton과 Prototype에 대해서만 알아볼거다.
Singleton Bean은 Spring 컨테이너에서 한 번 생성되고 컨테이너가 사라질 때 Bean도 제거된다.
생성된 하나의 인스턴스는 Single beans cache에 저장되고, 해당 bean에 대한 요청과 참조가 있으면 해당 객체를 반환한다.
스프링 컨테이너 내 하나만 생성되기 때문에 이를 조회하면 스프링 컨테이너는 항상 같은 인스턴스의 빈을 반환한다.
모든 요청마다 새로운 객체를 생성하는 것으로 빈을 조회하면 항상 새로운 인스턴스를 생성하여 반환한다. 빈의 생성과 의존관계 주입까지만 관여한다.
참고
https://gmlwjd9405.github.io/2018/11/10/spring-beans.html
https://dev-coco.tistory.com/70
https://dev-coco.tistory.com/69
https://cantcoding.tistory.com/47
https://code-lab1.tistory.com/186