Programming/Spring

Spring DI(Dependecy Injection)

byeong07 2018. 6. 13. 13:22

- DI(Dependecy Injection)

 

DI는 의존성 주입이라 합니다.

 

객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입을 하는 방법입니다.

 

A라는 객체에서 B, C라는 객체를 이용할 때 두 가지 방법이 있습니다.

 

 

 

첫 번째 방법은 A 객체가 B와 C 객체를 new 생성자를 통해서 생성하는 방법이고

 

두 번째 방법은 외부에서 생성된 객체를 setter()나 생성자를 통해서 사용하는 방법입니다.

 

첫 번째 방법을 보시면 MainClass는 Cats를 의존하고 있으며, MainClass에서 직접 Cats 클래스를 생성해서 사용합니다.

 

 

두 번째 방법의 그림을 보시면 A 객체에서 직접 생성하지 않고, 외부에서 생성된 객체를 setter(), 생성자를 이용해서 사용합니다.

 

spring에서 사용하는 DI라고 합니다.

 

spring은 다른 객체들이 사용하고 다른 서비스를 위해 사용할 수 있는 클래스를 컨테이너 형태로 이 기능을 제공합니다.

 

A라는 객체에서 B, C 객체를 사용할 때 A 객체에서 직접 생성을 하는 것이 아닌 외부(IOC 컨테이너)에서 생성된

 

B, C 객체를 조립(주입)하여 setter나 생성자를 통해 사용할 수 있는 것입니다.

 

 

 

이번에는 첫 번째 방법과 같은 내용에서 spring의 특징을 적용(방법2)을 하겠습니다.

 

 

 

방법1 예제에서는 Cats 클래스에 setter와 작동하는 메서드를 작성하였는데 방법2 예제에서는 Cats와 MyCats로 나누어 생성했습니다.

 

Cats에는 실제 기능을 하는 메서드를 작성, MyCats에는 필요한 필드를 선언 후 setter를 생성했고,

 

catsNameInfo(), catsAgeInfo() 메서드를 생성하여 직접 처리하지 않고,

 

Cats를 클래스를 사용해서 처리한다.

 

 

 

 

MainClass에서 보시면 방법1처럼 직접 객체를 생성하지 않고 GenericXmlApplicationContext를 사용하여 객체(bean)를

 

외부에서 얻어와서 호출(사용)을 합니다.

 

외부는 configLocation에 있는 경로입니다.

 

객체(bean)를 생성한 applicationContext.xml을 보면

 

 

 

applicationContext.xml 파일을 보면 bean(객체)을 생성했습니다.

 

bean이 두 개가 설정이 되어 있습니다.

 

첫 번째 bean부터 보시면 unique한 값 id는 cats, id가 cats인 bean은 'diEx package에 있는 Cats 클래스입니다.' 라고

 

설정을 했고, 두 번째 bean의 id는 myCats이고, diEx package에 있는 MyCats 클래스인 것을 알 수 있습니다.

 

두 번째 bean MyCats 클래스에는 필드가 있었기 때문에 값을 설정을 해야 합니다.

 

첫 번째 필드(property)인 cats에는 ref(reference) bean(bean을 참조)

 

바로 위에서 생성한 cats라는 bean을 참조하는 것입니다.

 

diEx package에 있는 Cats 클래스를 참조하는 것이라 할 수 있습니다.

 

나머지 필드도 각각 필드명과 필드값을 지정해서 설정했습니다.

 

첫 번째 방법과 두 번째 방법의 차이점은 다음과 같습니다.

 

DI(의존성 주입)을 사용한 두 번째 예제에서는 직접 객체를 생성하지 않고,

 

외부(applicationContext.xml)에서 객체 생성 후 사용할 객체에 주입을 하여 사용합니다.

 

첫 번째 방법처럼 직접 객체를 생성하면 고양이의 정보가 아닌 강아지의 정보를 보고 싶을 때 main 클래스의 소스를 고쳐야 하지만 두 번째 방법을 사용하면 설정 파일만 변경하면 된다.

 

이처럼 소스의 양이 많을 때 DI를 사용하면 확장성이나 유지보수에서 용이합니다.

 

이번에 알아본 것은 DI의 두 가지 방법 중 setter()에 해당됩니다.

 

다음에는 생성자를 이용해서 의존성을 주입시키는 방법에 대해 알아보겠습니다.