내가 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
메타 코딩 유튜브
https://www.youtube.com/c/%EB%A9%94%ED%83%80%EC%BD%94%EB%94%A9