CS

[CS] 스프링 컨테이너, 스프링 빈

sson-coding 2026. 1. 26. 23:41

스프링에서는 누가 객체를 만들고, 누가 관리할까?
그 역할을 담당하는 것이 스프링 컨테이너고, 그 안에서 관리되는 객체가 스프링 빈이다.

이번 글에서는 스프링 컨테이너, 빈이 무엇인지 , 왜 필요한지 정리하려고 한다.


스프링 컨테이너

스프링 컨테이너란?

쉽게 말하면, 스프링 컨테이너는 객체를 대신 만들어주고, 관리해주는 관리자라고 볼 수 있다.

개발자는 객체를 직접 생성하지 않아도 되고,
스프링 컨테이너가 빈(Bean) 이라는 객체를 생성한 뒤, 객체들 사이의 관계를 자동으로 연결해준다.

이렇게 객체 생성과 제어의 주도권이 개발자가 아닌 스프링에게 넘어가는 것을 IoC, 제어의 역전이라고 한다.

스프링 컨테이너가 하는 일

스프링 컨테이너는 다음과 같은 일을 한다.

  • 빈(객체) 생명주기(생성,초기화,소멸 등) 관리
  • 객체 간 의존성 주입(DI)
  • 싱글톤 관리

컨테이너 종류

스프링 컨테이너에는 대표적으로 두 가지가 있다.

Bean Factory

  • 스프링 컨테이너의 최상위 인터페이스
  • 스프링 빈을 관리하고 조회하는 역할
  • getBean() 을 제공

ApplicationContext

  • BeanFactory 를 확장한 컨테이너
  • 대부분의 스프링 애플리케이션에서 이 컨테이너를 사용
  • 부가 기능 제공
    • MessageSource : 메시지 국제화
    • EnvironmentCapable : 환경변수 관리
    • ApplicationEventPublisher : 이벤트 처리
    • ResourceLoader : 리소스 조회

우리가 사용하는 Spring Boot 역시 내부적으로는 ApplicationContext 를 기반으로 동작한다.

컨테이너를 사용하는 이유

객체를 생성하기 위해서는 보통 new 키워드를 사용한다.
이 방식에는 아래와 같은 문제가 있다.

  • 객체가 많아질수록 new 코드 증가
  • 객체들이 서로를 직접 참조하면서 의존성 강해짐
  • 수정 하나에 여러 클래스가 영향을 받음

이는 낮은 결합도와 높은 캡슐화를 지향하는 객체지향 프로그램 핵심과 멀어진다.

따라서, 이 문제 해결하기 위해 객체 생성과 의존성 관리를 스프링 컨테이너에게 맡긴다.

컨테이너 생성과 등록

아래 코드는 자바 어노테이션을 기반으로 컨테이너를 구성하고 스프링 컨테이너에 등록하는 예시이다.

@Configuration
public class AppConfig {

    @Bean
    public MemberService memberService() {
        return new MemberServiceImpl(memberRepository());
    }

    @Bean
    public MemberRepository memberRepository() {
        return new MemoryMemberRepository();
    }
}
public class MemberApp {
    public static void main(String[] args) {
        ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);
        MemberService memberService = applicationContext.getBean("memberService", MemberService.class)
    }
}
  • AnnotaionConfigApplicationContext
    • ApplicationContext 인터페이스의 구현체 중 하나
    • 자바 설정 클래스를 기반으로 컨테이너를 생성
  • @Configuration
    • 스프링 컨테이너가 해당 어노테이션이 붙은 클래스를 설정 정보로 사용
    • 클래스 내부에 @Bean 어노테이션이 적힌 메서드를 모두 호출하여 얻은 객체를 스프링 컨테이너에 빈으로 등록

스프링 빈

스프링 빈이란?

단순한 자바 객체(POJO)와의 차이점은 딱 하나다.

  • 일반 객체 : 개발자가 직접 생성
  • 스프링 빈 : 스프링 컨테이너가 생성, 관리

스프링 빈을 활용하면 객체간의 의존성을 줄이고, 유지보수성을 높일 수 있다.

등록 방법

XML 설정 파일

초기 스프링에서는 applicaionContext.xml 같은 XML 파일에 빈을 설정했지만, 최근에는 거의 사용되지 않는다.

어노테이션 기반 설정

요즘 스프링에서 가장 많이 사용되는 방식으로, 클래스에 @Component, @Service, @Repository 등 어노테이션을 사용해 등록한다.

자바 설정 파일

@Configuration 과 @Bean 어노테이션을 사용해 자바 클래스에서 직접 빈으로 등록할 수 있다.

BeanDefinition : 빈 메타정보

스프링이 다양한 설정 형식을 지원하는 것 또한 BeanDefinition의 추상화 덕분이다.

여기에도 역할과 구현의 분리가 이루어져있다.
스프링 컨테이너는 자바 코드인지, XML인지 전혀 몰라도 되고, BeanDefinition 만 알면 된다.

@Bean, 등 각각 메타 정보가 생성되고, 스프링 컨테이너는 이 메타 정보를 기반으로 스프링 빈을 생성한다.

빈 관련 메서드

  • getBeanDefinitionNames()
    • 스프링에 등록된 모든 빈 이름을 조회
  • getBean()
    • 특정 스프링 빈을 조회하는데 사용
    • getBean(빈이름,class 타입)
    • 조회하는 빈이 없으면 NoSuchBeanDefinitionException 예외가 발

참고자료

https://blu-blu.tistory.com/110

https://blu-blu.tistory.com/109

https://dev-wnstjd.tistory.com/440

https://ittrue.tistory.com/220#google_vignette

'CS' 카테고리의 다른 글

[CS] 컴포넌트 스캔과 의존관계 주입  (0) 2026.01.27
[CS] 싱글톤과 싱글톤 컨테이너  (0) 2026.01.27
[CS] - Spring vs Spring Boot  (1) 2026.01.19
[JWT] - Access Token , Refresh Token 만료  (0) 2026.01.11