● di란?
dependency injection 으로 의존관계 주입을 의미한다.
쉽게 말해 오브젝트 사이의 의존관계를 만드는 것으로 어떤 오브젝트이 프로퍼티 즉 인스턴스변수에 그 오브젝트가 이용할 오브젝트를 설정하는 것이다.
● ioc컨테이너 (di컨테이너)
의존관계 주입을 이용하여 애플리케이션을 구성하는 컴포넌트들을 관리한다. 스프링 빈의 생성, 관계, 조립, 생명주기를 관리하는 스프링 프레임워크의 핵심이다.
즉 주입할 오브젝트를 ioc 컨테이너에 넣어놓고 주입해줄 때 컨테이너에서 주입해주게 된다.
ioc컨테이너를 사용할 경우 사용할 다른 오브젝트를 new 연산자로 객체를 생성 해줄 필요 없이 의존관계 주입이 가능하게된다.
이로인해 개발자는 디자인 패턴을 구현하지 않고, di컨테이너가 내주는 인스턴스를 인터페이스로 받아서 인터페이스 기반의 컴포넌트화를 구현할 수 있다.
● spring Bean
스프링 컨테이너가 관리하는 객체이다.
위에 정리한 것 처럼 di컨테이너에 주입해 줄 오브젝트가 들어있는데 이 것들을 스프링 빈이라 한다.
빈을 생성하고, 빈의 의존관계를 BeanFactory 클래스 에서 관리한다.
ApplicationContext는 일반적인 스프링 컨테이너로 BeanFactory 인터페이스를 상속받아 확장된 di기능을 제공한다.
webApplicationContext(WAC)에는 ContextLoaderListener에 의해 생성되는 wac, DipatchServlet에 의해 생성되는 wac 2가지가 있다.
● 의존관계 주입
의존관계를 주입하는 방법은
xml파일을 사용하여 <Bean>요소를 정의하는 xml기반 설정
@Component애너테이션이 부여된 클래스를 Di컨테이너가 Bean으로 자동등록하는 Annotaion기반 설정
자바 클래스에 @Configuration을, 메서드에 @Bean 애너테이션을 이용해 Bean을 등록하는 java기반 설정 3가지가 있다.
1. xml기반 설정
기본 디렉토리 설정은 앞서 maven에서 정리하였으므로 생략한다. (pom.xml 기본 설정 + spring framework dependency 설정)
xml을 이용한 di는 생성자 기반 의존성 주입, 설정자 기반 의존성 주입 2가지 방법이 있다.
의존 설정은 applicationContext에 bean태그를 사용해 해준다.
bean태그 속성은 아래와 같다.

흐름을 간단하게 보면 applicationContext에 bean테그로 bean을 di컨테이너에 해당 클래스의 구현체를 저장해준다.
이때 id 속성을 통해 id를 설정해준다.
그리고 의존성을 주입할 메서드가 있는 클래스로 이동해서 id를 통해 해당 메서드에 의존성을 주입해준다.
- 1.1 생성자기반 의존성 주입 (Constructor injection)
생성자의 인수를 사용해 의존성을 주입한다.
설정파일에 xml(applicationContext)에 <construct-arg> 태그를 사용하여 주입할 컴포넌트를 설정한다.

- 1.2 설정자 기반 의존성 주입 (Setter injection)
메서드의 인수를 통해 의존성을 주입한다.
설정파일 xml(applicationContext)에 <property> 요소의 name 속성에 주입할 컴포넌트의 이름을 설정

보통 주입되는 객체가 변경될 가능성이 있을경우 Setter injection을 사용한다. (변경되는 경우 거의 없음)
2. annotation 기반 설정
annotation은 클래스, 메소드, 필드의 선언부에 표현하여 특정 기능이 적용되었음을 알려준다.
주요 애노테이션은 컨테이너가 다른 빈과의 의존성을 자동으로 연결하도록 하는 @Autowired
컨테이너가 의존성주입을 위한 빈을 설정하는 @Component 두가지가 있다.
annotation을 이용한 의존성 주입 방법에는
xml 파일에 이미 등록된 빈들의 애노테이션 기능을 적용하기위해 사용하는 annotation-config 설정
특정 패키지안에 클래스를 검색해서 자동으로 빈을 자동으로 찾아 DI컨테이너에 등록하는 component-scan 설정
두가지가 있다.
- 2.1 annotation-config 설정
annotation-config방식일때 applicationcontext에는 빈이 등록되어 있어야한다. (앞 xml형식 bean설정과 동일하다)
따라서 이미 등록된 빈에 따라 Autowired 설정만 해주면 component 없이 의존 관계 주입이 된다.

- 2.2 component-scan 설정
applicationcontext에는 설정된 클래스를 검색할 패키지를 설정해 준다.
또 한 각 클래스에 빈이 설정되어 있지 않기 때문에 어떤 클래스를 주입할지 알려주는 component가 필요하다.
그 후론 Autowired를 통해 의존관계를 주입 해준다.

3. java 기반 설정
Java 이용한 di 설정은 xml에 문법 대진 자바 코드로 빈을 설정한다.
Xml기반의 생성자 기반 의존성 주입을 application.xml 파일에서 해주는 것과 달리 java를 이용한 의존성 주입은 java파일에서 설정 해주기 때문에 해당 파일이 설정 파일임을 @Configuration 으로 클래스를 만들어 알려준다. 그리고 클래스 내 메서드를 정의하여 새로운 빈 객체를 생성할 때 @Bean을 사용한다.
Xml의 경우 bean에 등록된 클래스 명을 주면 그 클래스를 찾아가 의존관계를 주입한다면 java코드는 직접 객체를 new를 통해 만들어 return 해 준다. 이 때 생성한 객체는 생성자를 통해 의존성이 주입된 상태로 리턴된다.


(빈객체랑 스코프 내용 추가)
내가 짠 코드의 경우 애노테이션만 적어주면 의존관계 주입이 되기 떄문에 편하지만 외부에서 불러오는 오픈소스의 경우 코드에 애노테이션을 붙일 수 없다. 따라서 xml로 접근 해야한다. but 스프링부트로 가면서 xml은 보이지 않고 자동으로 등록해주는 방향으로 가고있다.
따라서 외부 코드의 빈 설정을 변경할 때 자바 코드를 사용, xml은 숨겨져 있지만 클래스 상속받아서 오버라이딩헤서 설정을 바꿔준다.
'Spring' 카테고리의 다른 글
| [스프링] jdbc 추가 (0) | 2023.04.10 |
|---|---|
| [스프링] jdbc (0) | 2023.04.03 |
| [스프링] gradle (0) | 2023.03.21 |
| [스프링] Maven (0) | 2023.03.16 |
| [스프링] 스프링과 웹어플리케이션 (0) | 2023.03.14 |