[Spring] 스프링 컨테이너와 스프링 빈

2025. 2. 15. 06:58코딩 도구/백엔드 개발 (Backend Development)

반응형

스프링 컨테이너와 스프링 빈

김영한님의 "스프링 핵심 원리 - 기본편"을 수강하고 정리헸습니다. 

1. 스프링 컨테이너(ApplicationContext)란?

스프링 컨테이너(ApplicationContext)는 스프링 프레임워크의 핵심으로, 애플리케이션에서 필요한 객체를 생성하고 관리하는 역할을 한다. 기존의 자바 애플리케이션에서는 개발자가 직접 객체를 생성하고 관리해야 했지만, 스프링 컨테이너를 사용하면 객체의 생성, 의존성 주입, 생명주기 관리 등을 자동으로 처리할 수 있다.

스프링 컨테이너의 주요 기능

  • 객체 생성 및 관리: Bean을 자동으로 생성하고 필요할 때 제공한다.
  • 의존관계 주입(DI, Dependency Injection): 필요한 의존성을 자동으로 주입해준다.
  • 생명주기 관리: 객체의 생성부터 소멸까지 자동으로 관리한다.

2. 스프링 빈과 빈 등록 방식

스프링 빈(Bean)이란?

스프링에서 관리하는 객체를 빈(Bean)이라고 하며, 스프링 컨테이너가 이 빈을 생성하고 의존성을 주입한다.

빈 등록 방식

스프링에서 빈을 등록하는 방식은 크게 XML 기반 설정과 자바 코드 기반 설정으로 나눌 수 있다.

 

1. XML 기반 설정

<bean id="memberService" class="com.example.MemberService" />

 

과거에는 XML 파일을 통해 빈을 등록했으나, 현재는 거의 사용되지 않는다.

 

2. 자바 코드 기반 설정

@Configuration
public class AppConfig {
    @Bean
    public MemberService memberService() {
        return new MemberService();
    }
}

@Configuration: 해당 클래스를 설정 파일로 인식한다.

@Bean: 해당 메서드의 반환 객체를 스프링 빈으로 등록한다.

 

3. 컴포넌트 스캔(@ComponentScan)과 어노테이션 기반 설정

@Component
public class MemberService {}

@Component: 자동으로 스프링 빈으로 등록된다.

@Autowired: 필요한 의존성을 자동으로 주입한다.

3. BeanFactory vs ApplicationContext

BeanFactory란?

  • 스프링의 최상위 컨테이너로, 빈을 생성하고 관리하는 역할을 한다.
  • Lazy Initialization(지연 초기화)를 지원하여 성능을 최적화할 수 있다.

ApplicationContext란?

  • BeanFactory를 확장한 인터페이스로, 보다 많은 기능을 제공한다.
  • 빈 관리뿐만 아니라 메시지 처리, 이벤트 관리, AOP 등 다양한 기능을 제공한다.
  • ApplicationContext의 주요 구현체:
    • AnnotationConfigApplicationContext: 자바 기반 설정 사용 시
    • ClassPathXmlApplicationContext: XML 기반 설정 사용 시

4. 실무에서 중요한 내용

  1. XML 기반 설정 vs 자바 코드 기반 설정 차이 이해
    • XML 기반 설정은 유지보수가 어렵고 가독성이 떨어지므로, 자바 코드 기반 설정이 일반적으로 선호됨.
    • XML 기반 설정이 필요한 경우(예: 레거시 프로젝트)도 있지만, 최신 프로젝트에서는 @Configuration@Bean을 활용하는 것이 일반적이다.
  2. 애노테이션(@Bean, @Configuration) 활용
    • @Bean@Configuration을 활용하면 명시적으로 빈을 등록할 수 있어 테스트가 용이하다.
    • @ComponentScan을 활용하면 자동으로 빈을 등록할 수 있지만, 필요에 따라 수동 등록과 자동 등록을 조합하여 사용하는 것이 좋다.
  3. 스프링 빈을 효과적으로 관리하는 방법
    • 빈의 라이프사이클을 고려하여 설계해야 한다.
    • 싱글톤(Singleton)과 프로토타입(Prototype) 스코프를 적절히 활용하여 필요에 따라 객체를 재사용하거나 새로운 객체를 생성하도록 설정해야 한다.
    • DI(의존성 주입) 원칙을 지키면서 유지보수성을 고려한 설계가 필요하다.

5. 결론

스프링 컨테이너(ApplicationContext)를 활용하면 객체 생성, 관리, 의존성 주입을 효율적으로 수행할 수 있다. 실무에서는 XML 기반 설정보다는 자바 코드 기반 설정이 더 선호되며, @ComponentScan@Autowired를 활용한 자동 빈 등록 방식이 많이 사용된다. 하지만 테스트와 유지보수를 고려하여 @Bean을 활용한 명시적 빈 등록도 적절히 조합하여 사용해야 한다.

반응형