Spring | 어노테이션으로 DI 구현 | 컨포넌트(@Component) 생성


어노테이션에 의한 Bean 이용은 여러가지 응용이 가능하다. 기본을 알았다면, 이어서 Bean을 사용하는 “컨포넌트"를 사용해 보자.

컨포넌트(@Component) 생성

Spring Framework에는 고급 기능을 가진 클래스를 컨포넌트로 정의하고 Bean과 같은 방식으로 사용할 수 있다. 간단한 예제로 “BeanHolder"라는 컨포넌트 클래스를 만들어 보자.

com.devkuma.spring 패키지에 BeanHolder 클래스를 만들고, 아래와 같이 소스 코드를 작성하자.

package com.devkuma.spring;
 
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
 
@Component
public class BeanHolder {
     
    @Autowired
    private SampleBeanInterface bean;
     
    public void showMessage() {
        System.out.println("*print by BeanHolder*");
        System.out.println(bean);
        System.out.println("*end*");
    }
 
}

이 BeanHolder은 아주 간단한 컨포넌트이다. 이 컨포넌트 안에는 이전의 Bean 설정 클래스으로 작성한 Bean을 필드에 저장하고 그것을 이용한 메소드가 작성되어 있다. 포인트를 정리해 보겠다.

1. “@Component” 아노테이션
클래스 선언 앞에는 @Component 어노테이션이 붙여져 있다. 이것은 해당 클래스가 컨포넌트임을 나타 내기 위한 것이다. 컨포넌트 클래스에는 반드시 이것을 붙여 둔다.

2. “@Autowired” 아노테이션
이 클래스에는 SampleBeanInterface를 필드에 존재하고 있다. 이 필드에는 @ Autowired 어노테이션이 붙여져 있다. 이것은 Bean 설정 클래스 (또는 파일)에 의해 자동 생성된 Bean 인스턴스를 자동으로 바인딩하기 위한 것이다.

이것을 붙이는 것으로, 생성된 Bean들 중에서 SampleBeanInterface 인스턴스 찾고 이 bean 필드에 자동으로 할당하는 것이다. 이 @Autowaired는 컨포넌트뿐만 아니라 다양한 Bean 이용하는 곳에서 사용된다.

SampleBeanConfig 클래스의 수정

이제 컨포넌트는 완성되었지만, 실은 더 해야 할 것이 하나가 더 있다. Bean 설정 클래스 (SampleBeanConfig)의 선언 앞에 다음 어노테이션을 추가해야 한다.

@ComponentScan

이미 @Configuration 어노테이션이 붙어 있기 때문에, 그 위나 아래에 추가하면 된다.

이 @ComponentScan는 컨포넌트를 검색하여 인스턴스를 생성하여 ApplicationContext에 등록하는 것이다. 컨포넌트(@Component를 붙인 클래스)를 이용할 경우에는 설정 클래스에 반드시 이 어노테이션을 꼭 추가해야 한다. 이렇게 하면 컨포넌트가 자동으로 인스턴스화되고 사용할 수 있게 된다.

컨포넌트(@Component) 사용

이제 컨포넌트를 실제로 이용해 보자. App.java을 열고 아래의 소스 코드 처럼 바꿔준다. 그리고 실행해 보자.

package com.devkuma.spring;
 
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
 
public class App {
 
    public static void main(String[] args) {
        ApplicationContext app = new
            AnnotationConfigApplicationContext(SampleBeanConfig.class);
        BeanHolder holder = app.getBean(BeanHolder.class);
        holder.showMessage();
    }
}

“* print by BeanHolder *“라고 표시되고 그 아래에 SampleBean의 출력이 된다. BeanHolder가 검색되어 그 중에 SampleBean를 사용하여 처리를 수행하고 있다는 것을 알 수 있다.

여기에서는 AnnotationConfigApplicationContext 인스턴스를 생성 한 후, getBean에서 “BeanHolder.class"를 인수로 지정해서 BeanHolder 인스턴스를 얻었다. BeanHolder는 Bean 설정 클래스 (SampleBeanConfig)에 기술되어 있지 않았다. 하지만 제대로 getBean에서 꺼낼 수 있다.

이것은 Bean 설정 파일 @ComponentScan로 부터 @Component로 지정된 클래스가 검색되어 그 인스턴스가 ApplicationContext에 등록되어 있기 때문이다. 또한 그 내부에서는 @Autowired로 인해 SampleBean이 자동으로 필드에 설정되어 있었으므로, 그 값이 showMessage에서 출력되어 있었다는 것이다.

이렇게 어노테이션을 사용하면 필요한 Bean과 컨포넌트들이 자동으로 생성이 되어 사용할 수 있게 된다. 이것으로 Spring Framework의 Bean 이용의 기본적인 구조를 많이 알게 되었다.

DI에 의하면 Bean의 사용은 Spring Framework의 핵심 기술이다. Spring Framework에는 다양한 라이브러리가 포함되어 있지만, 그 것들은 모두 이 Bean 기술을 사용하여 필요한 기능을 Bean을 만들어 사용하고 있다. Bean 이용을 모르면, Spring Framework의 기본적인 사용법을 이해할 수 없다. 이것은 “Spring Framework의 기본 중의 기본"으로 제대로 이해해 두도록 한다.