TIL/내일배움캠프

[Spring] IoC 컨테이너와 Bean — 객체를 관리하는 Spring의 방식

bu119 2025. 9. 23. 18:00
728x90
반응형

📝 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 { ... }

 

서버가 시작될 때

  1. Spring이 MemoService 객체를 생성
  2. 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에 맡길 수 있습니다.

728x90
반응형