Spring이 제공하는 Container(DI container == IoC Container)를 통해서 관리되는 인스턴스이다.
Spring은 Container에 Bean 등록할 때 기본으로 싱글톤으로 등록한다.
즉, Bean으로 지정된 클래스는 Container에 서 1개의 인스턴스로만 존재할 수 있다. 유일하게 하나만 등록해서 공유한다는 뜻으로 이해하면 된다.
Bean 등록 방법에는 2가지가 있다.
컴포넌트 스캔과 자동 의존관계 설정
자바 코드로 직접 스프링 빈 등록하기
1) 컴포넌트 스캔과 자동 의존관계 설정
@Component를 포함하는 다음 애노테이션이 있으면 Bean으로 자동 등록된다.
스프링 팀에서는 생성자 주입 방식을 권하고 있다.
@RequiredArgsConstructor
@Controller
class UserController {
private final UserService userService; 생성자 자동주입
}
2) 직접 Bean 등록하기
@Configuration
public class SpringConfig {
@Bean
public UserRepository UserRepository() {
return new UserRepository();
}
}
의존성은 어떤 객체가 사용해야 할 객체라고 할 수 있고, 이것을 직접 new 등을 써서 만들어 쓰면 의존성을 자기가 직접 만들어 쓴다고 할 수 있다. 일반적으로 의존성은 직접 만들어 쓰는 것을 의미한다.
@Service
class UserService {
private final UserRepository UserRepository =
new UserRepository();
}
위의 코드와 달리 직접적으로 의존성을 만들지 않고, 외부에서 의존성을 가져오는 경우를 제어권 역전이 일어났다고 말한다.
DI는 IoC의 일종이라고 생각하면 된다.