스프링 IoC 컨테이너와 여기에 Bean 객체를 등록하는 방법을 알아보겠습니다.
스프링 IoC 컨테이너
스프링에서는 객체를 생성하여 이를 담을 그릇이 필요한데 이러한 그릇을 컨테이너라고 합니다.
객체(부품)를 조립할 때 작은 객체부터 큰 객체 순으로 조립을 해나간다. 작은 객체끼리 결합 -> 더 큰 객체와 결합 -> ... 이런 순으로
부품 조립 순서라면 이 순서이다.
객체를 생성할 때는 일체형과 결합형이 있습니다.
일체형에서는 다음과 같은 순서입니다.
A 객체를 만들 때 B를 만들고 B를 만들 때 C를 만들고 ... 이러한 과정입니다.
스프링에서는 객체를 결합형으로 만듭니다.
결합형에서는 순서는 다음과 같습니다.
객체가 생성되고 결합되는 순서는 D -> C -> B -> A 순으로 역순입니다.
이렇게 역순으로 생성되는 객체를 담을 그릇이 필요한데 이것이 바로 IoC(Inversion of Control) 컨테이너입니다.
Bean 객체를 스프링 IoC 컨테이너에 등록하기
스프링 IoC 컨테이너에 Bean 객체를 왜 등록할까요?
저번 포스팅에서 @AutoWired를 통해 DI를 했었는데요.
아무 객체나 DI를 할 수 있는 것이 아니라 스프링 IoC 컨테이너에 등록되어 있는 Bean 객체만 DI를 할 수 있습니다.
이를 위해 Bean 객체를 IoC 컨테이너에 등록하는 것입니다.
IoC 컨테이너에 Bean 객체를 등록하는 방법은 두 가지가 있습니다.
(xml 방법까지 포함하면 세 가지라고 볼 수 있는데 현재는 나머지 두 방식이 많이 사용되니 나중에 다뤄보겠습니다)
1. @Component 방식으로 Bean 객체 등록하기
@Component
public class Student {
private String name;
private int age;
public Student() {}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
}
IoC 컨테이너에 Bean 객체를 등록하고 싶은 클래스에 @Component를 붙여줍니다.
그런데 @Component를 붙인다고 해서 IoC 컨테이너에 등록되는데 어떠한 주체가 @Component가 붙어있는 클래스를 Bean 객체로 등록시키는 것일까요?
바로 @ComponentScan입니다.
@ComponentScan은 @Component가 붙은 클래스들을 찾아다니며 발견하면 IoC 컨테이너에 Bean 객체로 등록합니다.
그렇다고 모든 클래스를 돌아다니는 것은 아니고 지정된 패키지 경로만 돌아다니며 스캔합니다.
사실 @Component 뿐만 아니라 @Service, @Controller, @Repository, @Configuration을 모두 찾습니다.
@Service는 서비스 클래스에 붙일 수 있습니다. 물론 @Component를 붙여도 되지만 @Service가 붙으면 해당 클래스가 어떠한 역할을 하는 클래스인지 쉽게 알 수 있기에 가능하면 해당 업무에 맞는 어노테이션을 붙입니다.
@Controller는 컨트롤러 클래스에 붙입니다.
@Repository는 DAO 인터페이스를 구현하는 구현부 클래스에 붙입니다.
@Configuration은 @Bean을 구현하는 클래스에 붙입니다.
2. @Bean 방식으로 Bean 객체 등록하기
@Bean 방식은 @Configuration이 붙어있는 클래스에서 사용가능합니다.
@Configuration
public class StudentDIConfig {
@Bean
public Student student() { // student은 함수명으로 보면 안된다. 명사형인 이유는 IoC 컨테이너에 담겨질 때 부여되는 이름이라 생각하자.
return new Student(); // 리턴하는 객체는 IoC 컨테이너에 담긴다.
}
}
위 코드는 아래와 같이 동작합니다.
1. @ComponentScan이 @Configuration을 찾습니다.
2. @Bean이 붙은 메서드를 찾습니다.
3. 해당 메서드에서 리턴되는 객체는 IoC 컨테이너에 Bean 객체로 담긴다.
그런데 소스코드를 보면 함수명은 보통 동사형(getNoticeCount, getStudentName 등)으로 시작되는데 여기서는 명사형입니다.
이유는 리턴되는 객체가 IoC 컨테이너에 담겨질 때 해당 '명사'로 부여되면서 담기기 때문에 명사형으로 작성합니다.
위에서 두 가지 방법을 통해 Bean 객체를 IoC 컨테이너에 담아 보았습니다.
이렇게 담긴 Bean 객체는 서로 간에 DI가 가능합니다.
'Programming > Spring Framework' 카테고리의 다른 글
[스프링부트] fetch api post 전송 방법 (0) | 2021.05.13 |
---|---|
[스프링부트] @JsonNaming, @JsonProperty는 언제 사용할까? (1) | 2021.05.12 |
[스프링] DI(Dependency Injection) 의존성 주입에 대해 알아보자 (0) | 2021.01.09 |
[스프링부트] postman을 활용한 간단한 RESTful 웹 서비스 만들기 - POST/DELETE 요청 (0) | 2019.09.22 |
[스프링부트] postman을 활용한 간단한 RESTful 웹 서비스 만들기 - GET 요청 (0) | 2019.09.22 |