[Spring] 의존성 주입, DI (Dependency Injection) 란? :: 매운코딩
728x90
300x250

* 객체 의존성이란?

: A 객체가 B 객체를 참조하고 있다면 A 객체는 B 객체에 의존성을 가진다. (ex. 일체형 배터리)

public class A {

	public static void main(String[] ars) {
    	B b = new B(); // new 메서드를 통해 객체를 "직접생성"하여 B를 참조하고 있다. == B를 의존하고 있다.
        b.fun();
    }
}

 

* 객체 의존성을 가지는 것의 문제점?

(1) 객체명 변경 또는 객체 메소드명등의 변경이 일어날 때, 그 객체를 의존하고 있는 다른 객체들까지 변경되어야 한다.

B 객체명이 C로 바뀌면 B를 참조하고 있던 A도 코드를 수정해야 하는것.. 

(2) Unit Test가 어렵다.

 

 

* 의존성 주입(DI - Dependency Injection) 이란?

: Framework에 의하여 객체의 의존성이 주입되는 설계 패턴

필요한 객체를 직접 생성하지 않고 외부(xml 파일 등에서 생성된 객체를 사용하는 것

 

* 의존성 주입의 장점

(1) 가독성과 코드 재사용 향상

(2) 종속성 감소

(3) 소스 확장성 및 유지보수에 용이

 

* 의존성 주입 방법

마틴파울러가 정의한 의존성 주입(DI) 패턴은 3가지가 있다.

(1) 생성자를 통한 전달

<bean id="studentDao" class="ems.member.dao.StudentDao"></bean>

<bean id="registerService" class="ems.member.service.StudentRegisterService">
   <constructor-arg ref="studentDao"></constructor-arg>
</bean>

(2) Setter()를 통한 전달

<bean id="dataBaseConnectionInfoDev" class="ems.member.DataBaseConnectionInfo">
   <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:xe" />
   <property name="userId" value="scott" />
   <property name="userPw" value="tiger" />
</bean>

(3) 멤버 변수를 통한 전달

 

-> 현재는 생성자를 통한 의존성 주입을 가장 추천한다.

결론 !!

의존성 주입은 조가 필요한 객체에 대한  실체정보를 외부에서(config.xml, root-context 등) 관리하여 사용하는 것이고, 이렇게 사용하게 되면 모듈간의 결합도가 낮아져서 유연한 변경이 가능하다.

 

 

 

@Autowired 어노테이션을 이용해서

<constructor>나 <property>태그 없이 자동 주입으로 bean을 찾아줄 수도 있다.

스프링 어플리케이션에서 객체의 의존관계를 설정할때 XML이나 자바 코드 설정을 통해 빈을 정의하고 의존 관계를 정의할수도 있지만 @Autowired를 통한 자동 의존주입을 이용할수도 있습니다.

 

 

- 참고 사이트

https://private.tistory.com/39

https://opentogether.tistory.com/86

https://dololak.tistory.com/565 

728x90

+ Recent posts