Loading...

Spring / / 2022. 2. 27. 15:02

스프링 9강. IoC 컨테이너 DI(Dependency Injection)

반응형

내가 new 한 게 아닌 스프링이 new 한 것을

주소를 보관하는 컨테이너를

IoC 컨테이너라고 했다.

 

Dog 파일을 하나 만들었는데

이 Dog 클래스는 메모리에 뜰 수 있을까?

 

내가 직접 new 해주거나

static으로 만들지 않는 이상 메모리에 뜰 수 없다.

package site.metacoding.first;

import org.springframework.stereotype.Component;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
public class Dog {
    // 내가 new하지 않는 이상 메모리에 뜨지 않음, static으로 설정하면 메모리에 뜨겠당
    private String name = "푸들";
}

 

이때 @Component 어노테이션을 사용해준다.

package site.metacoding.first;

import org.springframework.stereotype.Component;

import lombok.Data;
import lombok.Getter;
import lombok.Setter;

@Getter
@Setter
@Component // 특별한 목적없이 IoC에 등록하고 싶을 때 사용
public class Dog {
    // 내가 new하지 않는 이상 메모리에 뜨지 않음, static으로 설정하면 메모리에 뜨겠당
    private String name = "푸들";

    public Dog() {
        System.out.println("Dog가 IoC 컨테이너에 등록되었어요.");
    }
}

 

하지만 @Component의 단점은

IoC로 띄웠을 때

하나밖에 new 할 수 없다.

 

강아지 10마리가 만들고 싶을 땐

직접 10번 new 해주어야 한다.

 

IoC 컨테이너는 싱글톤 기법으로

관리되고 있기 때문이다.

 

최초에 서버 시작했을 때 한 번만 띄운다.

 


 

UserController와 PostContoller는

디스패쳐 서블릿이 관리하기 때문에

내가 관여하지 않아도 된다.

 

근데 이 Dog는 디스패쳐 서블릿이 관리하지 않기 때문에

내가 사용하고 싶을 때 IoC 컨테이너에서

가져와서 사용해야 한다.

 

 

UserController에서 강아지를 사용해보자.

 

이때 Dog 클래스에 @Component 어노테이션은

잠깐 주석 처리해주자.

 

사용하기 위해 UserController의 생성자에

Dog d 강아지를 매개변수로 받아와야 한다.

 

그러면 UserController는 new 될 수 있을까?

 

Dog는 내가 직접 new 해주어야 하기 때문에

오류가 날 것이다.

Dog를 찾지 못해서이다.

 

왜냐면 스프링이 Dog를 IoC에서 찾고 있기 때문이다.

 

다시 Dog 클래스에 @Component 어노테이션을 붙여주면

오류가 나지 않는다.

 

이것을 DI(Dependency Injection; 의존성 주입)라고 한다.

 

IoC 컨테이너에 의존해서

IoC에 있으니까 주입해 줄 수 있는 것이다.

 

UserContoller가 Dog를 사용하고 싶으면

컴포지션 해주어야 하는데

이때 IoC에서 찾아와서 넣어주는 것이다.

 

컨트롤러가 의존하는 것을 주입해준다 하여

의존성 주입이라고 한다.

 

 

무조건 생성자에 주입한다고 해서 다 주입이 가능한 게 아니라

IoC 컨테이너에 존재하는 것만 주입이 가능하다.

 


그렇다면 톰캣이 만들어주는 request, response 객체는 어디서 찾을까?

이 객체들은 디스패쳐 서블릿이 가지고 있다.

 

컨트롤러를 new 해주는 게 디스패쳐 서블릿인데

자신이 request와 response를 가지고 있기 때문에 주입이 가능하다.

이때는 IoC에서 찾아오는 것이 아닌

자기가 들고 있는 것을 넘겨주는 것이다.

이것 또한 DI이다.

 

이 request는 IoC에 뜬 게 아닌

디스패쳐 서블릿이 톰캣이 만들어준 request를 가지고 있었기 때문에

가능한 것이다.

 

만약 Dog에서 request를 주입하려고 하면 불가능할까?

 

가능하다.

오류가 나지 않는다.

 

request, response 객체도

IoC 컨테이너에서 관리되고 있기 때문이다.

 

그렇다고 디스패쳐 서블릿이 안 가지고 있는 것은 아니다.

IoC 컨테이너도 들고 있는 것뿐이다.

 

 

 

 

[출처]

https://cafe.naver.com/metacoding

 

메타코딩 : 네이버 카페

코린이들의 궁금증

cafe.naver.com


메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9

 

메타코딩

문의사항 : getinthere@naver.com 인스타그램 : https://www.instagram.com/meta4pm 깃헙 : https://github.com/codingspecialist 유료강좌 : https://www.easyupclass.com

www.youtube.com

 

반응형