본문 바로가기

토비의 스프링3/1장_오브젝트와 의존관계

1장 오브젝트와 의존관계(4) - 의존관계주입(Dependency Injection)

336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

1. 의존관계 주입(DI) - Dependency Injection

-. 객체를 생성하고 관계를 맺어주는 등의 작업을 담당하는 기능을 일반화한 것이 스프링의 IoC 컨테이너이다.

-. 스프링 IoC 기능의 대표적인 동작원리는 주로 의존관계 주입이라고 불린다.

-. DI 의 장점은 관심사의 분리를 통해 얻어지는 높은 응집도에서 나온다.

 

2. 의존관계

-. 의존관계란 두개의 클래스 또는 모듈이 의존관계에 있다고 말할 때는 항상 방향성을 부여해줘야 한다.

 

UML모델에서의 클래스의 의존관계 다이어그램(A가 B에 의존하고 있음)

 

B가 변경되었을 경우 A에 영향을 미치나, A가 변경되었을 경우에는 B에 영향을 미치지 않는다.

 

 

UML모델에서의 인터페이스를 통한 느슨한 결합을 갖는 의존관계

 

B 클래스는 A 인터페이스에 의존하고 있다. A가 변경된다면 그 영향을 B 가 직접적으로 받게 된다.

A 인터페이스를 구현한 C 클래스 등이 다른 것으로 바뀌거나 그 내부에서 사용하는 메소드에 변화가 생겨도 A 클래스에 영향을 주지 않는다. 이렇게 인터페이스에 대해서만 의존관계를 만들어두면 인터페이스 구현 클래스와의 관계는 느슨해지면서 변화에 영향을 덜 받는 상태가 된다. - 결합도가 낮음

 

-. 의존관계 주입의 세가지 조건

ㄱ. 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.

ㄴ. 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.

ㄷ. 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 제공(주입)해줌으로써 만들어진다.

 

의존관계 주입의 핵심은 설계 시점에는 알지 못했던 두 오브젝트의 관계를 맺도록 도와주는 제3의 존재가 있다는 것이다. DI에서 말하는 제 3의 존재는 바로 관계설정 책임을 가진 코드를 분리해서 만들어진 오브젝트라고 볼 수 있다.

 

3. 의존관계 검색과 주입

-. 의존관계를 맺는 방법이 외부로부터의 주입이 아니라 스스로 자신이 필요로 하는 의존 오브젝트를 능동적인 검색을 이용

-. 자신이 어떤 클래스의 오브젝트를 이용할지 결정하지 않는다.

-. 스프링의 Application 컨텍스트에 미리 정해놓은 이름을 전달하여 그 이름에 해당하는 오브젝트를 검색한다.

-. 그 대상이 런타임 의존관계를 가질 오브젝트이므로 의존관계 검색이라고 부르는 것이다.

 

public UserDao(){

AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(DaoFactory.class);
this.connectionMaker = context.getBean( ‘ connectionMaker" ’ ConnectionMaker.class);

 

4. 메소드를 이용한 의존관계 주입

-. 생성자를 통한 의존관계 주입과 일반 메소드를 사용할 수 있다.

 

ㄱ. 수정자(setter) 메소드를 이용한 주입

-. 수정자(setter) 메소드는 외부에서 오브젝트 내부의 attribute 값을 변경하려는 용도로 주로 사용된다.

-. 메소드는 항상 set 으로 시작된다.

-. 핵심기능 : 파라미터로 전달된 값을 보통 내부의 인스턴스 변수에 저장하는 것이다. 부가적으로 입력값에 대한 검증이나 그 밖의 작업을 수행할 수도 있다.

-. 수정자 메소드는 외부로부터 제공받은 오브젝트 레퍼런스를 저장해뒀다가 내부의 메소드에서 사용하게 하는 DI 방식에서 활용하기에 적당하다.

 

ㄴ. 일반 메소드를 이용한 주입