01. DI?

01. DI?

*느슨한 결합력?

- 서비스를 유지보수 할 때 소스코드를 고쳐야 하는 것은 결합력이 높은 서비스이다.

- 일부분을 다른 기능으로 대체하거나 수정할 때 편하게 하기 위해서는 느슨한 결합이 필요하다.

- 따라서 interface 형태의 객체를 생성해 두고 객체의 내용을 갈아끼는 방식으로 해야 한다.

- new의 형태로 객체를 생성하는 것이 아니라 XML, Annotation 등의 방식으로 소스코드 외부에서 인터페이스를 구현한다.

* IoC 컨테이너

- Inversion of Control의 약자. 제어권의 역전을 뜻함.

- 개발자가 직접 객체 생성 및 생명주기를 관리하는 게 아니고 컨테이너에게 맡기는 방식.

* DI (Dependency injection)

- 각 클래스 간의 의존관계를 컨테이너가 자동으로 연결해주는 방식.

- 의존관계를 정의하기 위해 Bean 설정파일이 필요함.

- 이 덕분에 코드가 간결해지고 각 요소들 간의 결합력이 낮아지게 됨.

*Setter Injection의 예

package spring.di public class Hello { private String name; private Printer printer; public Hello() {} public void setName(String name) { this.name = name; } public void setPrinter(Printer printer) { this.printer = printer; } public String sayHello() { return "Hello " + name; } public void print() { this.printer.print(sayHello()); } }

Hello 라는 클래스는 printer 인터페이스에 의존함.

하지만 직접적으로 new printer로 생성하지 않고 setter 메서드를 통해 주입한다.

이에 대한 빈 설정은 이렇다.

*Constructor Injection의 예

package spring.di public class Hello { private String name; private Printer printer; public Hello() {} public Hello(String name, Printer printer) { this.name = name; this.printer = printer; } public String sayHello() { return "Hello " + name; } public void print() { this.printer.print(sayHello()); } }

빈 설정

Printer interface

package spring.di.xml; public interface Printer { public void print(String message); }

Printer interface를 구현하는 StringPrinter 클래스

package spring.di.xml; public class StringPrinter implements Printer { private StringBuffer buffer = new StringBuffer(); public void print(String message) { buffer.append(message); } public String toString() { return buffer.toString(); } }

메인 클래스 작성

//import 생략 public class Test { public static void main(String[] args) { //IoC 컨테이너 생성 ApplicationContext ctx = new GenericXmlApplicationContext("config/beans.xml"); //Hello 빈 가져오기 (id로 가져오기) Hello hello = ctx.getBean("hello", Hello.class); System.out.println(hello.sayHello()); hello.print(); //StringPrinter 빈 가져오기 Printer printer = (Printer)ctx.getBean("printer"); System.out.println(printer.toString()); } }

POJO 클래스로 DI를 알아보았다.

from http://purewater-practice-diary.tistory.com/50 by ccl(A) rewrite - 2021-12-23 12:01:09