개발 기록
211110 스프링 (IOC,DI) 본문
머리 안 돌아가고 공부 안 되는 날..
IOC, DI, 빈은 알고 자자
ioc 컨테이너는 di(의존성 주입)라고도 한다. 객체가 생성되거나 반환된 후 객체 인스턴스에 설정된 속성을 통해서만 객체가 종속성( 즉, 함께 작업하는 다른 객체)을 정의하는 프로세스이다. 그런 다음 컨테이너는 빈을 생성할때 이러한 종속성을 주입한다.
>>!?! 공식문서 번역본이라 이해가 잘 안된다.. 될랑말랑 어렵다
그래서 블로그 참고참고 쉬운말로,,
DI란 객체를 직접 생성하는 것이 아니라 외부에서 생성한 후 주입 시켜주는 방식!
ex)
1. 클래스 안에서 new 라는 키워드를 통해 직접 생성해서 사용
class Sample{
private Apple apple = new Apple();
}
2. 샘플테스트 클래스에서 객체를 생성한 뒤 샘플클래스의 생성자로 객체를 주입시켜줌 여기서 샘플클래스가 객체의 제어권을 직접 갖지 않는다. 의존성 역전
class Sample{
private Apple apple;
public Sample(Apple apple){
this.apple = apple;
}
}
class SampleTest{
Apple apple = new Apple();
Sample sample = new Sample(apple);
}
*생성자 기반 종속성 주입
public class SimpleMovieLister {
// SimpleMovieLister에는 MovieFinder에 대한 종속성이 있다.
private final MovieFinder movieFinder;
// Spring 컨테이너가 MovieFinder를 주입할 수 있도록 생성자 생성
public SimpleMovieLister(MovieFinder movieFinder) {
this.movieFinder = movieFinder;
}
// 실제로 주입된 MovieFinder를 사용하는 비즈니스 로직은 생략...
}
*생성자 주입을 사용하여 필요한 RiskAssessorBean 을 얻는 Bean
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
}
// ...
}
*빈에 하나 이상의 생성자가 있는 경우 spring에서 사용할 생성자를 표시해야함 @Autowired.
@Service
public class MyAccountService implements AccountService {
private final RiskAssessor riskAssessor;
private final PrintStream out;
@Autowired
public MyAccountService(RiskAssessor riskAssessor) {
this.riskAssessor = riskAssessor;
this.out = System.out;
}
public MyAccountService(RiskAssessor riskAssessor, PrintStream out) {
this.riskAssessor = riskAssessor;
this.out = out;
}
// ...
}
**
bean이란 스프링이 제어권을 가지고 직접 만들고 관계를 부여하는 컴포넌트. 여기서 스프링이 컨트롤을 가져가므로 제어역전 (ioc, di)을 하게 됨.
빈을 필요할때 그때그대 만드는 것이 아니라 한번 만들고 그걸 갖다 쓴다.
** 빈 ==싱글톤은 아님. 범위 관리 가능하지만 기본적으로 싱글톤
싱글톤 : 빈을 정의하고 싱글톤으로 지정되면 ioc 컨테이너는 해당 빈 정의에 의해 정의된 객체의 인스턴스 하나만 생성. 이 빈과 일치하는 모든 요청은 컨테이너에 의해 하나의 특정 빈 인스턴스가 반환되도록 한다.
!!!! 내가 이해 한 것 : 스프링에서는 ioc컨테이너가 bean을 관리(생성,조회 등등)한다. 클래스에서 개발자가 객체를 직접 생성하지 않고 컨테이너가 bean에 등록된 객체를 찾아 생성자로 주입시켜준다. ioc컨테이너가 자동으로 객체를 생성해주어 사용할 수 있게 해준다.
@SpringBootApplication을 구현하고 있는 @ComponentScan이 컴포넌트 어노테이션이 붙은 클래스를 찾아 자동으로 bean으로 등록해준다.
@Bean vs @Component
-실강때 튜터님이 둘의 차이점을 설명해주셨는데 bean은 외부에서 갖다쓸때 컴포넌트는 개발자가 작성할 수 있는것이라고 내가 메모를 제대로 못 한 것같아 다시 찾아봤다.
@Bean : 메소드 레벨에서 선언하며, 반환되는 객체를 개발자가 수동으로 빈으로 등록하는 어노테이션, 개발자가 컨트롤이 불가능한 외부 라이브러리를 빈으로 등록하고 싶을때.
@Component : 클래스 레벨에서 선언함으로써 스프링이 컴포넌트스캔을 하여 자동으로 빈을 찾고 등록하는 어노테이션, 개발자가 직접 컨트롤이 가능한 내부 클래스에 사용
출처
[스프링] IoC(Inversion of Control), DI(Dependency Injection), Spring Container, Bean 정리
'TIL' 카테고리의 다른 글
211114 WIL (0) | 2021.11.15 |
---|---|
211111 TIL 스프링 (0) | 2021.11.12 |
211109 스프링4 (0) | 2021.11.09 |
211108 스프링3 (@RequestBody) (0) | 2021.11.08 |
211107 WIL (0) | 2021.11.07 |