https://yeo-computerclass.tistory.com/268
위 내용에서 컨테이너는 BeanDefinition을 기반으로 빈을 생성하고 구성한다 하였습니다.
즉 빈을 등록하기 위해서는 BeanDefinition이라는 메타데이터를 구성해주면 됩니다. BeanDefinition이란 객체 메타데이터를 직접 생성할 수도 있지만, Spring은 XML문서, Annotation, 프로퍼티 파일과 같은 외부 리소스로 빈(Bean) 메타 정보를 작성하고 이를 어플리케이션 컨테스트가 사용할 수 있는 정보로 변환해주는 방법을 사용합니다.
XML 설정 파일을 사용한 등록
XML 설정 파일을 사용하여 빈을 등록하는 방법은 예전부터 사용된 기존 방식입니다. 설정 파일에 빈의 정보를 정의하고 등록하는 코드는 다음과 같습니다.
<!-- XML 설정 파일 (예: applicationContext.xml) -->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="myBean" class="com.example.MyBean"/>
</beans>
- `id`: 빈 식별자
- `class`: 빈의 클래스 지정
- 필요에 따라 생성자 주입이나 프로퍼티 주입 설정해주면 됩니다.
- 설정 정보를 담고 있는 빈은 핵심 로직과의 구분을 위해 <bean>태그 대신 네임스페이드와 전용 태그를 사용합니다.
어노테이션을 사용한 등록: @Component
Spring 2.5부터 어노테이션을 사용하여 빈을 등록할 수 있습니다.
빈으로 등록할 클래스에 어노테이션(`@Component`)을 부여해줍니다.
아래는 MyBean 클래스를 @Component 어노테이션으로 빈 등록해준 것입니다. 이러면 이제 스프링 컨테이너는 MyBean을 인식하고 필요한 곳에서 해당 빈을 주입할 수 있습니다.
@Component
public class MyBean {
// ...
}
@Component 어노테이션은 클래스 수준에서 사용되고, 별도의 이름 속성을 지정하지 않으면 빈의 이름은 클래스 이름의 첫 글자를 소문자로 한 것으로 자동 설정됩니다. 위 MyBean 클래스는 myBean 이름의 빈으로 등록됩니다.
등록된 빈은 다른 빈에서 의존성 주입을 받거나 @Autowired 어노테이션을 사용하여 사용할 수 있습니다. 예를 들어 다음과 같이 MyBean을 사용하는 클래스에서 다음과 같이 의존성 주입을 받을 수 있습니다.
@Component
public class TestClass {
@Autowired
private MyBean myBean;
// ...
}
컴포넌트 검색(Component Scan)을 통해 스프링 컨테이너가 자동으로 @Component 어노테이션이 부여된 클래스들을 스캔하여 빈으로 등록할 수 있습니다.
컴포넌트 검색(Component Scan)을 수행하는 방법은 다음 3가지가 있습니다.
- 빈 스캐너를 내장한 어플리케이션 컨텍스트를 사용하는 방법
- XML을 이용한 빈 스캐너 등록: `<context:component-scan>`
- `@ComponentScan` 어노테이션 사용하여 검색 대상 패키지를 지정하는 방법
`@ComponentScan` 자세히보기 링크!!
<!-- XML 설정 파일 -->
<context:component-scan base-package="com.example"/>
// @ComponentScan 사용
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {
// ...
}
@Component 어노테이션은 일반적인 컴포넌트 역할을 하는 빈을 등록할 때 많이 사용됩니다.
@Component 어노테이션을 확장하여 특정 목적의 클래스를 빈으로 등록하기 위해도 사용합니다. 물론 이러한 특정 어노테이션들도 @Component와 동일한 방식으로 빈으로 등록됩니다. 단지 보다 명확한 의미와 추가적인 기능을 제공할 뿐입니다.
@Component를 확장한 어노테이션으로는 `@Controller`, `@Service`, `@Repository`이 있습니다.
위 스테레오타입 어노테이션들은 @Component 메타 어노테이션을 갖고 있기 때문에 빈 스캐너가 해당 어노테이션을 만날 경우 자동으로 빈을 등록해줍니다.
스테레오타입 어노테이션 | 적용 대상 |
@Repository | 데이터 액세스 계층의 DAO 또는 레포지토리 클래스에 사용된다. DataAccessException 자동변환과 같은 AOP의 적용 대상을 선정하기 위해서도 사용된다. |
@Service | 서비스 계층의 클래스에 사용된다. |
@Controller | 프레젠테이션 계층의 MVC 컨트롤러에 사용된다. 스프링 웹 서블릿에 의해 웹 요청을 처리하는 컨트롤러 빈으로 선정된다. |
💡스테레오타입 어노테이션
스테레오타입 어노테이션(Stereotype Annotation)은 스프링 프레임워크에서 여러 개의 어노테이션 그룹화하여 특정 목적을 가진 빈을 등록하기 위해 사용하는 어노테이션입니다. 스테레오타입 어노테이션은 일련의 어노테이션을 하나의 애노테이션으로 간단하게 사용할 수 있도록 도와줍니다. 스테레오타입 어노테이션을 사용하여 클래스에 해당 어노테이션을 부여하면, 해당 클래스는 스프링 컨테이너에 빈으로 등록되어 관리됩니다. 또한, 스테레오타입 어노테이션은 보다 명확한 의미와 역할을 부여하여 코드의 가독성과 유지보수성을 향상시킵니다.
위 스테레오타입 어노테이션들은 @Component 메타 어노테이션을 갖고 있기 때문에 빈 스캐너가 해당 어노테이션을 만날 경우 자동으로 빈을 등록해준다.
자바 설정 클래스를 사용한 빈 등록: @Configuration & @Bean
@Configuration
public class AppConfig {
// 빈 등록에 필요한 설정 및 메서드 정의
@Bean
public MyBean myBean() {
return new MyBean();
}
// ...
}
- @Bean 어노테이션이 부여된 메서드는 하나의 빈(Bean)으로 등록되고 이때 메서드 이름이 빈의 이름이 됩니다.
- return되는 오브젝트를 빈으로 활용합니다.
@Configuration & @Bean 사용하기 위한 설정
스프링 컨테이너에는 @Configuration & @Bean을 이용해 새로운 빈을 등록해주는 기능이 없습니다. 따라서 스프링 컨테이너의 기능을 확장(추가)시키기 위해 설정을 다음 설정을 추가해주어야 합니다.
<!-- XML 설정 -->
<context:annotation-config />
<context:annotation-config /> 태그를 추가해주면 다음 어노테이션들을 사용할 수 있습니다.
- @Configuration / @Bean
- @Autowired
- @PostConstruct
자바 코드에 의한 빈 등록: 일반 빈 클래스 & @Bean 메소드
@Configuration이 붙은 클래스가 아닌 POJO 클래스에도 @Bean을 사용할 수 있습니다.
[@Configuration클래스 & @Bean메소드]와 [POJO클래스 & @Bean메소드]의 차이점은 바로 싱글톤입니다.
여러 번 호출돼도 하나의 오브젝트만 리턴되는 것을 보장하는 싱글톤은 @Configuration 클래스 안에서 사용된 @Bean인 경우만 해당됩니다. 이에 대한 설명은 따로 포스팅하도록 하겠습니다.
'Spring Framework' 카테고리의 다른 글
Spring 빈 스코프 ( Bean Scope ) (0) | 2022.08.23 |
---|---|
Spring @Autowried: 의존 관계 자동 주입 (0) | 2022.08.21 |
Spring IoC 컨테이너 계층구조 및 구성(웹 어플리케이션) (0) | 2022.08.20 |
Spring 스프링 컨테이너(IoC 컨테이너)와 빈(Bean) (0) | 2022.08.20 |
Spring 스프링의 핵심 이해: IoC/DI, AOP, PSA (0) | 2022.08.17 |