IoC(Inversion of Control)
IoC 란?
IoC 는 제어의 역전이라는 의미를 갖고 있다.
기존에는 프로그램의 흐름 중 개발자가 사용할 객체를 직접 생성하고 생명주기를 관리 하였다.
public class Car{
private Oil oil=new Oil();
}
이와 반대로 IoC 개념에서는 개발자가 자신이 사용할 객체를 직접 생성하거나 생명주기를 관리하지 않고 컨테이너에서 관리하도록 하는 것이다.
//Car 객체
public class Car{
private Oil oil;
//Car 객체 생성시 Oil 객체가 주입되어야함.
public Car(Oil oil){
this.oil=oil;
}
}
//의존성을 제어하는 권한이 MakeCarTest 클래스에 있다.
public class MakeCarTest{
public void create(){
//Oil 객체를 생성해서
Oil oil=new Oil;
//Car 객체를 만들때 oil 객체를 생성자를 통해 주입함
Car car=new Car(oil);
}
}
이렇게 스프링에서 객체를 생성하고, 생명주기를 관리하게 하므로써 클래스 간의 의존성을 줄일 수 있다. 따라서 app의 유지 보수시에도 많이 도움이 된다.
참고 : https://sallykim5087.tistory.com/150?category=875288
IoC 컨테이너
컴포넌트 스캔 하여 객체(Bean)를 생성한다.
컨테이너 안에 만들어진 객체(Bean)들의 의존성을 관리한다.
IoC 컨테이너 자체를 하나의 객체(Bean)로 만들어서 갖고 있다.
ApplicationContext
Bean(빈)
Bean(빈)이란? 스프링 IoC 컨테이너가 관리하는 객체
<빈으로 관리하는 방법>
1. Component Scanning
servlet-context.xml 문서에서 Component Scan할 패키지를 정의한다.
그리고 관련 어노테이션(@)을 붙인다.
자세한 Component Scan 사용법은 블로그 참고
- @Component
- @Controller
- @Service
- @Repository
//servlet-context.xml 문서에 component scanning을 할 패키지를 명시
<context:component-scan base-package="com.acorn.exhibition" />
//해당 패키지 안에 어노테이션으로 빈 생성
@Controller
public class HomeController {
@Autowired
private HomeService service;
}
2. XML문서나 자바 설정파일에 직접 등록하기
//@Configuration 어노테이션이 붙어있는 클래스 안에 Bean을 설정해야한다.
@Configuration
public class BeanFactory{
@Bean
public String Test(){
return 'Test';
}
}
DI(Dependency Injection)
<빈 자동 주입>
어떤 빈의 생성자가 오직 하나만 있고, 생성자가 받는 파라미터 타입의 빈이 존재한다면 어노테이션이 없더라도 스프링에서 자동으로 해당 빈을 주입해준다.(파라미터가 두개라도 bean만 생성되어 있다면 자동으로 주입된다.)
//Bean을 설정한다.
@Configuration
public class BeanFactory{
@Bean
public String Oil(){
return 'Oil';
}
}
public class Car{
//멤버변수
private Oil Oil;
//Car 객체 생성시 생성자가 받는 파라미터 타입의 빈이 존재하므로
//@Autowired 어노테이션이 없어도 스프링에서 자동으로 주입(injection)해준다.
public Car(String oil){
this.oil=oil;
}
}
<빈 직접 꺼내서 사용하기>
@Autowired, @Injection 은 생성자, 필드, setter메소드에 사용할 수 있다.
@Autowired, @Injection 추천 사용법
- 생성자에 사용할 때 : 해당 클래스에 객체가 반드시 필요한 경우
- setter메소드에 사용할 때 : 클래스가 setter를 갖고 있다면 setter에 사용
- 필드에 사용할 때 : 그 외의 경우
1. ApplicationContext
ApplicationContext context=new ApplicationContext;
context.getBean(Bean.class);
2. @Autowired
@Autowired
String Test;
3. @Injection
@Injection
String Test;
[참고 자료]
https://www.inflearn.com/course/spring/lecture/15543
https://sallykim5087.tistory.com/150?category=875288
'스프링' 카테고리의 다른 글
[스프링 핵심개념]PSA(Portable Service Abstraction ) (0) | 2020.05.20 |
---|---|
[스프링의 대표개념]AOP (0) | 2020.05.19 |
[Eclips] Eclips 속도 개선 (메모리 용량 수정하기, close project) (0) | 2020.02.05 |
Spring Security Core 다운 (0) | 2020.02.04 |
[AOP] AOP 사용해보기 (0) | 2020.01.31 |