[Spring] IoC Container

배창민·2025년 10월 2일
post-thumbnail

IoC 컨테이너


1) IoC & IoC 컨테이너 핵심

  • IoC (제어의 역전)
    객체 생성/초기화/의존성 연결 등의 제어를 애플리케이션이 아닌 프레임워크가 맡는 패턴. 스프링은 이 IoC를 통해 빈(객체)을 자동 관리한다.
  • IoC 컨테이너
    IoC를 구현한 프레임워크. 스프링에선 ApplicationContext(=고급 컨테이너)가 대표적이다.
  • Bean
    컨테이너가 생성·초기화·주입·소멸까지 생명주기를 관리하는 객체.

2) 스프링 IoC 컨테이너 구성요소

  • BeanFactory: 가장 기본 컨테이너(생성/연결/제거 등 라이프사이클 관리). 설정 메타데이터에 따라 동작.

  • ApplicationContext: BeanFactory + α.
    국제화(MessageSource), 이벤트(ApplicationEventPublisher), 리소스 로딩(ResourceLoader) 등 부가기능 제공. 구현체 예)

    • GenericXmlApplicationContext (XML 설정)
    • AnnotationConfigApplicationContext (자바 설정)

3) 설정 메타데이터 종류와 사용법

A. XML 기반 설정

  • 컨테이너 만들기
ApplicationContext ctx =
    new GenericXmlApplicationContext("section01/xmlconfig/spring-context.xml");
  • 빈 등록 (생성자 인자 전달 예시)
<beans ...>
  <bean id="member" class="com.ohgiraffers.common.MemberDTO">
    <constructor-arg index="0" value="1"/>
    <constructor-arg name="id" value="user01"/>
    <constructor-arg index="2"><value>pass01</value></constructor-arg>
    <constructor-arg name="name"><value>홍길동</value></constructor-arg>
  </bean>
</beans>
  • 빈 조회
MemberDTO m1 = (MemberDTO) ctx.getBean("member");
MemberDTO m2 = ctx.getBean(MemberDTO.class);
MemberDTO m3 = ctx.getBean("member", MemberDTO.class);

B. 자바 기반 설정 (@Configuration / @Bean)

  • 컨테이너 만들기
ApplicationContext ctx =
    new AnnotationConfigApplicationContext(ContextConfiguration.class);
  • 설정 클래스
@Configuration
public class ContextConfiguration {
  @Bean(name = "member")
  public MemberDTO member() {
    return new MemberDTO(1, "user01", "pass01", "홍길동");
  }
}
  • 빈 조회
MemberDTO m = ctx.getBean("member", MemberDTO.class);

C. 애노테이션 기반 컴포넌트 스캔 (@ComponentScan)

  • 도메인 클래스에 역할별 스테레오타입 사용
    @Component(일반), @Controller, @Service, @Repository, @Configuration 등.
  • 자동 스캔 설정 (자바)
@ComponentScan(basePackages = "com.ohgiraffers")
public class ContextConfiguration {}
  • 포함/제외 필터
@ComponentScan(
  basePackages = "com.ohgiraffers",
  excludeFilters = {
    @ComponentScan.Filter(type = FilterType.ASSIGNABLE_TYPE, classes = { MemberDAO.class })
  }
)
// includeFilters도 유사하게 지정 가능, useDefaultFilters=false와 함께 사용
  • XML에서도 가능
<beans ... xmlns:context="http://www.springframework.org/schema/context" ...>
  <context:component-scan base-package="com.ohgiraffers"/>
  <!-- <context:exclude-filter .../> / <context:include-filter .../> -->
</beans>
  • 등록된 빈 확인
String[] names = ctx.getBeanDefinitionNames();
for (String n : names) System.out.println("beanName: " + n);

4) 실전 팁

  • 직접 제어 가능한 내 코드@Component + @ComponentScan으로 자동 등록
  • 외부 라이브러리/팩토리 메서드 필요/다형성 구성@Bean으로 수동 등록
  • 레거시/설정 분리 선호 → XML, 단 최근엔 자바 설정 선호.

5) 자주 쓰는 스니펫 모음

  • 빈 id 생략 규칙: @Bean 메서드명 / @Component 클래스명 첫 글자 소문자가 기본 id.

  • 컨테이너별 생성자 전달:

    • XML: new GenericXmlApplicationContext("...xml")
    • 자바: new AnnotationConfigApplicationContext(Config.class)
  • 빈 조회 3형식: "id", Type, "id"+Type 조합 사용.


한 줄 핵심 요약

  • “XML ↔ 자바 ↔ 컴포넌트 스캔” 세 가지 설정 축을 이해하고,
    내 코드=자동(@Component), 외부/특수=수동(@Bean)
profile
개발자 희망자

0개의 댓글