Spring 기능 - IoC / Spring Context

이정수·2025년 10월 15일

Spring

목록 보기
3/18

제어의 역전 (IoC : Inversion of Control)
개발자가 아닌 Spring Framework( = Spring Context )가 자바객체의 전반적인 생명주기를 대신 관리하는 특성을 의미

IoC를 통해 객체들이 약한 결합이 되고, 재사용성테스트 용이성이 향상

  • SpringIoC :
    개발자new를 통해 자바객체를 직접 생성하는게 아닌 Spring Context에 의해 Spring Bean을 생성 및 관리를 수행하는 특성

    어플리케이션 RuntimeSpring Context에 의해 Spring Bean을 자동으로 생성하여 필요한 곳으로 Auto-Wiring하여 DI를 통해 주입하여 공급 후 폐기하는 Runtime System 구축

Spring Container ( = IoC Container , Spring Context )
。등록된 Spring Bean의 전체 Life CycleDependency의 관리를 수행
Spring Bean생성, 초기화, 구성, 파괴를 수행

Spring Context는 기본으로 제공하는 전역의 Spring Context와 직접 SpringContext 구현체를 생성하여 활용하는 방식이 존재
▶ 보통 전역의 Spring Context를 활용

Spring Bean의 제어권이 개발자가 아닌 Spring Context에 위임되어 전반적인 생명주기가 관리되므로 IoC의 특징을 가진다

Spring ContextSpring Bean 생성 시 카멜케이스로 생성됨
ex ) helloWorld

Spring Context로 등록된 A 클래스Spring Bean을 생성 시 new 없이 A a = A()를 선언
Spring ContextBean Registry에서 가져와서 Auto-Wiring을 거쳐 DI를 통해 Spring Bean을 주입

A a = A() // Spring Context의 Bean Registry에서 주입
A b = new A() // HEAP에서 POJO로 생성 


Spring BeanGC 대신 Spring Context에 의해 파괴가 수행
new를 통해 HEAP 영역에서 생성되는 POJO가 제때 GC되지않아 메모리에서 누적되어 발생하는 OOM 문제를 해결가능.

  • Bean Registry
    Spring Context의 내부에서 Spring Bean이 저장되어 생명주기를 관리하는 저장소

  • Spring ContextSpring Bean 등록 시 Map<String,Class>로 저장
    key : Spring Bean 클래스명카멜케이스명칭
    Value : Spring Bean 클래스명.class
    클래스 리터럴

Spring Context에 의한 Spring BeanLife Cycle
어플리케이션 RuntimeSpring Context에 의해 Spring Bean을 자동으로 생성하여 필요한 곳으로 Auto-Wiring하여 DI를 통해 주입하여 공급 후 폐기하는 Runtime System 구축


1. Spring Context 시작
어플리케이션 런타임전역으로 시작됨

2. Spring Bean으로 등록된 클래스 를 조회하여 정의 및 설정
Spring ContextBean Registry에 해당 클래스 정보Spring Bean 정보로서 등록

3. Spring Bean 생성
Bean Registry에서 등록된 클래스 정보를 기반으로 Spring Bean을 생성 혹은 관리
new를 통한 POJO로 생성되는게 아님을 인지

4. 의존성 주입 ( DI ) 수행
Spring ContextBean Registry 내 저장된 Spring Bean을 필요로 하는 의존객체의존성을 정의하여 Auto-Wiring하여 Spring Bean주입

5. 초기화
init method , @PostConstruct

6. 사용

7. 소멸
destroy method , @ PreDestroy
。사용이 끝난 경우 자동으로 Sprint Context에 의해 폐기
GC가 아닌 Spring Context에 의해 폐기

Spring Context 구현체 종류

  • Bean Factory Interface :
    。기본적인 형식의 Spring Context
    。현재는 거의 사용하지 않는다.

  • ApplicationContext Interface :
    Enterprise 기능이 존재하는 발전된 형식의 Spring Context 인터페이스
    BeanFactory하위 인터페이스

    。현재 가장 많이 사용되는 유형의 Spring Context
    Web Application , REST API , Spring AOP 등에서 주로 사용.

ApplicationContext 구현체 생성
。전역의 ApplicationContext가 아닌 구현체를 생성
Spring Bean전역 Spring Context와 별개로 독립적으로 저장되어 수명주기의 관리가 수행됨

  • GenericApplicationContext
    new GenericApplicationContext()
    。기본적인 Spring Bean 저장기능 + 수명주기를 관리하는 역할만 수행하는 Context 구현체
    객체.refresh()를 호출해야 등록된 Spring Bean이 초기화되어 호출가능

  • AnnotationConfigApplicationContext
    new AnnotationConfigApplicationContext(Configuration클래스.class)
    GenericApplicationContext 를 상속한 Context 구현체로서 추가 기능을 정의
    ▶ 내부에 @Bean이 정의된 Configuration Class를 생성자에 전달하여 Context 구현체 생성과 동시에 Spring Bean을 등록할 수 있다.
    객체.refresh()를 호출하지 않아도 자동으로 Spring Bean의 초기화가 수행됨

    。해당 Context 구현체를 포함하는 Class@ComponentScan("패키지경로") 선언 시 해당 패키지경로 하위 Spring Bean들을 Context 구현체로 전부 식별 및 등록.
@ComponentScan("com.ktcloud.springpractice")
public class AAAA {
    public static void main(String[] args) {
        try( var springContext = new AnnotationConfigApplicationContext(AAAA.class)){
            Arrays.stream(springContext.getBeanDefinitionNames()).forEach(System.out::println);
        }
    }
}

com.ktcloud.springpractice 하위 Spring Bean들이 전부 springContext 구현체로 등록

SpringContext 구현체에 등록된 Spring Bean의 이름 출력
camelCase임을 확인가능

SpringContext구현체 관련 메소드

  • SpringContext객체.registerBean(POJO.class)
    。해당 SpringContext 구현체POJOSpring Bean으로서 등록
    ▶ 일반 자바객체Spring Bean으로서 등록하는 역할을 수행

  • SpringContext객체.getBean("SpringBean이름" or SpringBeanClass명.class)
    。해당 Spring Context에 포함된 특정 Spring Bean을 호출
    • Class Type으로 Spring Bean을 가져올 경우

      SpringContext객체.getBean(클래스타입.class)

      。동일한 Interface를 구현하는 Spring Bean을 반환하는 @Bean method가 복수 존재 시 @Primary로 설정된 @Bean MethodSpring Bean을 우선시하여 가져온다.

    • Spring Bean에게 할당된 이름으로 Spring Bean을 가져오는 경우

      SpringContext객체.getBean("스프링빈이름", 클래스타입)

      Spring Bean명칭으로 참조 시 클래스타입을 추가정의
      클래스타입을 정의하지 않으면 Object TypeSpring Bean으로 반환

      Spring Bean 이름Spring Context에 의해 카멜케이스로 작성됨을 유의
      @Bean methodSpring Bean인 경우 @Bean(name="이름")을 통해 개발자가 임의로 부여가능


  • SpringContext객체.getBeanDefinitionNames())
    。특정 SpringContext객체에서 정의된 모든 Spring Bean의 이름이 정의된 문자열 벡터(string[])를 반환.

    Arrays.stream(SpringContext객체.getBeanDefinitionNames()).forEach(System.out::println);
    。 특정 SpringContext객체의 Spring Bean의 이름을 나열.
profile
공부기록 블로그

0개의 댓글