스프링을 처음 공부하면 가장 많이 듣는 단어가 있다.
- 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을 자동으로 넣어준다.
'Spring' 카테고리의 다른 글
| [Spring] JPA 연관관계 매핑 정리 (0) | 2026.07.06 |
|---|---|
| [Spring] Session과 JWT란? (0) | 2026.07.03 |
| [Spring] Request DTO는 스프링이 만들어주는데, Response DTO는 왜 내가 만들어야 할까? (0) | 2026.07.01 |
| [Spring 입문] 스프링 전체 흐름 정리 (0) | 2026.06.29 |
| [Spring 입문] Servlet 이해하기 (0) | 2026.06.26 |