[부트캠프] TIL - IoC Container, Bean
DI (의존성 주입)을 사용하기 위해서는 객체의 생성이 우선되어야 합니다, 이것을 Spring 프레임워크가 필요한
객체를 생성하고 관리하는 역할을 대신 수행해줍니다.
Bean : Spring이 관리하는 객체
Spring IoC Container : 'Bean"을 모아둔 컨테이너
✔ IoC(Inversion Of Control)이 뭘까?
제어의 역전이다.
우리가 사용하던 자바 프로그램에서는 프로그래머가 직접 객체를 생성하고, 원하는 클래스 내에서 다른 객체를 생성해 사용했다. 이 경우 프로그래머가 객체의 생명 주기를 관리하고 있다.
제어의 역전이 일어나면, 프로그래머가 아닌 다른 무언가가 관리를 위임하게 된다. 프로그래머의 제어 권한을 다른 주체에게 넘기는 것을 IoC(제어의 역전)라고 한다. Spring은 직접 자바 객체를 생성하고 관리하기 때문에 이 관리 위임 주체는 Spring이 된다.
Spring이 생성하고 관리하는 자바 객체를 Bean이라고 한다.
Spring에서 Bean을 등록하는 방법 -> @Component 어노테이션을 Bean으로 등록하고자 하는 클래스 위에 설정.
@Controller, @Service, @Repository는 @Component를 포함하고 있으므로 자동으로 스프링 Bean으로 등록이됨.
@Component
public class MemoService(){}
Spring 서버 실행시 IoC 컨테이너에 Bean을 저장해줍니다. 이때 bean의 이름은
앞글자를 소문자로 하여 저장.
ex) public class MemoService -> memoService
Spring Bean 주입 방법
1. @Autowired
필요로 하는 필드 위에 @Autowired 어노테이션을 붙입니다.
@Component
public class MemoService {
@Autowired
private MemoRepository memoRepository;
// ...
}
bean을 주입할 때 사용할 메소드 위에 @Autowired
@Component
public class MemoService {
private final MemoRepository memoRepository;
@Autowired
public MemoService(MemoRepository memoRepository) {
this.memoRepository = memoRepository;
}
// ...
}
객체의 불변성 확보가 가능하기 때문에 일반적으로 생성자를 사용한 DI를 사용합니다,.
2.ApplicationContext
- ApplicationContext는 BeanFactory등을 상속하여 기능을 확장한 Container 입니다.
- BeanFactory는 ‘Bean’ 의 생성, 관계설정등의 제어를 담당하는 IoC 객체입니다.
- 스프링 IoC 컨테이너에서 ‘Bean’을 수동으로 가져오는 방법
@Component
public class MemoService {
private final MemoRepository memoRepository;
public MemoService(ApplicationContext context) {
// 1.'Bean' 이름으로 가져오기
MemoRepository memoRepository = (MemoRepository) context.getBean("memoRepository");
// 2.'Bean' 클래스 형식으로 가져오기
// MemoRepository memoRepository = context.getBean(MemoRepository.class);
this.memoRepository = memoRepository;
}
...
}