Spring

[Spring] 핵심 개념 정리 (Bean, IoC, DI)

chungmani 2026. 7. 2. 21:09

 

스프링을 처음 공부하면 가장 많이 듣는 단어가 있다.

  • Bean
  • IoC
  • DI

처음에는 어려워 보이지만 사실 이 세 가지는 하나의 흐름으로 연결되어 있다.

 


Bean이란?

 

Bean = 스프링이 직접 생성하고 관리하는 객체(Object)

 

예를 들어

@Service
public class MovieService {
}
 

 

프로그램이 실행되면

스프링이 객체 생성을 대신 실행한다.

new MovieService();
 

 

그리고 이 객체를 보관한다.

이렇게 스프링이 관리하는 객체를 Bean이라고 한다.

 

              Spring

        ┌─────────────────┐
        │                 │
        │ MovieService    │ ← Bean
        │ MovieRepository │ ← Bean
        │ MovieController │ ← Bean
        │                 │
        └─────────────────┘
 

Bean은 모두 스프링이 관리한다.

 


IoC(Inversion of Control)란?

제어의 역전

 

이름은 어려워 보이지만 뜻은 간단하다.

 

원래는 개발자가 직접 객체를 만들었다.

하지만 스프링에서는 객체를 생성하는 주체가

개발자 → 스프링으로 바뀌었다.

 

이것을

제어의 역전(IoC)이라고 한다.

 

 

기존 Java

개발자

↓

new MovieService()

↓

객체 생성
 

Spring

개발자

↓

@Component

↓

Spring

↓

객체 생성
 

 


DI(Dependency Injection)란?

의존성 주입

 

 

예를 들어 Controller는 Service가 있어야 한다.

private final MovieService movieService;
 

그런데 MovieService 객체가 없으면 사용할 수 없다.

 

 

예전 방식이라면 직접 만들었을 것이다.

MovieService movieService = new MovieService();
 
 

하지만 스프링에서는

Controller

↓

MovieService 필요!

↓

Spring

↓

창고(Bean)에서 꺼내준다.

 

이것이 바로 DI(의존성 주입)이다.

            Spring

      ┌───────────────┐
      │ MovieService  │
      │ MovieRepository│
      └───────────────┘
             │
             │
             ▼
MovieController에 자동 주입
 

@Component는?

 
@Component
public class A {
}
 

@Component를 보면 스프링이

"이 클래스는 내가 관리해야겠다." 라고 생각한다.

 

@Component

↓

객체 생성

↓

Bean 등록
 

 

 

@Service, @Repository, @Controller

사실 모두 @Component의 기능을 가지고 있다.

            @Component
                 ▲
      ┌──────────┼──────────┐
      │          │          │
 @Controller  @Service  @Repository
 

차이는 역할을 구분하기 위해서이다.

 
어노테이션역할
@Controller HTTP 요청 처리
@Service 비즈니스 로직
@Repository DB 접근
@Component 일반 객체

 


전체 흐름

          프로그램 시작
                │
                ▼
        Spring 실행
                │
                ▼
    @Component 계열 탐색
                │
                ▼
       객체 자동 생성(new)
                │
                ▼
        Bean으로 등록
                │
                ▼
    Controller 생성
                │
                ▼
 MovieService가 필요함!
                │
                ▼
 Bean에서 찾아 자동 주입(DI)
                │
                ▼
      모든 준비 완료!
 

왜 이렇게 만들었을까?

만약 스프링이 없다면 개발자가 모든 객체를 직접 생성하고 연결해야 한다.

MovieRepository repository = new MovieRepository();
MovieService service = new MovieService(repository);
MovieController controller = new MovieController(service);
 

 

하지만 스프링은

  • 객체 생성
  • 객체 관리
  • 객체 연결

까지 모두 대신 해준다.

그래서 우리는 비즈니스 로직에만 집중할 수 있다.

세 개의 관계

IoC
│
├── Spring이 객체를 생성한다.
│
▼
Bean
│
├── 생성된 객체를 Spring이 관리한다.
│
▼
DI
│
└── 필요한 곳에 Bean을 자동으로 넣어준다.