본문 바로가기
Java

[Spring] 의존성 주입(DI) 과 제어의 역전 (IoC)

by 준토리73 2022. 4. 16.

Spring Framework는 많은 기능을 제공하는데, 

가장 많이 사용하는 것 중 하나가 의존성 주입 DI (Dependency Injection) 패턴과 제어의 역전 IoC (Inversion Of Control)

제어의 역전

프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것

객체를 생성할 떄 new 라는 키워드를 더이상 사용할 필요 x

 

 

예시)

더보기

IoC 컨테이너 = 케익 전문점 

기본적인 구조를 기반으로 케이크 주문자의 명세서에 맞게 맞춤 제작을 해주고 또한 보관까지 하고있다가 주문자가 찾으러오면 완성품을 제공하기 때문 

 

DI 는 케익 주문자가 아닌 외부에서 주문 명세서에 맞게 맞춤 제작 

제어의 흐름의 대표적인 예

1. 서블릿

서블릿의 실행은 개발자가 실행할 수 없고, 서블릿에 대한 제어 권한은 컨테이너에 있으며, 컨테이너가 적절한 시점에 서블릿 클래스의 오브젝트를 만들고 그안의 메소드 호출 

 

2. 디자인 패턴의 템플릿 메소드 

더보기

1. 빈 팩토리 BeanFactory 

- DI의 기본사항을 제공하는 가장 단순한 컨테이너 

- Bean을 저장한다고 하여 BeanFactory라고도 불림

 

2. ApplicationContext

- Beanfactory를 상속받은 인터페이스 

IoC 적용을 위한 기법 

- DL (Dependency LookUp) : 의존대상(사용할 객체)을 검색(lookup)을 통해 반환받는 방식

- DI (Dependency Injection) : 의존대상(사용할 객체)을 주입을 통해 받는 형식

 

의존성 주입

DI란, 외부에서 두 객체간의 관계를 결정해주는 디자인 패턴으로 인터페이스를 사이에 둬서 클래스 레벨에서는 의존관계가 고정되지 않도록 하고, 런타임 시 관계를 다이나믹하게 주입하여 유연성을 확보하고 결합도를 낮춤 

 

Service 계열에서 DAO를 필요로 한다.
→ Service(DAO) 이것을 의존성을 주입하는 것

의존성 주입 방법

1. 필드 주입(Field Injection)

2. 세터 주입(Setter Injection)

3. 생성자 주입 (Constructor Injection) 

 

클래스를 생명 주기에 걸쳐 관리해주는 컨테이너 형태로 이 기능을 제공 

 

1. 필드 주입방식 

@Autowired 어노테이션 키워드 붙여주면 자동으로 주입 

@Autowired는 등록된 Bean의 타입과 변수의 타입을 매칭해서 객체를 주입시켜주며, 선언위치는 인스턴스 변수, 생성자, 메소드 위에 선언 

@Service("BoardService")
public class BoardService{

	@Autowired
	private BoardDao boardDao;
	
	public String selectNow() {
	
		return boardDao.selectNow();
	}
	
}

많이 사용되지만, 의존성 주입이 쉽기 때문에 권장하지 않는 방법

 

2. 세터 주입방식 

Setter Injection 방식은 setter 메소드에 @Autowired 를 붙여서 객체 주입하는 방식 

@Service("BoardService")
public class BoardService{

	@Autowired
	private BoardDao boardDao;
	
	public void setBoardDao(BoardDao boardDao) {
		
		this.boardDao = boardDao;
	}

}

3. 생성자 주입방식 

@Service("BoardService")
public class BoardService{

	@Autowired
	private BoardDao boardDao;
	
	public BoardDao(BoardDao boardDao) {
		this.boardDao = boardDao;
	}

}

의존성 주입이 필요한 이유 

  • 재사용성 높여줌
  • 테스트하기 용이함 -> 본인이 원하는 주입을 외부에서 만들어 넣은 후 테스트 가능 
  • 객체들 간의 의존성을 낮추며 유연성을 높이기 위해서 

 

 

연관 다음글

https://delveloper-jtory73.tistory.com/88

 

[Spring] Spring Bean 이란?

Bean 이란? Spring IoC 컨테이너가 관리하는 자바 객체 new 연산자로 생성했을때의 빈이 아닌 ApplicationContext.getBean()으로 얻어질 수 있는 객체 → 즉, Spring에서의 빈은 ApplicationContext가 만들어서 그..

delveloper-jtory73.tistory.com

 

Reference

https://steady-coding.tistory.com/458

https://velog.io/@hahm0726/Spring%EC%9D%98-%EA%B0%9C%EB%85%90

https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=pjok1122&logNo=221737994710 

'Java' 카테고리의 다른 글

[Spring] VO, DTO, Entity  (0) 2022.04.20
[Spring] Spring Bean 이란?  (0) 2022.04.18
[Spring] STS 4 설치하기  (0) 2022.04.02
GetMapping, PostMapping  (0) 2021.08.13
Spring boot 로 Toy Project (TodoList) 개발환경 구축  (0) 2021.08.12

댓글