티스토리 뷰

Programming/Spring

DI (Dependency Injection)

Albothyl 2018. 11. 1. 23:56

DI (Dependency Injection)

 

DI는 Spring의 꽃이다. Class 간의 직접적인 관계를 끊어주기 때문이다. DI가 아니면 A Class에서 B Class를 사용하려면 인스턴스를 생성하거나 생성자 혹은 Setter를 사용해야 한다. Spring DI를 사용하면 아래 코드처럼 사용할 수 있다.

 



이 차이는 굉장히 큰 차이점이다. AS-IS는 직접적으로 B의 인스턴스를 생성하거나 생성자, Setter를 사용하기 때문에 B가 변경될 경우 A에 직접적으로 영향을 미치거나 코드의 양이 늘어난다. 반면 TO-BE의 경우 Spring이 제 3자의 입장에서 B의 인스턴스를 A에 넣어주기 때문에 B가 변경되어도 영향도를 최소화 할 수 있다.

 

토비의 스프링에서 말하는 의존관계 주입에는 3가지 조건이 있다.

- Class 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 Interface에만 의존하고 있어야 한다. (하지만 나는 이 의견이 불필요한 Interface만 늘어나는것 같아서 반대한다.)

- 런타임 시점의 의존관계는 Context나 Factory 같은 제3의 존재가 결정한다.

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

 

Spring의 DI를 이용하려면 사용하는 Class와 사용할 Class 모두 Spring의 Bean이어야 한다. 그런데 Spring DI를 이용하려면 왜 Class가 Bean이어야 하고, Bean이란 무엇일까?

 

Spring에서는 오브젝트의 생성, 관계설정, 사용, 제거 등의 작업을 어플리케이션 코드 대신 독립된 Container가 담당하는데, 코드 대신 오브젝트에 대한 제어권을 가지고 있다고해서 IoC Container라고도 한다. 다른 명칭으로는 Spring Container, Bean Factory, Application Context라고도 불린다. (Application Context는 Bean Factory를 상속하고 있다.)

 

Spring Container에서 관리하는 오브젝트가 Bean이다. Bean을 관리하기 위해서는 2가지가 필요한데 POJO Class와 설정 메타정보(BeanDefinition)이다. Application Context는 이 BeanDefinition으로 만들어진 메타정보를 담은 오브젝트를 사용해 IoC와 DI작업을 수행한다. BeanDefinitionReader는 XML이든 Java코드든 메타정보의 내용을 표현한것과 이를 읽어와 BeanDefinition으로 변환해준다. Spring에서 사용하는 BeanDefinition은 아래와 같다.

- Bean 식별자

- id, name, alias

- POJO Class

- Class, Class name

- Scope

- Singleton, Prototype 등 Bean의 생성방식과 존재 범위

- Property

- DI에 사용할 Property 이름과 값, 참조하는 Bean의 이름

- 생성자 파라미터 값 또는 참조

- DI에 사용할 생성자 파라미터 이름과 값, 참조할 Bean의 이름

- Lazy loading 여부

- 우선 Bean 여부 

- Autowired 여부

- 부모 Bean 정보

- Bean Factory 이름

 

 

 

 

@Autowired (Spring에서 지원하는 어노테이션)

- Spring DI를 사용하는 대표적인 방법은 맨 위의 예제처럼 @Autowired 어노테이션을 인스턴스 변수에 사용하는 것이다. 이 어노테이션이 붙은 변수의 타입과 일치하는 컨텍스트 내의 Bean을 찾는다. Bean이 있으면 인스턴스 변수에 주입해준다. 만약 같은 타입의 Bean이 2개 이상이라면 변수의 이름과 같은 이름의 Bean이 있는지 확인한다. 주의할 점은 @Autowired 어노테이션을 사용하려면 사용하는 Class도 Spring의 Bean이어야 한다.

 

@Resource (Java에서 지원하는 어노테이션)

- @Autowired 어노테이션과 거의 똑같지만 차이점은 Bean을 찾을때 이름으로 먼저 찾고, 못찾으면 타입으로 찾는다.

 

@Inject (Java에서 지원하는 어노테이션)

- 특정 Framework에 종속되지 않은 어플리케이션을 구성하기 위해서 @Inject를 사용한다. @Autowired 어노테이션과 마찬가지로 같은 타입의 Bean을 먼저 찾고 그 다음 이름으로 찾는다.

 

 

위 3개의 어노테이션은 Bean을 찾아서 주입 받을때 사용된다. Bean으로 추가 할때에는 다음 어노테이션을 사용한다.

 

@Bean, @Service, @Component

 

@Controller 어노테이션은 MVC모델에서 C인 컨트롤러 Class를 만들때 사용한다.


'Programming > Spring' 카테고리의 다른 글

AOP  (0) 2019.03.27
Request Proxy  (0) 2019.03.27
Argument Resolver  (0) 2019.03.27
Interceptor  (1) 2019.03.27
Spring Application Start Flow  (0) 2018.10.06
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함