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

빈과 컨테이너

스프링 프레임워크의 핵심적인 부분은 바로 스프링 빈과 컨테이너이다. 하지만 스프링을 처음 접하는 사람에게는 이 개념들이 다소 생소하게 느껴질 수 있다.

"스프링 빈은 스프링 컨테이너가 관리하는 객체를 의미하고, 컨테이너에 의해 생명 주기가 관리되며, 의존성 주입을 할 수 있다."

라고 설명하지만, 이 문장이 이해하기 어렵다면, 각각의 개념을 차근차근 알아보자.

스프링 빈의 생명 주기와 의존성 주입

우선 스프링 빈의 생명 주기에 대해 알아보자. 스프링 빈의 생명 주기는 스프링 컨테이너에 의해 관리되며, 다음과 같은 단계로 구분된다.

스프링 빈의 생명 주기

스프링 빈의 생명 주기는 아래와 같이 구분된다.

  1. 빈 생성 (Instantiation): 스프링 컨테이너가 빈을 인스턴스화한다. 즉, 빈 객체가 메모리에 할당된다.
  2. 의존성 주입 (Dependency Injection): 빈이 생성된 후, 스프링 컨테이너는 빈이 필요로 하는 의존성을 주입한다.
  3. 초기화 (Initialization): 의존성 주입이 완료된 후, 빈은 초기화 과정을 거친다. 이 단계에서는 커스텀 초기화 메서드를 실행할 수 있다.
  4. 사용 (Usage): 애플리케이션이 빈을 사용한다. 빈은 애플리케이션의 비즈니스 로직을 수행하는 데 사용된다.
  5. 소멸 (Destruction): 애플리케이션이 종료되거나 빈이 더 이상 필요 없을 때, 스프링 컨테이너는 빈의 소멸 과정을 처리한다. 이 단계에서는 커스텀 소멸 메서드를 실행할 수 있다.

이렇게 빈의 생명 주기 단계를 관리해주는 것이 바로 '스프링 컨테이너'이다.

의존성 주입 (Dependency Injection)

의존성 주입이란 무엇일까?

간단히 말해, 의존성 주입은 객체 간의 의존 관계를 외부에서 설정해주는 것을 의미한다. 스프링 컨테이너는 빈을 생성하고, 각 빈이 필요로 하는 의존 객체를 자동으로 주입해준다.

의존성 주입의 종류

  • 생성자 주입 (Constructor Injection): 의존성을 생성자의 매개변수로 주입한다.
  • 세터 주입 (Setter Injection): 의존성을 세터 메서드를 통해 주입한다.
  • 필드 주입 (Field Injection): 의존성을 필드에 직접 주입한다 (추천되지 않음, 주로 테스트용).

예시 코드

아래 예시는 스프링 컨테이너가 빈을 생성하고, 의존성을 주입하는 과정을 보여준다.

package spring_learn.demo.service;

import org.springframework.stereotype.Service;

@Service
public class HelloService {
    public String sayHello() {
        return "Hello, World!";
    }
}

여기서 @Service 어노테이션은 HelloService 클래스가 스프링 컨테이너에 의해 관리되는 빈임을 나타낸다.

package spring_learn.demo.controller;

import spring_learn.demo.controller.HelloService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {

    private final HelloService helloService;

    @Autowired
    public HelloController(HelloService helloService) {
        this.helloService = helloService;
    }

    @GetMapping("/hello")
    public String sayHello() {
        return helloService.sayHello();
    }
}

HelloController 클래스는 HelloService 빈을 의존성으로 주입받아 사용한다.
이때, 스프링 컨테이너가 HelloService 빈을 생성하고 HelloController에 주입해준다.

스프링 빈의 생명 주기와 의존성 주입 정리 (요약)

  • 스프링 빈: 스프링 컨테이너에 의해 관리되는 객체.
  • 스프링 컨테이너: 스프링 빈의 생명 주기를 관리하고, 의존성을 주입하는 역할을 담당.
  • 생명 주기: 빈의 생성부터 소멸까지의 과정.
  • 의존성 주입: 빈이 필요로 하는 의존 객체를 스프링 컨테이너가 주입해주는 것.

'Back-Language > Spring' 카테고리의 다른 글

[Spring] 테스트 케이스 쉽게 만들기(IntelliJ)  (1) 2024.07.08