기록/BACKEND

[Spring] DI

5월._. 2022. 4. 20.
728x90

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

댓글