관리 메뉴

백엔드 엔지니어 이재혁

[Spring] Spring이 작동하는 방식 본문

Java

[Spring] Spring이 작동하는 방식

alex00728 2025. 6. 8. 20:46

Spring Framework 기반 어플리케이션이 실행되면 어떤 일이 일어나는지 살펴보자.

 

  1. 스프링 컨테이너(ApplicationContext) 생성
    스프링 컨테이너는 모든 빈(Bean)의 생명 주기를 관리한다.
  2. 빈(Bean) 생성 및 의존성 주입(DI)
    스프링 컨테이너가 설정 파일(application.xml 등)이나 어노테이션(`@Component`, `@Configuration` 등)을 통해 등록된 클래스를 스캔하여 빈으로 등록하며, 객체간 의존성을 주입한다.
  3. 의존성 주입 후처리
    의존성 주입이 끝나면, `@PostConstruct` 등으로 정의된 초기화 메서드가 실행된다. 이 시점에 추가적인 설정이나 초기화 작업을 할 수 있다.
  4. 어플리케이션 실행 및 빈 사용
    모든 빈이 준비되면, 실제로 어플리케이션 로직이 실행된다. 컨트롤러, 서비스, 레포지토리 등 각 계층의 객체들은 이미 스프링이 주입해준 의존 객체를 활용한다.

위 과정을 통해, 개발자가 구현체에 대한 의존성을 작성할 필요 없이 Spring이 필요한 의존성을 주입해준다. (DI)

이 과정이 의존성 제어 권한이 Spring 컨테이너로 넘어간 IoC(제어의 역전)이다.

 

스프링의 객체(빈) 생성 단계

스프링이 의존성 주입을 해주기 위해서는 먼저 스프링이 객체들의 의존 관계를 알아야 한다.

예를 들어, Service가 Repository에 의존하는데 Repository가 생성되지 않은 상태에서 Service를 생성하려면 Repository를 주입 받을 수 없는 상황이 발생한다.

 

따라서, 스프링이 객체를 생성하고 의존성을 주입해준다는 말이 그렇게 단순한 작업이 아닐 것이라는 추측이 가능하다.

 

Spring 컨테이너는 어플리케이션이 시작하면 다음과 같은 과정으로 Bean을 등록하고 객체를 생성한다. 

  1. 빈 스캔 및 등록
    `@Component`, `@Service` 등 빈(Bean) 대상이 될 수 있는 클래스들을 스캔한다.
    이 과정에서는 실제 객체를 생성하지 않고, 어떤 클래스가 빈으로 등록될지, 그리고 각 빈이 어떤 의존성을 필요로 하는지 메타데이터만 저장한다.
  2. 의존성 분석
    저장한 빈 정의를 바탕으로, 각 빈이 어떤 다른 빈에 의존하는지(생성자, 필드, Setter 등) 의존성 그래프를 만든다.
  3. 빈 인스턴스 생성 및 의존성 주입
    의존성 그래프를 따라 필요한 빈부터 차례대로 인스턴스를 생성한다.
    생성자 주입을 사용할 경우, 의존 빈이 모두 준비된 후에 해당 빈의 인스턴스가 생성된다.
    필드 및 Setter 주입의 경우, 먼저 빈을 다 생성하고 나서 주입을 해준다고 한다.

위 과정이 Spring Framework가 자체적으로 DI를 실행해주는 과정이다.

 

마지막 부분, "필드 및 Setter 주입"은 주의할 점이 있는데, 의존성 관련된 문제를 사전 탐지하지 못하는 방식이다.

궁금하다면, [Spring] Spring의 주입 방식 게시글 확인

'Java' 카테고리의 다른 글

[Java] Atomic과 CAS 연산  (0) 2025.06.09
[Spring] Spring의 주입 방식  (0) 2025.06.09
[Spring] Spring이 등장한 이유  (0) 2025.06.08
[Java] BlockingQueue  (0) 2025.05.29
[Java] 생산자 소비자 문제 (2)  (0) 2025.05.27