-
Spring: 빈(Bean)이란?Back-End/Spring 2025. 4. 11. 21:35반응형
🫘 스프링의 빈이란? – 객체를 관리하는 스프링의 핵심 메커니즘
“Spring에서 Bean이란, 단순한 객체가 아닙니다.
생성부터 소멸까지, 프레임워크가 관리하는 살아있는 객체입니다.”1. 들어가며 – 객체는 누가 관리하나요?
Java 애플리케이션에서 객체를 생성하는 가장 기본적인 방법은 new 키워드를 사용하는 것입니다.
MyService myService = new MyService();
하지만 이 객체가 여러 클래스에서 공통으로 필요하다면, 매번 new로 만들면 비효율적이고, 객체 간 의존성이 복잡해지며, 테스트도 어려워집니다.
이런 문제를 해결하기 위해 Spring은 IOC(제어의 역전, Inversion of Control) 이라는 개념을 도입합니다.
객체를 직접 만들고 연결하지 않고, Spring이 대신 관리하도록 하는 것이죠.
그리고 이때 Spring이 관리하는 객체를 “Bean(빈)” 이라고 부릅니다.
2. 스프링 빈이란 무엇인가?
정의부터 짚고 가보죠.
Spring Bean이란, Spring IoC 컨테이너가 생성하고 관리하는 객체입니다.
Spring의 ApplicationContext(컨테이너) 가 초기화될 때, Bean으로 등록된 클래스들의 인스턴스를 생성하고, 의존성을 주입하고, 라이프사이클을 관리합니다.
3. Bean 등록 방식 – 어떻게 스프링에게 알려줄까?
Spring이 객체를 Bean으로 관리하려면 "이 클래스는 Bean이에요!" 라고 알려줘야 합니다. 방법은 아래와 같이 3가지가 있어요.
(1) 어노테이션 기반 등록 – @Component
@Component public class MyService { public void serve() { System.out.println("서비스 동작 중"); } }
- @Component, @Service, @Repository, @Controller → 모두 컴포넌트 스캔의 대상
- 내부적으로는 모두 @Component 계열이며 역할별로 구분하는 네이밍 차이입니다.
Spring Boot에서는 @SpringBootApplication 안에 @ComponentScan이 기본적으로 포함되어 있어, 자동으로 위 클래스가 Bean으로 등록됩니다.
(2) 자바 설정 클래스 + @Bean
@Configuration public class AppConfig { @Bean public MyService myService() { return new MyService(); } }
- 조금 더 명시적이고 유연한 방식
- 외부 라이브러리처럼 @Component를 수정할 수 없는 클래스도 Bean으로 등록 가능
(3) XML 설정 (비권장)
과거에는 이런 식으로 XML 파일에서 Bean을 등록했지만, 현재는 거의 사용되지 않습니다.
<bean id="myService" class="com.example.MyService"/>
4. 스프링 빈의 라이프사이클 – 생성부터 소멸까지
Spring은 단순히 객체만 만들어주는 것이 아니라, 빈의 전체 생명주기를 관리합니다.
빈의 생명주기 단계:
- 빈 생성: 객체 생성 (new)
- 의존성 주입: 필요한 다른 Bean 주입
- 초기화 콜백: @PostConstruct 메서드 호출
- 사용: 요청 처리, 비즈니스 로직 수행
- 소멸 전 콜백: @PreDestroy 호출
- GC 대상
5. 의존성 주입(DI) – Bean을 사용하는 방법
@Component public class MyController { private final MyService myService; @Autowired public MyController(MyService myService) { this.myService = myService; } public void handle() { myService.serve(); } }
- @Autowired는 자동으로 Bean을 찾아서 주입해줍니다.
- 생성자 주입 방식이 가장 명확하고 테스트하기 좋습니다.
- 최근에는 생성자 하나만 있는 경우 @Autowired 생략 가능합니다.
6. Bean은 왜 싱글톤인가요?
Spring은 기본적으로 모든 Bean을 싱글톤(Singleton) 으로 관리합니다. 즉, 하나의 Bean을 애플리케이션 전체에서 공유합니다.
이렇게 하면:
- 메모리 효율이 좋고,
- 공유 자원을 일관되게 관리할 수 있습니다.
필요에 따라 @Scope("prototype"), @Scope("request") 등을 써서 Bean의 생존 범위를 바꿀 수도 있습니다.
7. 스프링 컨테이너는 무엇을 하는가?
정리하자면, 스프링 컨테이너는 아래 작업을 수행합니다:
8. 비유로 이해해 보기 – 스프링 컨테이너는 객체의 호텔 매니저
Spring을 호텔이라고 비유해볼게요.
- 호텔 로비(컨테이너)에 요청하면,
- 매니저가 필요한 서비스 객체(Bean)를 준비해서 가져다줍니다.
- 청소, 보안, 유지관리도 다 알아서 해줍니다.
- 우리는 "객체를 요청하고 사용만" 하면 됩니다.
마치며
스프링의 핵심은 단연 "빈(Bean)"입니다.
Bean은 객체를 만들고 관리하는 것을 넘어서, 애플리케이션 아키텍처를 모듈화하고 효율적으로 설계할 수 있게 해줍니다.
이해하면 단순하지만, 스프링을 제대로 활용하려면 Bean의 개념을 깊이 있게 이해하는 것이 매우 중요합니다.
반응형'Back-End > Spring' 카테고리의 다른 글
Spring Boot: Java vs Kotlin (0) 2024.06.13 Spring Starter Web vs Spring WebFlux (0) 2024.06.13