Spring Boot

[Spring] Spring Container & Bean에 대해 알아보자

dev-sunflower 2025. 2. 5. 21:30

스파르타코딩클럽 부트캠프에서 공부한 스프링 컨테이너(Spring Container)스프링 빈(Spring Bean)에 대해 작성해보려 한다.

Spring Cotainer 란?

  • 스프링 컨테이너는 스프링 프레임워크의 핵심 컴포넌트라고 한다.
  • 스프링에서는 자바의 객체를 빈(Bean)이라고 한다.
  • 스프링 컨테이너는 빈(Bean)의 생명주기(생성, 관리, 소멸 등)를 관리 하고 생성된 객체들에게 추가적인 기능을 제공해준다.

Java 객체 생성

 

 평소에 자바에서 객체를 사용하려면 그림과 같이 new를 사용하여 객체를 생성하여 사용했다. 하지만 객체를 직접 생성하는 경우, 객체 간의 의존성 및 결합도가 높아지며, OCP, DIP를 위반하게 된다.

Spring Container 역할

 

Spring Container 가 있다면. 그림과 같이 객체(Bean)을 생성 및 관리하고 의존성을 주입하는 역할을 해준다. 이를 활용하면 인터페이스에만 의존하는 설계가 가능해지므로 OCP, DIP 를 준수하며 개발을 진행 할 수있다.

Spring Container의 종류

Spring Container 종류

 

BeanFactory

  • Spring Container의 최상위 인터페이스이며, Bean을 관리하고 조회한다.

★ ApplicationContext

  • BeanFactory의 확장형이며, Application 개발에 필요한 기능을 추가적으로 제공해준다.
  • 일반적으로 ApplicationContext를 사용하기 때문에 ApplicationContext를 SpringContainer라고 표현한다.

필요 기능 

  • MessageSource: 다국어 처리를 할때 사용되는 객체
  • EnvironmentCapable: Profile 기능을 제공 한다. 여기서 프로파일은 특정 실행 환경에서 사용할 빈들의 묶음을 말한다.
  • ApplicationEventPublisher: 디자인 패턴중 하나인 옵저버 패턴(Observer Pattern)의 구현체 이다.
  • ResourceLoader: 리소스를 읽어오는 기능을 제공하는 인터페이스 이다.

Spring Bean이란?

위에서 말한 것 처럼 Spring Container가 관리하는 객체를 의미한다. 자바 객체 자체는 특별하지 않지만, Spring이 이 객체를 관리하는 순간부터 Bean이 된다.

 

Spring Bean!

 

Bean은 new 키워드 대신 사용하는 것이고, Spring Container가 제어한다.

특징

  1. Spring Container에 의해 생성되고 관리된다.
  2. 기본적으로 Singleton으로 설정된다.
  3. 의존성 주입(DI)을 통해 다른 객체들과 의존 관계를 맺을 수 있다.
  4. 생성, 초기화, 사용, 소멸의 생명주기를 갖는다.

Bean 등록 방법

Bean은 XML, Java Annotation, Java 설정 파일 등을 통해 등록할 수있다.

 

XML

<beans>
    <!-- myBean이라는 이름의 Bean 정의 -->
    <bean id="myBean" class="com.example.MyBean" />
</beans>
public class MyApp {
    public static void main(String[] args) {
        // Spring 컨테이너에서 Bean을 가져옴
        ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml");
        MyService myService = context.getBean("myService", MyService.class);
        myService.doSomething();
    }
}

 

Annotation

  • @ComponentScan: @component 어노테이션 및 streotype(@Service, @Repositoty, @Controller) 어노테이션이 부여된 Class들을 자동으로 Scan하여 Bean으로 등록해주는 역할을 하는 어노테이션 입니다.
// 이 클래스를 Bean으로 등록
// @Controller, @Service, @Repository
@Component
public class MyService {

    public void doSomething() {
        System.out.println("Spring Bean 으로 동작");
    }
    
}
@Component
public class MyApp {

    private final MyService myService;

    @Autowired // 의존성 자동 주입
    public MyApp(MyService myService) {
        this.myService = myService;
    }

    public void run() {
        myService.doSomething();
    }
}
// com.example 패키지를 스캔하여 Bean 등록
@Configuration
@ComponentScan(basePackages = "com.example")
public class AppConfig {

    public static void main(String[] args) {
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MyApp app = context.getBean(MyApp.class);
        app.run();
    }
    
}

 

 

Java 설정파일

@Configuration
public class AppConfig {

    @Bean
    public MyService myService() {
        return new MyService();
    }
}
public class MyApp {
    public static void main(String[] args) {
        // Spring 컨테이너에서 Bean을 가져옴
        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
        MyService myService = context.getBean(MyService.class);
        myService.doSomething();
    }
}

 

강의에서는 Spring Bean 등록중 수동 등록도 존재하지만 오늘 정리한 내용에서는 제외하였다 앞으로 개발을 하는데 있어 수동등록을 사용할때 다시한번 그 내용을 다뤄보려한다.