컨테이너란?
컨테이너는 개발자를 대신해서 객체를 생성하고 관리하는 역할을 한다.
서블릿 컨테이너인 톰캣이 new를 호출하여 서블릿 객체를 만들어주는 것처럼, Spring 컨테이너도 개발자 대신 객체를 생성한다.
아래 코드는 Spring 컨테이너를 구동하는 방식이다.
AbstractApplicationContext factory = new GenericXmlApplicationContext("applicationContext.xml");
이 코드에서 컨테이너는 applicationContext.xml 파일을 읽고, 그 안에 정의된 객체(bean)를 생성한다.
다음과 같은 방식으로 객체를 정의할 수 있다. 아래는 applicationContext.xml의 일부 코드이다.
<bean class="test.IPhone" id="apple">
<property name="watch" ref="aw" />
<property name="num" value="1234" />
</bean>
하지만 XML 설정 방식은 점점 복잡해지고 관리가 어려워지기 때문에, Spring에서는 어노테이션 기반 DI 방식을 지원하게 되었다.
의존성 주입(DI)
DI는 한 객체가 다른 객체의 기능을 필요로 할 때 이를 주입해주는 방식이다.
예를 들어, Controller가 DAO 객체를 필요로 하거나 DAO가 데이터베이스 연결을 필요로 할 때 의존성을 주입받는다.
XML 기반 DI는 applicationContext.xml 파일에서 모든 의존성을 설정하는 방식이다.
<bean class="test.IPhone" id="apple">
<property name="watch" ref="aw" />
</bean>
@ 어노테이션 기반 DI는 코드에서 직접 어노테이션을 사용하여 의존성을 주입한다.
@Autowired 어노테이션을 사용하면 Spring이 자동으로 적절한 객체를 주입해준다.
다음은 @Autowired의 사용 예시이다.
@Component("apple")
public class IPhone implements Phone {
@Autowired
private Watch watch;
public void powerOn() {
watch.powerOn();
}
}
여기서 @Autowired는 타입을 기준으로 자동으로 객체를 주입한다.
XML 설정 파일과 어노테이션의 차이
- 객체 생성 방식:
- XML: <bean> 태그를 사용해 객체를 생성하고 의존성을 설정한다.
- 어노테이션: @Component와 @Autowired를 사용해 객체와 의존성을 주입한다.
- 의존성 주입 방법:
- Setter 주입: Setter 메서드를 통해 의존성을 주입한다. 이는 new 호출 시 에러를 방지하고 유연성을 높인다.
- 생성자 주입: 객체 생성 시점에 필요한 의존성을 주입한다.
- 어노테이션 사용의 장점:
- XML 설정 방식은 설정 파일이 길어지고 복잡해질 수 있지만, 어노테이션은 코드와 설정을 통합하여 관리가 용이하다.
- @Component는 객체 생성, @Autowired는 의존성 주입을 담당하여 더 간단한 코드를 작성할 수 있게 한다.
@Autowired와 @Qualifier
@Autowired는 타입을 기준으로 의존성을 주입하는데, 만약 여러 개의 동일한 타입이 존재하면 모호성 에러가 발생할 수 있다.
위의 에러는 애플워치와 갤럭시워치의 타입이 동일한데, 컴퓨터는 내가 코드에 어노테이션을 정확하게 기입하지 않으면 둘이 정확하게 뭐가 다른지 모른다.
이를 방지하기 위해 @Qualifier를 사용하여 특정 객체를 지정할 수 있다.
@Autowired
@Qualifier("appleWatch")
private Watch watch;
이처럼 @Qualifier를 사용하면 특정 객체명을 지정해 의존성을 주입할 수 있지만, 실무에서는 자주 사용되지 않는다.
@Qualifier는 성능이 향상되는 것은 아니기 때문이다.
성능에 민감한 프로젝트에서는 다른 방식의 의존성 관리가 더 선호되기도 한다.
요약
Spring에서는 XML 설정 파일과 어노테이션 두 가지 방법으로 객체 관리와 의존성 주입을 할 수 있다.
XML 설정 파일은 구체적인 설정을 제공하지만, 설정이 복잡해질 수 있고, 어노테이션은 간결한 코드를 작성하는 데 도움을 준다.
각 방식의 장단점을 이해하고, 상황에 맞게 활용하는 것이 중요하다.
'Spring' 카테고리의 다른 글
[Spring] DispatcherServlet, ViewResolver , DI 방식 정리 (0) | 2024.10.07 |
---|---|
[Spring] Spring DI와 비즈니스 로직 (2) | 2024.10.06 |
[Spring] 의존성 주입 (0) | 2024.10.02 |
[Spring] 스프링 프레임워크 (1) | 2024.10.01 |
스프링 프레임워크 (0) | 2024.08.19 |