전에 스프링 빈 등록과 관련된 글을 작성한 적이 있다.
오늘은 그때 사용한 컴포넌트에 대한 내용을 적어보려 한다.
@Component
해당 클래스를 스프링 빈으로 등록한다.
@ComponentScan
원래는 설정 파일을 xml에 다 작성해야 했는데, 스프링과 스프링부트는 xml을 최소화 하고자 했다.
@ComponentScan은 @Component를 스캔하여 빈으로 등록해주는 역할을 한다.
@Autowired
스프링 컨테이너에서 필요한 타입을 찾아 의존성을 주입해준다.
import org.springframework.stereotype.Component;
@Component
public class Person {
House house;
public Person(House house) {
this.house = house;
System.out.println(house.getName() + " 집을 샀습니다.");
}
}
import org.springframework.stereotype.Component;
@Component
public class House {
private String name;
public House() {
this.name = "Default House";
System.out.println("Created House Bean");
}
public String getName() {
return name;
}
}
위 코드에 대한 3가지 질문과 답변
1. 누가 먼저 스프링 빈이 되나
House가 먼저 된다. House가 있어야 Person 생성이 가능하기 때문
2. 스프링은 뭘 보고 Person이 필요한 House를 넣어줬을까?
컴포넌트가 있는 클래스에 생성자가 하나밖에 없으면, @Autowired가 숨어있음.
스프링이 생성자에 있는 House라는 객체 타입을 보고 넣어줌.
스프링 빈은 타입으로 구별된다.
3. 우린 스프링한테 House 객체가 필요하니까 넣어줘 라고 얘기한 적이 있나?
생성자가 한개일 때, @Autowired가 생략되어 있기 때문에, 스프링에 얘기했다고 볼 수 있음.
결론
@Component @ComponentScan @Autowired를 IoC와 DI로 설명해 본다면?
IoC는 객체의 제어권을 스프링에 위임하는 것인데, @Component를 사용하여 스프링 빈으로 등록하여 관리한다. @ComponentScan은 이러한 @Component들을 찾는 역할을 하며, 이때 DI가 필요한 경우, @Autowired를 사용하여, 의존성을 주입해준다.
'Spring' 카테고리의 다른 글
왜 DTO를 사용하는가? (1) | 2024.07.22 |
---|---|
Gradle Dependecies (0) | 2024.07.19 |
Web서버 vs WAS (1) | 2024.07.16 |
[스프링 입문] AOP (0) | 2023.01.21 |
[스프링 입문] JPA (0) | 2023.01.21 |