# 1.12.2 AnnotationConfigApplicationContext를 사용한 스프링 컨테이너 인스턴스화 by sh

### **1.12.2.** AnnotationConfigApplicationContext를 사용한 스프링 컨테이너 인스턴스화

**다음 섹션에서는 스프링 3.0에서 도입된 스프링의 `AnnotationConfigApplicationContext`에 대해 설명합니다. 이 다재 다능한 `ApplicationContext`구현은 입력으로 `@Configuration` 클래스 뿐만 아니라, 일반 `@Component` 클래스 및 JSR-330 메타데이터로 어노테이팅된 클래스도 허용할 수 있습니다.**&#x20;

{% hint style="info" %}
**`AnnotationConfigApplicationContext`**

* **BeanFactory의 종류 중 하나. @Configuration 어노테이션을 이용한 자바 코드를 설정 정보로 사용하려면 AnnotationConfigApplicationContext를 이용한다.** (즉, Configuration 어노테이션이 붙은 클래스를 설정 정보로 사용함)&#x20;
  * BeanFactory : 스프링에서 빈의 생성과 빈들의 관계 설정 같은 제어를 담당하는 IoC 오브젝트.&#x20;
  * ApplicationContext : IoC 방식을 따라 만들어진 일종의 BeanFactory (의 확장).
    {% endhint %}

**`@Configuration` 클래스가 입력으로 제공되면, `@Configuration` 클래스 자체가 빈 정의로 등록되고 클래스 내에 선언된 모든 `@Bean`메소드가 빈 정의로 등록됩니다.**

`@Component`클래스와 JSR-330 클래스가 제공되면, 그것들은 빈 정의로 등록되며 필요한 경우 `@Autowired` 또는 `@Inject`와 같은 DI 메타 데이터가 해당 클래스 내에서 사용된다고 가정합니다.

**간단한 구성**&#x20;

`ClassPathXmlApplicationContext`를 인스턴스화할 때 스프링 XML 파일을 입력으로 사용하는 것과 같은 방법으로, **`AnnotationConfigApplicationContext`를 인스턴스 화할 때 `@Configuration` 클래스를 입력으로 사용할 수 있습니다.** 이렇게 하면 다음 예제와 같이 스프링 컨테이너를 완전히 XML 없이 사용할 수 있습니다:

```java
public static void main(String[] args) {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(AppConfig.class);
    MyService myService = ctx.getBean(MyService.class);
    myService.doStuff();
}
```

앞서 언급한 것처럼, **`AnnotationConfigApplicationContext`는 `@Configuration`클래스로만 작업하는 것으로 제한되지 않습니다. 다음 예제와 같이 `@Component`또는 JSR-330 annotated 클래스가 생성자에 대한 입력으로 제공될 수 있습니다**:&#x20;

```java
public static void main(String[] args) {
    ApplicationContext ctx = new AnnotationConfigApplicationContext(MyServiceImpl.class, Dependency1.class, Dependency2.class);
    MyService myService = ctx.getBean(MyService.class);
    myService.doStuff();
}
```

앞의 예에서는 `MyServiceImpl`, `Dependency1`및 `Dependency2`가 `@Autowired`와 같은 스프링 종속성 삽입 어노테이션을 사용한다고 가정합니다

**Register(Class\<?>…)를 사용하여 프로그래밍 방식으로 컨테이너 빌드하기**

**인수가 없는 생성자를 사용하여 `AnnotationConfigApplicationContext`를 인스턴스화한 다음 `register()` 메소드를 사용하여 그것을 구성할 수 있습니다. 이 방법은 프로그래밍 방식으로 `AnnotationConfigApplicationContext`를 작성할 때 특히 유용합니다.** 다음 예제에서는 이를 수행하는 방법을 보여줍니다:

```java
public static void main(String[] args) {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.register(AppConfig.class, OtherConfig.class);
    ctx.register(AdditionalConfig.class);
    ctx.refresh();
    MyService myService = ctx.getBean(MyService.class);
    myService.doStuff();
}
```

**Scan(String…)으로 컴포넌트 검색 활성화**

**컴포넌트 검색을 사용하려면, 다음과 같이 `@Configuration` 클래스에 어노테이션을 추가할 수 있습니다**:

```java
@Configuration
@ComponentScan(basePackages = "com.acme") 
public class AppConfig  {
    ...
}
```

| 이 어노테이션이 컴포넌트 스캔을 가능하게 해줍니다. |
| ---------------------------- |

{% hint style="info" %}
**별도로 @Bean 설정을 하지 않고 @ComponentScan을 통해서 Type-safe한 방법으로 설정할 수 있다.**
{% endhint %}

| 숙련된 스프링 사용자는 스프링의 `context:`와 동일한 XML 선언에 익숙할 수 있습니다. 네임 스페이스는 다음 예제와 같습니다. |   |
| --------------------------------------------------------------------------- | - |

![](/files/-LZQblIxNhFikjFpFhtd)

**앞의 예에서, `com.acme`패키지는 `@Component`-annotated 클래스를 찾기 위해 스캔 되며, 이 클래스는 컨테이너 내에 스프링 빈 정의로 등록됩니다. `AnnotationConfigApplicationContext`는 다음 예제와 같이 동일한 구성 요소 검색 기능을 허용하는 `scan(String…​)` 메소드를 제공합니다**:

```java
public static void main(String[] args) {
    AnnotationConfigApplicationContext ctx = new AnnotationConfigApplicationContext();
    ctx.scan("com.acme");
    ctx.refresh();
    MyService myService = ctx.getBean(MyService.class);
}
```

| `@Configuration` 클래스는 `@Component`로 메타 어노테이션이 붙은 클래스 이므로, 이 클래스들은 컴포넌트 스캔의 후보가된다는 점을 기억하십시오. 앞의 예에서, **`AppConfig`가 `com.acme` 패키지 (또는 아래에 있는 패키지) 내에서 선언되었다고 가정하면, `scan()`을 호출하는 동안 `AppConfig`가 선택됩니다. 그리고 클래스의 모든 `@Bean`메소드들을 `refresh()`할 때 컨테이너 내 빈 정의로 처리되고 등록될 것입니다.** |
| ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |

**AnnotationConfigWebApplicationContext를 사용한 웹 응용 프로그램 지원**

**`AnnotationConfigApplicationContext`의 `WebApplicationContext`변형은 `AnnotationConfigWebApplicationContext`로 사용할 수 있습니다. 스프링 `ContextLoaderListener`서블릿 리스너, 스프링 MVC `DispatcherServlet`등을 설정할 때 이 구현체를 사용할 수 있습니다.** 다음은 전형적인 스프링 MVC 웹 어플리케이션을 설정하는 `web.xml`의 예제입니다. (`contextClass`context-param과 init-param의 사용을 보여줍니다):

```markup
<web-app>
    <!-- Configure ContextLoaderListener to use AnnotationConfigWebApplicationContext
        instead of the default XmlWebApplicationContext -->
    <context-param>
        <param-name>contextClass</param-name>
        <param-value>
            org.springframework.web.context.support.AnnotationConfigWebApplicationContext
        </param-value>
    </context-param>

    <!-- Configuration locations must consist of one or more comma- or space-delimited
        fully-qualified @Configuration classes. Fully-qualified packages may also be
        specified for component-scanning -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>com.acme.AppConfig</param-value>
    </context-param>

    <!-- Bootstrap the root application context as usual using ContextLoaderListener -->
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>

    <!-- Declare a Spring MVC DispatcherServlet as usual -->
    <servlet>
        <servlet-name>dispatcher</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- Configure DispatcherServlet to use AnnotationConfigWebApplicationContext
            instead of the default XmlWebApplicationContext -->
        <init-param>
            <param-name>contextClass</param-name>
            <param-value>
                org.springframework.web.context.support.AnnotationConfigWebApplicationContext
            </param-value>
        </init-param>
        <!-- Again, config locations must consist of one or more comma- or space-delimited
            and fully-qualified @Configuration classes -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>com.acme.web.MvcConfig</param-value>
        </init-param>
    </servlet>

    <!-- map all requests for /app/* to the dispatcher servlet -->
    <servlet-mapping>
        <servlet-name>dispatcher</servlet-name>
        <url-pattern>/app/*</url-pattern>
    </servlet-mapping>
</web-app>
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://wannaqueen.gitbook.io/spring5/spring-5.0/1/1.12/1.12.2-by-sh.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
