리루

DI (Dependency Injection) 본문

#Spring

DI (Dependency Injection)

뚱보리루 2019. 1. 6. 12:15

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