리루
DI (Dependency Injection) 본문
1. DI의 이해
- 배터리 일체형 장난감(배터리 포함 장난감 기능 객체) vs 배터리 분리형 장난감(장난감 기능 객체 + 배터리 객체)
- 객체를 따로 개발해서 붙이고 떼는 것을 쉽게한다.
- 객체지향 프로그램의 유연성
- 객체를 모두 독립시킴(Interface 사용)
- 프로그램의 확장, 유지보수의 유연성(객체지향의 특성)
2번은 공장에서 배터리 생성 없이 만든다.
*3번은 공장에서 배터리를 기본적으로 하나 넣어주고, 사용자가 바꿀 수 있다.
- StudentDao와 StudentAssembler
- StudentRegisterService, StudentModifyService, StudentDeleteService, StudentSelectService는 StudentDao에 의존(Assembler 생성자확인)하고있다.
- 하나의 StudentDao를 의존주입하고 있기 때문에, 각각의 Service 객체들은 하나의 DB를 공유한다.
2. Spring에서의 의존주입
- 객체를 application.xml 파일을 이용해서 만든다(Spring Container에 생성).
- 아래의 내용으로 객체생성과 의존주입 완료.
- setter를 이용한 의존주입
- set뒤에 문자열 중 첫번째 글자를 소문자로 변경해서 property name 값으로 이용.
- list 객체 의존주입
- map 객체 의존주입
3. Spring 설정파일(*.xml) 분리
- 스프링 설정파일(.xml)에 객체를 만들기 때문에 스프링 설정 파일이 길어지기 마련이다.
- 파일이 길어짐으로써 가독성이나 관리에 힘든 부분이 있다.
- 스프링 설정파일을 효율적으로 분리해 사용해야할 필요가 있다.
<import resource = "classpath:appCfg2.xml />
<import resource = "classpath:appCfg3.xml />
과 같이 추가해주고, 하나의 xml 파일만 불러오면 된다.
4. 의존객체 자동주입
- 스프링 설정파일에서 의존객체를 주입할 때 <constructor-org> 나 <property> 태그로 명시하지 않아도 스프링 컨테이너가 자동으로 필요한 의존 대상 객체를 찾아서 의존대상 객체가 필요한 객체에 주입해주는 기능.
- 개발자는 @Autowired 나 @Resource 라는 어노테이션 정도만 달아주면 된다.
- xml 파일에 <context:annotation-config /> 선언을 해주어야 어노테이션들을 사용할 수 있다. 이를위해 몇가지 namespace를 추가해줘야한다.
- @Autowired : 주입하려는 객체 타입이 일치할 경우, 자동으로 의존주입.
- 생성자에 @Autowired를 사용할 때는 그냥 써주면 되는데,
- Property나 Method에 @Autowired 어노테이션을 사용하기 위해서는 Default 생성자를 명시해주어야 한다.(객체가 생성되어야 의존주입을 하든 뭐든 할 수 있기 때문)
- @Resource : 주입하려는 객체 이름이 일치할 경우, 자동으로 의존주입.
- @Resource는 생성자에는 사용하지 못하고,
- Property나 Method에만 사용할 수 있다.
- Property나 Method에 @ Resource 어노테이션을 사용하기 위해서는 Default 생성자를 명시해주어야 한다.(객체가 생성되어야 의존주입을 하든 뭐든 할 수 있기 때문)
5. 의존객체 선택
- 스프링 컨테이너가 자동주입 해주어야 하는 객체를 찾지 못했을 때, 이를 해결해주기 위함
- No qualifying bean of type [...] is defined: expected single matching bean ,,,
- @Qualifier 사용
- @Inject : @Autowired와 비슷한 기능을 제공하지만 Required 속성이 없다.
- @Inject 사용 시에는 스프링 설정 파일에 따로 설정하지 않고, 의존주입 해주는 파일(자바파일)에서 @Inject 어노테이션과 함께 bean id를 "named=value" 형태로 써주면 된다.
[참조] 자바 스프링 프레임워크(Renewal Ver.) – 신입 프로그래머를 위한 강좌 (Influence 강좌입니다. 미리보기에 제공되는 내용이니 직접 강좌를 보셔도 좋을 것 같습니다.)
'#Spring' 카테고리의 다른 글
Dispatcher Servlet의 동작원리 (0) | 2020.02.02 |
---|---|
JPA Study (0) | 2019.05.19 |
Spring IoC / Bean (0) | 2019.03.25 |
Annotation을 이용한 Spring 설정 (0) | 2019.01.06 |
Spring Bean Life Cycle (0) | 2019.01.06 |