1. 의존 관계에 대한 용어 정리
- 빈
IoC 컨테이너가 관리하는 자바 객체
- 와이어링
애플리케이션 객체 간의 연관관계를 형성해주는 것을 의미
- 의존 관계 주입
빈 식별, 생성 및 와이어링 의존 관계 프로세스를 의존 관계 주입이라고 한다.
- IoC(Inversion of Control)
의존 관계를 만드는 책임을 사용자 본인이 가지는 것이 아니라 프레임워크로 옮기는 것을 뜻한다.
2. 스프링 IoC 컨테이너가 빈을 식별하는 방법
스프링 IoC 컨테이너는 클래스에서 어노테이션을 보고 클래스의 인스턴스를 생성한다.
어노테이션의 종류는 아래와 같다.
어노테이션 | 설명 |
@Component | 스프링 빈을 정의하는 가장 일반적인 방법 스프링에서 관리되는 객체임을 표시하기 위해 사용 |
@Controller | Spring MVC에서 URL 매핑할 때 사용 MVC 중 Controller의 역할을 하기위해 사용되는 어노테이션 |
@Service | 비즈니스 서비스 구성요소로 사용 (비즈니스 로직) |
@Repository | 데이터베이스에서 데이터에 접근하는 객체의 역할을 수행 |
@Component를 사용하면 전체를 포괄하여 클래스를 생성할 수 있지만, 구체적이지 못하다.
그렇기 때문에 @Component를 사용하기보다는!
용도에 따라 @Controller, @Service, @Repository를 사용하는 것이 관점(Aspect)에 연관성을 부여할 수 있다.
3. 애플리케이션 컨텍스트 구성 및 컴포넌트 스캔
스프링 프레임워크 초기에는 컨텍스트의 모든 구성이 XML파일로만 가능했지만
현재는 @Configuration 어노테이션을 통해 자바 컨텍스트를 구성한다.
@Configuration어노테이션을 사용한 자바 클래스에
@ComponentScan을 사용, 컴포넌트 스캔을 통해 스프링 IoC 컨테이너가 빈의 위치를 인식할 수 있다.
@Configuration으로 생성된 클래스에는 @Bean 어노테이션을 통해 빈을 생성할 수도 있다.
코드 예시는 아래와 같다.
import com.bigbell.spring.config;
@Configuration
@ComponentScan(basePackages="com.bigbell.spring")
class SpringContext {
@Bean
...
...
}
4. 의존성 주입 어노테이션
어노테이션 | 설명 |
@Autowired | 애플리케이션 콘텍스트에서 일치하는 의존관계를 검색 일치 항목이 1개 있다면 와이어링에 성공 일치 항목이 없거나 2개 이상이라면 와이어링에 실패 @Primary를 활용하면 2개 이상일 때도 와이어링 가능 |
@Qualifier | @Qualifier("클래스명") 형태로 사용 @Autowired와 기능은 똑같으나 일치 항목이 2개 이상일 때 사용 |
이 외에도 @Resource라는 어노테이션도 존재하는데
위의 2개의 어노테이션이 타입을 이용해서 주입할 객체를 검색한다면
@Resource는 빈 이름을 이용해서 주입할 객체를 검색하기때문에 좀 더 세밀한 편이다.
@Resource 어노테이션은 생성자에 적용할 수 없고 필드나 메서드에만 적용할 수 있기때문에 난잡해질 수 있다.
대부분의 프로젝트에서는 @Autowired를 사용한 코드가 많다고 한다.
코드 예시는 아래와 같다.
- 인터페이스와 인터페이스를 상속한 클래스
interface TV {
public void show();
}
@Component
class WideTV implements TV {
public void show(){
....
}
}
- @Autowired를 사용해 의존성 주입
@Service
public class TVService {
@Autowired
private TV myTV;
public void show() {
myTV.show();
}
}
위와 같이 @Autowired 밑에 TV인터페이스의 myTV를 선언하면
TV인터페이스를 상속한 단 1개의 일치 항목인 WideTV를 연결해준다.
myTV는 WideTV로 와이어링되었으므로 WideTV클래스의 메소드를 사용할 수도 있다.