스프링 빈(Spring Bean) 이란?
Spring IoC 컨테이너가 관리하는 자바 객체를 빈(Bean)이라고 한다.
IoC의 특징
- 일반적인 자바는 모든 작업을 사용자가 제어하는 구조이다. A 객체에서 B 객체에 있는 메소드를 사용하려면 A 객체 내에서 B 객체를 직접 생성하고 메소드를 호출한다. 즉, 각 객체들이 프로그램의 흐름을 결정하고 각 객체를 직접 생성/조작하는 작업을 한다.
- 하지만 IoC가 적용된 경우, 객체의 생성을 특별한 관리 위임 주체에게 맡긴다. 이 때 사용자는 객체를 직접 생성하지 않고, 객체의 생명주기를 컨트롤하는 주체는 다른 주체가 된다. 즉 사용자의 제어권을 다른 주체에게 넘기는 것을 IoC(제어의 역전)라고 한다.
우리는 일반적으로 자바에서 Class를 생성하고 new를 입력하여 원하는 객체를 직접 생성한 후 사용한다. 하지만 Spring에서는 직접 new를 사용하지 않고 Spring에 의하여 관리당하는 자바 객체를 사용한다. 이렇듯 Spring에 의하여 생성되고 관리되는 자바 객체를 Bean이라고 한다. Spring Framework 에서는 Spring Bean을 얻기 위하여 ApplicationContext.getBean() 메소드를 사용하여 Spring에서 직접 자가 객체를 얻어 사용한다.
Spring Bean 등록 방법
1. Component Scan
Spring에서 Bean 등록을 할 때는 @Component annotation과 @ComponentScan annotaion을 사용한다.
@ComponentScan 어노테이션은 어디서부터 컴포넌트를 찾아올 것인지 알려주는 역할을 한다. @ComponentScan이 붙어있는 클래스가 있는 패키지에서부터 모든 하위 패키지의 모든 클래스를 훑어보며 @Component 어노테이션(혹은 @Component 어노테이션을 사용하는 다른 어노테이션)이 붙은 클래스를 찾는다. 이 과정을 통해 Spring IoC 은 빈을 등록해준다.
스프링 부트 사용 시 @SpringBootApplication 어노테이션의 내부에 @ComonentScan 어노테이션이 포함되어있다.
또, @Controller 어노테이션의 내부에 @Component 어노테이션을 포함되어있다. 그 외에도 @Component이 포함되어있는 어노테이션에는 어떤 것이 있을까?
컴포넌트 스캔의 대상
- @Controller : Spring MVC 컨트롤러로 인식된다.
- @Repository : Spring 데이터 접근 계층으로 인식하고 해당 계층에서 발생하는 예외는 모두 DataAccessException으로 변환한다.
- @Service : 특별한 처리는 하지 않으나, 개발자들이 핵심 비즈니스 계층을 인식하는데 도움을 준다.
- @Configuration : 스프링 설정 정보로 인식하고 스피링 빈이 싱글톤을 유지하도록 추가 처리를 한다.(스피링 빈 스코프가 싱글톤이 아니라면 추가 처리를 하지 않음)
아래는 컴포넌트 어노테이션 예시이다.
1
2
3
4
5
6
|
@Controller
public class SpringController {
public void Hello(String str) {
System.out.println("Hello" + str);
}
}
|
cs |
2. 빈 설정파일에 직접 등록
@Component 어노테이션을 사용하지 않고 빈 설정 파일에 직접 빈으로 등록하는 방법도 있다. 빈 설정 파일은 XML과 자바 설정 파일로 작성할 수 있는데 최근 추세는 자바 설정 파일을 좀 더 많이 사용한다.
자바 설정파일은 일반적으로 xxxConfiguraion과 같이 명명한다.
클래스 위에 @Configuration 어노테이션을, 빈을 등록하고자 하는 메소드 위에 @Bean 어노테이션을 사용해 직접 빈을 등록할 수 있다.
아래는 예시이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@Configuration
public class AppConfig {
@Bean
public MemberRepository memberRepository() {
return new MemoryMemberRepository();
}
@Bean
public MemberService memberService() {
return new MemberServiceImpl(memberRepository());
}
}
|
cs |
'BackEnd > Spring' 카테고리의 다른 글
[Spring] 스프링 예외처리 동작원리(feat. ControllerAdvice) (1) | 2024.02.25 |
---|---|
[Spring] @Transactional 제대로 알고 사용하기 (2) | 2022.10.03 |
댓글