DI (Dependency Injection)
- 객체 간의 의존 관계를 자신이 아닌 외부의 조립기가 수행한다.
- 제어의 역행(IoC : inversion of Control)이라는 의미로 사용한다.
- DI를 통해 시스템에 있는 각 객체를 조정하는 외부 개체가 객체들에게 생성 시에 의존관계를 줌
- 느슨한 결합(loose coupling)의 주요 강점 : 객체는 인터페이스에 의한 의존관계만을 알고 있으며, 이 의존관계는 구현 클래스에 대하나 차이를 모르는 채 서로 다른 구현으로 대체가 가능하다.
- Spring의 DI 지원 : Spring Container가 DI 조립기를 제공한다. 스프링 설정파일을 통해 객체 간 의존관계를 설정하고, 제공하는 API를 이용해 객체를 사용한다.
용어 정리
Bean
- 스프링이 직접 그 생산과 제어를 담당하고, IoC 방식으로 관리하는 오브젝트.
Bean Factory
- 스프링이 IoC를 담당하는 핵심 컨테이너.
- Bean을 등록, 생성, 조회, 반환하는 기능을 담당한다.
- 일반적으로 BeanFactory를 바로 사용하지 않고 이를 확장한 ApplicationContext를 이용한다.
ApplicationContext
- BeanFactory를 확장한 IoC 컨테이너.
- Bean을 등록하고 관리하는 기본적인 기능은 BeanFactory와 동일하고, 스프링이 제공하는 각종 부가서비스를 추가로 제공한다.
- BeanFactory라고 부를 때는 주로 빈의 생성과 제어의 관점에서 이야기하는 것이고, 애플리케이션 컨텍스트라고 할 때는 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함해서 이야기하는 것이다.
Configufation metadata
- 스프링의 설정정보란 ApplicationContext또는 BeanFactory가 IoC를 적용하기 위해 사용하는 메타정보를 말한다.
- 설정정보는 IoC컨테이너에 의해 관리되는 Bean객체를 생성하고 구성할때 사용된다.
Spring Framework
- 스프링 프레임워크는 IoC컨테이너, ApplicationContext를 포함해서 스프링이 제공하는 모든 기능을 통틀어 말할 때 주로 사용된다.
Spring Container
DI 주입하는 방법
[DI 주입하기 - xml], [DI 주입하기 - java] 에 따로 정리했다.
빈 생성범위
scope를 지정하지 않는다면 싱글톤으로 만들어진다.
singleton(default) | 스프링 컨테이너 당 하나의 인스턴스 빈만 생성 |
prototype | 컨테이너에 빈을 요청할 때마다 새로운 인스턴스 생성 |
request | HTTP Request 별 새로운 인스턴스 생성 |
session | HTTP Session 별 새로운 인스턴스 생성 |
Annotation 종류
빈 자동인식을 위한 annotation이 여러가지인 이유는,
1) 계층별로 빈의 특성이나 종류를 구분
2) AOP Pointcut 표현식을 사용하면 특정 annotatino이 달린 클래스만 설정 가능
3) 특정 계층의 빈에 부가기능을 부여
할 수 있기 때문이다.
@Repository | Data Access Layer의 DAO 또는 Repository 클래스에 사용 DataAccessException 자동변환과 같은 AOP 적용 대상을 선정하기 위해 사용 |
@Service | Service Layer의 클래스에 사용 |
@Controller | Presentation Layer의 MVC Controller에 사용 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정 |
@Component | 위의 Layer 구분을 적용하기 어려운 일반적인 경우에 설정 |
Spring Bean 의존관계설정(Annotation)
@Resource | 멤버변수, setter method에 사용 가능 타입에 맞춰서 연결 동일한 타입의 빈이 여러 개일 경우 name을 통해 구분(ex. @Resource(name="--")) |
@Autowired | Spring에서만 사용 가능 Required 속성을 통해 DI여부 조정 멤버변수, setter, constructor, 일반 method 사용 가능 타입에 맞춰서 연결 동일한 타입의 빈이 여러 개일 경우 Qualifier을 통해 구분(ex. @Qualifier("name")) |
@Inject | Spring 3.0부터 지원 Framework에 종속적이지 않음 Javax.inject-x.x.x.jar 필요 멤버변수, setter, constructor, 일반 method 사용 가능 이름으로 연결 |
'기록 > BACKEND' 카테고리의 다른 글
[Spring] File Upload (0) | 2022.04.22 |
---|---|
[Spring] 예외처리하기 - ControllerAdvice (0) | 2022.04.21 |
[Spring] JNDI 설정하기 (0) | 2022.04.19 |
[WEB] IoC (0) | 2022.04.19 |
[Spring] DI 주입하기 - java (0) | 2022.04.16 |
댓글