Spring Framework는 많은 기능을 제공하는데,
가장 많이 사용하는 것 중 하나가 의존성 주입 DI (Dependency Injection) 패턴과 제어의 역전 IoC (Inversion Of Control)
제어의 역전
프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것
예시)
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 |
댓글