라라리라

[Spring] 제어의 역전(IoC), 의존성 주입(DI) 본문

코딩/다이어리

[Spring] 제어의 역전(IoC), 의존성 주입(DI)

헤실 2024. 2. 8. 13:50
스프링Bean을 사용하지 않고, 간단한 도서관리 API의 구조를 만든다고 생각해보자.

 

BookService에서 BookMemoryRepository를 사용하기 위해 new BooKMemoryRepository를 선언하고 있다.

 


추가 요구사항을 구현하는 상상을 해보자..
이제 Memory가 아닌, MySql과 같은 DB를 사용해야한다.

기존에 사용하던 MemoryRepository를 주석처리하고, 새로 MySqlRepository를 선언하는 모습.

 

문제 |     Repository의 역할에 관련된 것만 바꾸고 싶은데,  BookService까지 바꿔야한다.

 

MemoryRepository를 사용하는 Service가 5000개라고 생각해보자 ..
Repository 변경을 위해서 5천번의 new MySqlRepository 선언을 해줘야한다!

 


Java Interface를 활용하면??

BookRepository Interface를 만들고, MySqlRepository와 MemoryRepository가 @Override를 통해 구현하였다.

 

문제 |    발전 했지만 여전히 아쉽다..

 

변경해야할 부분이 반으로 줄었지만, 여전히 Repository 변경을 위해서 Service를 수정해야한다.

 


스프링 컨테이너를 사용해보자

@Repository 어노테이션을 통해 Spring Bean으로 등록한 모습

 


스프링 컨테이너가 BookService를 대신 인스턴스화 하고, 그 때 알아서 BookRepository를 결정해준다.

 

스프링 컨테이너가 개발자 대신 MemoryRepository 혹은 SqlRepository를 선택한 후, BookService를 만들어준다. 
이러한 방식을 제어의 역전(IoC)라고 한다.

 

또한, 컨테이너가 BookService를 만들어 줄 때, MemoryRepository와 MysqlRepository중 하나를
선택해 넣어주는 과정을 의존성 주입(DI)라고 한다. 

만약, 둘 다 @Repository 어노테이션이 붙어있으면 어떤 Repository가 주입될까?

 

@Primary 어노테이션을 통해 우선권을 제어하는 모습

 

@Primary 어노테이션을 통해 우선권을 제어할 수 있다.

 

실제 @Primary 어노테이션을 MemoryRepository에 붙였다가, MySqlRepository에 붙였다가 변경해보면, 
BookService 코드 변경 없이 다른 Spring Bean이 사용됨을 확인할 수 있다.