728x90
반응형
빈(Bean) 이란?
스프링의 핵심 구성 요소로, 스프링 IoC(Inversion of Control) 컨테이너가 관리하는 자바 객체를 의미한다.
의존성 주입(Dependency Injection)을 통해 애플리케이션 컴포넌트 간의 결합도를 낮추고 유연성과 유지 보수성을 높여준다.
애플리케이션의 비즈니스 로직을 구현에 사용되며, DI와 AOP에서 중요한 역할을 한다.
빈의 특징 및 장점
- 재사용성
스프링 컨테이너가 관리하는 빈은 여러 컴포넌트에서 재사용될 수 있다. - 유지보수성
의존성 주입을 통해 코드의 결합도를 낮추고, 유지보수성을 높일 수 있다. - 테스트 용이성
빈을 모의 객체(mock object)로 대체하여 단위 테스트를 쉽게 할 수 있다. - 모듈화
빈을 모듈화하여 코드의 구조를 명확하게 하고, 기능을 분리할 수 있다.
1. 스프링 빈의 정의
스프링 빈은 보통 애플리케이션의 구성 요소로서, 애플리케이션 컨텍스트(Application Context)에 의해 관리된다.
일반적으로 클래스 수준에서 정의된다.
1.1 XML 설정 파일
스프링의 초기 버전에서는 XML 파일을 사용하여 빈을 정의하고 설정했다.applicationContext.xml
과 같은 XML 파일에서 <bean>
태그를 사용하여 빈을 정의한다.
<bean id="myBean" class="com.example.MyBean">
<property name="propertyName" value="propertyValue" />
</bean>
1.2 어노테이션 기반 설정
최근에는 어노테이션을 사용한 설정이 더 선호되고 있다.
@Component
: 일반적인 빈 정의.@Service
: 서비스 레이어에서 사용.@Repository
: 데이터 접근 레이어에서 사용.@Controller
: 프레젠테이션 레이어에서 사용.
@Component
public class MyBean {
// 빈의 내용
}
1.3 자바 설정 클래스
@Configuration
과 @Bean
어노테이션을 사용하여 자바 설정 클래스를 사용하여 빈을 정의할 수 있다.
@Configuration
public class AppConfig {
@Bean
public MyBean myBean() {
return new MyBean();
}
}
2. 스프링 빈의 등록
스프링 컨테이너는 빈 정의를 바탕으로 애플리케이션 시작 시 빈을 생성하고 관리한다.
- 컴포넌트 스캔(Component Scan)
@ComponentScan
어노테이션을 사용하여 지정된 패키지에서 어노테이션 기반 빈을 자동으로 검색하고 등록한다. - XML 설정
XML 파일 내에서<context:component-scan>
태그를 사용하여 컴포넌트 스캔을 설정할 수 있다. - 자바 설정
@Configuration
클래스 내에서@Bean
어노테이션을 사용하여 메서드 수준에서 빈을 등록할 수 있다.
3. 빈의 스코프
스코프는 빈이 생성되고 관리되는 생명주기와 활용 범위를 정의한다.
스프링에서는 여러 빈 스코프를 제공하며 기본 스코프는 싱글톤(Singleton)이다.
- 싱글톤(Singleton)
기본 스코프로, 애플리케이션 컨텍스트 당 하나의 빈 인스턴스를 생성한다.
빈 정의에 별도의 스코프를 지정하지 않으면 싱글톤으로 설정된다. - 프로토타입(Prototype)
빈 요청 시마다 새로운 인스턴스를 생성한다. - 리퀘스트(Request)
HTTP 요청 당 하나의 빈 인스턴스를 생성한다. 주로 웹 애플리케이션에서 사용된다. - 세션(Session)
HTTP 세션 당 하나의 빈 인스턴스를 생성한다. 주로 웹 애플리케이션에서 사용된다. - 애플리케이션(Application)
서블릿 컨텍스트 당 하나의 빈 인스턴스를 생성한다. 주로 웹 애플리케이션에서 사용된다. - 웹 소켓(WebSocket)
웹 소켓 세션마다 하나의 빈 인스턴스를 생성한다.
@Component
@Scope("prototype")
public class MyPrototypeBean {
// 빈의 내용
}
4. 빈의 생명주기
빈의 생명주기는 스프링 IoC 컨테이너가 빈을 생성하고, 초기화하며, 소멸시키는 과정을 의미한다.
- 빈 생성
스프링 컨테이너가 빈을 인스턴스화 - 의존성 주입
빈이 생성된 후, 필요한 의존성을 주입 - 초기화
빈이 초기화되는 단계로 초기화를 위해InitializingBean
인터페이스의afterPropertiesSet()
메서드나@PostConstruct
어노테이션을 사용 - 빈 사용
애플리케이션의 비즈니스 로직에서 빈을 사용 - 소멸
애플리케이션이 종료되거나 빈이 더 이상 필요하지 않을 때, 빈을 소멸
빈 소멸을 위해DisposableBean
인터페이스의destroy()
메서드나@PreDestroy
어노테이션을 사용
5. 라이프사이클 콜백
스프링 빈은 라이프사이클 동안 특정 시점에 콜백 메서드를 호출할 수 있다.
@PostConstruct
: 빈 초기화 직후에 호출@PreDestroy
: 빈 소멸 직전에 호출
@Component
public class MyBean {
@PostConstruct
public void init() {
// 초기화 로직
}
@PreDestroy
public void destroy() {
// 정리 로직
}
}
6. 빈의 의존성 관리 및 주입 도구
@Autowired
스프링 컨테이너가 자동으로 의존성을 주입@Qualifier
같은 타입의 여러 빈이 존재할 때 특정 빈을 선택@Primary
같은 타입의 여러 빈이 있을 때 기본적으로 선택될 빈을 지정
@Autowired
@Qualifier("specificBean")
private Dependency dependency;
6. 애플리케이션 컨텍스트
애플리케이션 컨텍스트는 스프링 IoC 컨테이너의 구현체다.
ClassPathXmlApplicationContext
XML 설정 파일을 클래스패스에서 로드AnnotationConfigApplicationContext
자바 설정 파일을 로드WebApplicationContext
웹 애플리케이션용 컨텍스트
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MyBean myBean = context.getBean(MyBean.class);
728x90
반응형
'Back-end > SpringBoot' 카테고리의 다른 글
스프링에서 DB 트랜잭션을 어떻게 사용할까? (0) | 2024.07.15 |
---|---|
Persistence Context란 무엇일까? (1) | 2024.07.15 |
JWT 토큰 기반 로그인 구현하기(1) (0) | 2024.07.08 |
의존성 주입이란 무엇일까? (0) | 2024.06.23 |
Spring과 Spring boot란 무엇일까? (0) | 2024.06.23 |