📝 TIL (Today I Learned) — 2025.09.23. 화요일
✍️ 내일배움캠프에서 Spring 학습 중 정리한 내용입니다.
1. IoC 컨테이너와 Bean이란?
앞서 1편에서 IoC(제어의 역전)와 DI(의존성 주입)를 살펴봤습니다.
그렇다면 “필요한 객체를 누가 생성하고, 어디에 보관하며, 어떻게 주입해줄까?”라는 질문이 생깁니다.
이 역할을 담당하는 것이 바로 Spring IoC 컨테이너입니다.
- Bean: Spring이 대신 생성하고 관리하는 객체
- IoC 컨테이너: Bean을 모아두고 관리하는 공간
👉 개발자가 직접 객체를 만들지 않아도, Spring이 알아서 Bean을 준비하고 필요한 곳에 주입해줍니다.
2. Bean 등록 방법
@Component
클래스 위에 @Component를 붙이면 Spring이 자동으로 Bean으로 등록합니다.
@Component
public class MemoService { ... }
서버가 시작될 때
- Spring이 MemoService 객체를 생성
- IoC 컨테이너에 memoService라는 이름으로 저장
// 1. MemoService 객체 생성
MemoService memoService = new MemoService();
// 2. Spring IoC 컨테이너에 Bean (memoService) 저장
// memoService -> Spring IoC 컨테이너
@ComponentScan
@ComponentScan을 사용하면 지정된 패키지와 그 하위 패키지를 뒤져서 @Component가 붙은 클래스를 모두 Bean으로 등록합니다.
@Configuration
@ComponentScan(basePackages = "com.sparta.memo")
class BeanConfig { }
👉 Spring Boot에서는 @SpringBootApplication에 기본적으로 @ComponentScan이 포함되어 있습니다.
따라서 별도 설정이 없어도 com.sparta.memo 패키지 하위 클래스들은 자동으로 Bean으로 등록됩니다.
3 Layer Annotation
실무에서는 단순히 @Component 대신 역할에 맞는 애너테이션을 사용합니다.
- @Controller / @RestController → Controller 계층
- @Service → Service 계층
- @Repository → Repository 계층
👉 이들은 내부적으로 모두 @Component를 포함하고 있어, 자동으로 Bean으로 등록됩니다.
하지만 역할을 명확하게 구분할 수 있다는 점에서 더 권장됩니다.
3. Bean 사용 방법
@Autowired (DI 자동 주입)
Spring IoC 컨테이너에서 관리 중인 Bean을 자동으로 주입받을 수 있습니다.
@Service
@RequiredArgsConstructor
public class MemoService {
private final MemoRepository memoRepository;
}
- MemoRepository Bean이 IoC 컨테이너에 존재한다면, Spring이 자동으로 주입해줍니다.
- @RequiredArgsConstructor는 Lombok을 이용해 생성자 코드를 줄여주는 방식으로, 실무에서 자주 사용됩니다.
ApplicationContext (직접 가져오기)
IoC 컨테이너에 저장된 Bean을 직접 꺼내올 수도 있습니다.
public MemoService(ApplicationContext context) {
MemoRepository repo = context.getBean(MemoRepository.class);
}
👉 하지만 Spring 철학은 “직접 가져오기보다 자동 주입(@Autowired) 사용”입니다.
ApplicationContext 접근은 **특수한 경우(예: 테스트, 동적 Bean 탐색)**에만 쓰는 것이 일반적입니다.
4. 정리
- Bean: Spring이 대신 생성하고 관리하는 객체
- IoC 컨테이너: Bean을 모아두고 관리하는 저장소
- 등록 방법: @Component, @ComponentScan, 3 Layer Annotation(@Service, @Repository 등)
- 사용 방법: @Autowired로 주입받는 것이 일반적, ApplicationContext로 직접 꺼내는 것은 특수한 경우에만 사용
👉 결론적으로, 개발자는 객체 생성과 관리에 신경 쓰지 않고 비즈니스 로직에만 집중할 수 있습니다.
✨ 최종 한 줄
IoC 컨테이너와 Bean은 Spring의 심장과 같은 존재입니다.
이 덕분에 개발자는 “무엇을 만들까?”에 집중하고, “어떻게 만들지?”는 Spring에 맡길 수 있습니다.
'TIL > 내일배움캠프' 카테고리의 다른 글
| [JPA] 영속성 컨텍스트의 기능 (0) | 2025.09.25 |
|---|---|
| [JPA] 영속성 컨텍스트란? (0) | 2025.09.24 |
| [Spring] IoC와 DI — 좋은 코드의 핵심 원칙 (0) | 2025.09.22 |
| [Java] 문자열 다루기 — String, StringBuffer, StringBuilder 차이 (0) | 2025.09.19 |
| [Spring] 자바 웹 개발 흐름 정리 — Servlet부터 Spring Boot까지 (1) | 2025.09.18 |