개발 기록

211110 스프링 (IOC,DI) 본문

TIL

211110 스프링 (IOC,DI)

수염차 2021. 11. 10. 17:47

머리 안 돌아가고 공부 안 되는 날..

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가 가지고 있던 빈을 해당 객체에 DI 하고 있다는 의미의 아이콘

 

빈을 필요할때 그때그대 만드는 것이 아니라 한번 만들고 그걸 갖다 쓴다.

** 빈 ==싱글톤은 아님. 범위 관리 가능하지만 기본적으로 싱글톤

 

싱글톤 : 빈을 정의하고 싱글톤으로 지정되면 ioc 컨테이너는 해당 빈 정의에 의해 정의된 객체의 인스턴스 하나만 생성. 이 빈과 일치하는 모든 요청은 컨테이너에 의해 하나의 특정 빈 인스턴스가 반환되도록 한다. 

 

!!!! 내가 이해 한 것 : 스프링에서는 ioc컨테이너가 bean을 관리(생성,조회 등등)한다. 클래스에서 개발자가 객체를 직접 생성하지 않고 컨테이너가 bean에 등록된 객체를 찾아 생성자로 주입시켜준다. ioc컨테이너가 자동으로 객체를 생성해주어 사용할 수 있게 해준다.

@SpringBootApplication을 구현하고 있는 @ComponentScan이 컴포넌트 어노테이션이 붙은 클래스를 찾아 자동으로 bean으로 등록해준다. 

 


@Bean vs @Component

-실강때 튜터님이 둘의 차이점을 설명해주셨는데  bean은 외부에서 갖다쓸때 컴포넌트는 개발자가 작성할 수 있는것이라고 내가 메모를 제대로 못 한 것같아 다시 찾아봤다.

 

@Bean : 메소드 레벨에서 선언하며, 반환되는 객체를 개발자가 수동으로 빈으로 등록하는 어노테이션, 개발자가 컨트롤이 불가능한 외부 라이브러리를 빈으로 등록하고 싶을때.

@Component : 클래스 레벨에서 선언함으로써 스프링이 컴포넌트스캔을 하여 자동으로 빈을 찾고 등록하는 어노테이션, 개발자가 직접 컨트롤이 가능한 내부 클래스에 사용

 

 

출처

spring 공식문서

[스프링] IoC(Inversion of Control), DI(Dependency Injection), Spring Container, Bean 정리

Bean과 Component 차이

'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
Comments