본문 바로가기

Spring Framwork

비트캠프 - 2020.03.13 Spring Framework (4) : DI(의존성 주입)

# DI(Dependency Injection)

 

- 기존의 의존관계

 

Foo f = new Foo();

Bar b = new Bar(f);

>> 의존 객체 변경 시 코드 수정이 불가피하다.

 

(1) Spring에서 의존관계

- 객체간의 의존성을 설정 파일(xml)로 손쉽게 관리한다.

- 두 가지 방법 존재

 

1. Constructor-based Injection

- 의존하는 객체(위 예시에서는 Foo객체)를 생성자를 통해서 전달 받는다.

- <contructor-arg> 태그 이용

  * 객체인 경우 <ref> 태그

  * 문자열이나 기본 데이터 타입이라면 <value> 태그

>> applicationContext.xml의 내용을 java로 표현하자면

 

import x.y.Bar;
import x.y.Baz;

Bar = new Bar();
Baz = new Baz();
Foo foo = new Foo(bar, baz);

 

>> 이런식으로 표현할 수 있다.

 

- 또한 index 속성으로 순서를 정해줄 수도 있다.

>> 위 그림에서 applicationContext.xml을 java로 표현하자면

 

import myspring.sample2.constructor.GreetingServiceImpl;

GreetingServiceImpl greeting1 = new GreetingServiceImpl("안녕", 3);

 

>> 이런식으로 표현할 수 있다.

 

 

 

2. Setter-based Injection

- setXxx() 형태의 설정 메서드를 통해서 전달받는 방법으로 프로퍼티 설정 방식

  * 의존하는 객체를 전달받을 setter 메서드를 작성한다.

  * 설정파일에 <property> 태그를 이용

    : 객체인 경우 <ref> 태그

    : 문자열이나 기본데이터 타입이라면 <value> 태그

- 생성자 오버로딩 시 기본 생성자가 반드시 필요하다.

 

3. Look-up 메서드 인젝션

- 접근제한자는 public 또는 protected

- 리턴타임이 void가 아니다.

- 인자를 갖지 않음

- 추상메서드도 가능

- final이 되면 안됨

 

4. 임의 빈 객체 사용

>> java로 표현한다면

Foo foo = new Foo();
foo.setEmail("heojk@daum.net");
foo.setBar(new Bar());

 

5. 컬렉션 타입의 프로퍼티 설정

>> java로 바꾼다면

Bar bar = new Bar();
Bar bar2 = new Bar();
Foo foo = new Foo();
Map<String, Bar> map = new HashMap<String, Bar>();
map.put("hello", bar);
map.put("hi", bar2);
foo.setGreetingMap(map):

 

>> java로 바꾼다면

Properties properties = new Properties();

properties.setProperty("server", "192.168.1.100");

properties.setProperty("timeout", "5000");

Foo foo = new Foo();

foo.setConfig(properties);