[Spring.3] Dependency Injection, DI

DI DI 개념

정의

Dependency - 의존관계, 사용될 수 있는 객체의 한 종류. Spring에서는 컨테이너에 등록된 bean.
Injection - Dependency(즉, bean)를 의존관계가 있는 객체에 넘겨주는 것.

Spring Container에 의해 관리되는 bean을 자바 객체가 사용할 수 있도록 의존관계를 맺어주는 것. 어플리케이션에서는 여러 객체들이 존재하고, 객체들 사이에 호출, 프로퍼티를 사용하는 등 다양한 작업을 해야 한다. 예를 들면, A객체를 생성하고 A의 x메소드를 사용해야 하는데, Spring에서는 IoC 디자인 패턴에 의해 Spring Container가 A 객체를 생성해 준다. 내가 A객체의 메소드/프로퍼티를 사용하기 위해서는 스프링 컨테이너가 생성한 bean을 불러와야 한다. 즉, 스프링에서는 객체의 라이프사이클을 Container가 관리하기 때문에, 인스턴스화 된 객체의 메소드/프로퍼티 등을 사용하려면 Container 가 관리하고 있는 bean을 불러와야 하고 자동으로 해당 bean을 찾아서 의존관계를 맺도록 해 주는 것이 Dependency Injection.

DL(Dependency Lookup)는 applicationContext 객체를 직접 생성한 후 context(container)에서 직접 필요한 bean을 가져온다. 반면 DI는 Spring context에 의해 미리 instance화 된 객체(bean)를 자동으로 연결해준다. 가장 큰 차이점은 DL의 경우 개발자가 직접 container를 불러와야 하기 때문에 코드 상에서 container에 의존성이 생긴다는 것이다.

사용방법

1) bean 정의 파일 spring-context.xml 파일에 정의
2) Annotation

@Autowired

@Autowired는 byType이 default. 즉, Spring Container에 등록된 bean중 type(Object Class)이 일치하는 bean을 찾아와서 주입시킴.

@Resource

@Resource는 byName이 default, ex) @Resource(name="aaa") Spring Container에 등록된 bean중 name이 일치하는 bean을 찾아와서 주입시킴. Java에서 기본으로 지원하는 annotation이다.

@Inject

@Inject는 byType이 default. Java에서 기본으로 지원하는 annotation

DI 관련 오류 대표 유형

1) 컨테이너에 bean 객체가 생성되지 않았을 때에

Annotation설정이 제대로 되지 않거나, Spring 설정에 <context:component-scan>설정이 제대로 되지 않았을 때

2) Ambiguous dependencied @Autowired, @Resource에서 타입/이름이 unique하지 않거나 오타 등으로 인해 잘못 설정된 경우