[DI Framework] DI 프레임워크 개발

2022. 1. 18. 12:30Project/DI Framework

개발 동기

인프런에서 백기선님의 '더 자바: 코드를 조작하는 다양한 마법' 강의를 수강했다. 강의를 통해 어노테이션 프로세서, 바이트 코드 조작, 리플렉션 등에 대해 기본적인 지식을 습득할 수 있었다. 이 중에 리플렉션을 통해 간단하게 필드 주입 DI 프레임워크를 개발해보는 시간이 있었다. 필자는 스프링처럼 생성자 주입, 필드 주입까지 해보고 싶어 이 프로젝트를 시작하게 되었다.

스프링의 DI 방식

개발에 앞서 스프링의 DI 방식을 살펴보도록 하자. 스프링에서는 @Configuration의 @Bean이 선언된 메서드 또는 @Component가 선언된 클래스를 빈으로 등록한다. 필자도 이 방식을 채택하기로 했다.

 

  1. 빈을 저장하기 위한 컨텍스트를 생성한다. 컨텍스트에서 맵으로 빈을 관리한다.
  2. @ComponentScan이 선언된 자바 파일 경로를 포함한 하위 패키지를 모두 탐색하면서 @Component가 선언된 클래스를 찾는다.
  3. @Component가 선언된 클래스는 해당 클래스 타입으로 첫 글자를 소문자로 한 이름을 키로 갖는 인스턴스를 컨텍스트에 등록한다.
  4. @Configuration이 선언된 클래스는 해당 클래스도 빈으로 등록하고 @Bean이 선언된 메서드들도 빈으로 등록한다. 이때 메서드 이름이 키, 해당 메서드가 리턴하는 인스턴스를 값이 되어 컨텍스트에 등록한다.
  5. 이렇게 빈을 모두 등록하면 @Autowired가 선언된 생성자, 세터 메서드, 필드를 탐색한다. 
    1. 생성자 주입: 생성자 파라미터의 타입으로 컨텍스트에 등록된 빈을 조회하여 같은 타입을 찾아 주입한다.
    2. 세터 주입: 메서드 파라미터의 타입으로 컨텍스트에 등록된 빈을 조회하여 같은 타입을 찾아 주입한다.
    3. 필드 주입: 해당 멤버 변수의 타입으로 컨텍스트에 등록된 빈을 조회하여 같은 타입을 찾아 주입한다.
  6. 등록된 빈들은 모두 싱글턴으로 관리한다.

구현 방식

DI를 구현하지만 목적에 맞게 싱글턴 기능은 제외하고 개발하도록 한다. 그리고 @Autowired는 @Injectable(Nest의 냄새가...)로 바꿔서 개발한다.

 

완성 레포는 다음과 같다.

https://github.com/jeidiiy/my-di

 

GitHub - jeidiiy/my-di: 스프링의 DI 컨테이너를 직접 개발해보는 프로젝트입니다. 어노테이션 기반으

스프링의 DI 컨테이너를 직접 개발해보는 프로젝트입니다. 어노테이션 기반으로 빈을 등록하고 주입합니다. - GitHub - jeidiiy/my-di: 스프링의 DI 컨테이너를 직접 개발해보는 프로젝트입니다. 어노

github.com

 

'Project > DI Framework' 카테고리의 다른 글

[DI Framework] 어노테이션 개발  (0) 2022.01.18
[DI Framework] 개발 환경 세팅  (0) 2022.01.18