Bean 직접 등록 방법(DI/IoC)

홍헌·2023년 10월 30일
0

spring

목록 보기
5/7

project : gradle
spring boot version : 3.1.4
language : java
IDE : intelliJ


spring boot을 처음 배우면서 ApplicationContext에 직접 등록하는 방법과 Annotation으로 자동으로 등록하는 방법을 배웠었다. 그런데 아직까진 직접 등록하는 방법을 사용할 일이 거의 없었기도 하고, annotation으로 하면 간편하기도 해서 사용할 일이 없었다. 그런데 인강을 듣다 **proxy(proxy pattern/decorator pattern)**이용 방법을 배우다 꼭 필요하겠다 싶은 생각이 들어 정리해놓기로 했다. 그리고 이를 구현하는 원리이자 Spring에서 꼭 알고 있어야 하는 개념인 DI패턴과 IoC에 대해서 간단하게 정리하고자 한다.

1. ApplicationContext에 직접 등록하는 방법 예시

우선 controller,service,repository로 사용할 class파일과 configuration으로 사용할 class파일들을 미리 만들어 놨다.

이후 controller,service,repository들을 configuration 파일에 @Bean으로 등록하고 의존관계를 설정해준다.

마지막으로 main이 존재하는 클래스에서 configuration파일을 등록해준다.

*Controller 클래스

*Config파일


*실행파일 config등록


2. Annotation으로 자동으로 등록

Annotation은 길게 설명할 것 없이
@Controller/@Service/@Repository/@Bean/@Component/@Import 등등 자신이 등록해야하는 객체에 맞게 선언해주면 된다.


3. DI(Dependency Injection)패턴 - 의존성 주입

Annotation만 있으면 자동으로 편하게 등록할 수 있는데 왜 굳이 직접등록할까? 이를 알려면 DI패턴과 IoC를 알고 가면 편하다. 우선 개념을 짧게 설명하자면 하나의 객체가 다른 하나의 객체를 의존하고 있을 때, 의존하고 있는 객체를 직접 생성하는 것이 아닌 다른 객체가 생성해서 주입해주는 것이다. 1번에서 나왔던 코드의 구조를 가지고 생각해보자.

OrderControllerV2는 필드에 있는 OrderServiceV2를 사용해야 한다. 사용한다는 의미는 당연히 객체를 생성해야한다는 뜻인데 Configuration파일에 OrderServiceV2를 넣어줄 것이라고 등록했다. 결국 Configuration에 등록된대로 ApplicationContext가 대신 OrderServiceV2를 만들어서 주입해준다. 이렇게 다른 객체가 또 하나의 다른 객체를 생성해서 넣어주는 것을 DI라고 하는 것이다.


4. IoC(Inversion of Control) - 제어의 역전

제어의 역전은 위의 내용에서 다 나왔다고 봐도 무방하다. 객체 생성을 개발자가 직접 하는 것이 아니라 프레임워크가 대신 해주는 것이다. 위에서 DI를 해줄 때 ApplicationContext 대신 해준다고 했는데 그 말이 IoC의 개념이다. 혹자는 1번처럼 다 Configuration에 등록했는데 그럼 개발자가 직접 관리하는 것 아니냐고 할 수 있다.(내 얘기다. 맨 처음 들었을 때 그랬다.) 만약에 Configuration이 없고 OrderControllerV2에 있는 Service에 의존 관계가 있었으면 어떻게 됐을까? 요청이 들어와서 해당되는 메소드의 어느 시점에 직접 new해서 새로운 객체를 생성해 줬을 것이다. 하지만 1번과 같이 ApplicationContext가 관리할 수 있게 등록함으로써 내가 정확히 어느 시점에 만들어야겠다해서 만드는 것이 아니라 알아서 만들어 주는 것이다.


5. 직접 등록해야하는 경우

그래서 왜 굳이 직접 등록해줘야 하는 걸까? 만약 OrderServiceV2가 인터페이스였고 구현체가 아래와 같이 두 개였으면 어떻게 될까?

어떤 걸 넣어줘야할지 ApplicationContext에 알려줘야 한다. 다른 사례들도 있을 수 있겠지만 간단하게 이런 식으로 직접 알려줘야할 때 쓴다고 생각하면 좋을 것 같다.

0개의 댓글