Dependency Injection
- 자바 애플리케이션은 애플리케이션의 행동 방식을 제공하기 위해 상호자 작용하는 여러 객체들로 이루어진다.
- 객체가 다른 객체와 상호 작용하는 경우를 의존 관계라고 한다. ( 다른 클래스 객체의 메소드를 사용하는 경우 )
- 의존성 주입은, 객체간의 의존 관계를 생성자나 세터 메소드로 ( 정확히는 arguments ) 명시하고,
객체를 생성할 때 이들을 사용하여 의존 관계를 주입하는 방식인 디자인 패턴이다.
- 의존성 주입 주체
- 프로그래머 - 코드를 통해 직접 ( 세터, 생성자, 팩토리, 서비스 로케이터 등의 디자인 패턴 사용 )
- 프레임워크 - 메타 데이터를 참조하여 대행 ( IoC )
- 스프링에서의 DI 방식 ( 느슨한 방식, 런타임 주입 )
- 세터 사용 - NullPointer 참조 오류 가능
- 생성자 사용 - 추천된다!
- 필드 사용 - 세터와 비슷함.
- Autowired - 필요한 의존 객체의 타입 ( 위 3가지 ) 에 해당하는 빈을 IoC 컨테이너에서 찾아 주입한다.
Inversion of Control
- 이러한 의존성 주입 역할을, 프로그래머가 코드를 통해 직접 책임지는 것이 아니라,
스프링이라는 프레임워크가 스프링 IoC 컨테이너를 통해 객체를 생성하고 DI를 대신 담당한다. ( 제어의 역전 )
- 스프링 Ioc 컨테이너가 관리하는 애플리케이션 객체들을 bean이라고 부른다.
- bean 과 이들의 의존 관계를 설정 메타 데이터를 통해 알 수 있으며,
메타 데이터는 XML, Annotation, 자바 코드를 통해 제공 받는다.
- 제공 받은 메타 데이터를 참조하고, 자바 리플렉션 API를 사용해 객체를 인스턴스화하고 의존 관계를 주입한다.
- 이런식으로 스프링 컨테이너가 관리하는 애플리케이션 객체( bean )를 Plain Old Java Object ( POJO )로 모델링 할 수 있다.
- DI를 스프링 IoC 컨테이너가 외부 메타 데이터를 통해 처리해주는 것은 유지, 보수에 큰 장점이 있다.
( 수정 시 코드를 변경하는 것이 아닌, 빈 설정들을 변경해주면 되기 때문 )
- 스프링 DI 기능의 흐름
- 애플리케이션에 쓰이는 여러 객체간 의존 관계 파악
- 위에서 파악한 각 애플리케이션 객체에 상응하는 POJO 클래스 작성
- 애플리케이션 객체 간 의존 관계를 표현하는 설정 메타데이터 작성
- 스프링 IoC 컨테이너의 인스턴스 ( ApplicationContext )를 만들고 메타데이터 참조
- 각 애플리케이션 객체에 접근 ( 생성 )
Spring의 장점
- IoC 컨테이너를 통한 DI 대신 수행 및 유지, 보수 이점.
- 지역과 전역 트랜잭션을 일관성 있게 섞어 사용 가능.
- 선언적 트랜잭션 관리 가능.
- 스프링 시큐리티 + @Secured 를 사용해서 보안성 확보.
- JMX + @ManagedOperation 를 통해 확장 기능 적용 및 외부 상호작용 용이.
- 이외에도 번거로운 준비 코드를 알아서 처리해주는 추상화 계층 제공을 통해 여러 확장성을 가짐..