본문으로 바로가기

[스프링의 대표개념] IoC / DI

category 스프링 2020. 5. 19. 22:49

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