[Spring] DI (Dependency Injection)

Minit88·2023년 4월 5일
0

Spring

목록 보기
4/16
post-thumbnail

DI란 ?

DI는 IoC란 원칙을 구현하기 위해서 사용되는 방법중 하나이다. DI는 의존성 주입이라고 표현이 되며, 의존성은 객체간의 의존성을 나타낸다.

밑의 예제를 통해 의존성 관계를 알아보면,
MemberService 라는 객체에서 MemberRepository 라는 객체에 의존성을 가지고 있다. 참조하고 있다라고 이해하면 편하다.

위 코드는 일반적인 자바에서의 생성자를 통한 의존관계 주입이고, 객체간의 결합도가 느슨하지 못해 객체간의 결합도가 상당히 높다.

객체간의 결합도가 높게되면, 예를 들어 MemberRepository 라는 객체를 다른 MockRepository라는 객체로 교체해야 하는 경우, 직접 코드를 변경해야 하는 상황이 발생하게 된다.

즉, 유지보수에 용이하지 못하게 된다.

POJO 스프링에서는 이 문제를 해결한 다양한 DI 방법을 제공한다.

  • 스프링 컨테이너
  • Component

등이 존재한다.

이 게시물에서는 스프링 컨테이너와 Component에 대해 소개하려고 한다.

스프링 컨테이너(자바 애너테이션)

스프링 컨테이너에 대해 알아보기 전에 스프링 컨테이너의 구성요소인 빈에 대해 먼저 알아보자

bean

스프링 컨테이너에 의해 관리되는 재사용 소프트웨어 컴포넌트이다.

  • bean은 인스턴스화된 객체를 의미
  • 스프링 컨테이너에 등록된 객체를 스프링 빈이라고 한다.
  • @bean이 적힌 메서드를 모두 호출해서 반환된 객체를 스프링 컨테이너에 등록
  • 빈은 클래스의 등록정보, 게터/세터 메서드를 포함
  • 빈은 컨테이너에 사용되는 설정 메타데이터로 생성
  • 설정 메타데이터
    • XML또는 자바 에너테이션, 자바 코드로 표현
    • 컨테이너 명령과 인스턴스화,설정,조립할 객체를 정의

스프링 컨테이너

스프링 컨테이너는 ApplicationContext라고 하고, 인터페이스로 구현되어 있다.


위 그림처럼 스프링 컨테이너는 객체들을 담고 있는 모습으로 나타나져 있다. 그림에서 유추해볼 수 있는 것 처럼 컨테이너들은 객체들간의 의존성 주입을 관리해주는 역할을 한다. 즉, 서로 다른 빈을 연결해 애플리케이션의 빈을 연결하는 역할을 한다.

즉 컨테이너의 의미는 다음과 같이 해석된다.

  • 컨테이너는 먼저 객체를 생성하고 객체를 서로 연결
  • 객체를 설정하는 단계를 지나 마지막으로 생명주기 전반을 관리
  • 컨테이너는 객체의 의존성을 확인해 생성한 뒤 적절한 객체에 의존성을 주입
  • 스프링은 스프링 컨테이너를 통해 객체를 관리
  • 스프링 컨테이너에서 관리되는 객체를 빈이라고 한다.

BeanDefinition

스프링은 다양한 설정 형식을 BeanDefinition이라는 추상화 덕분에 지원할 수 있다.

  • Bean은 BeanDefinition으로 정의되고 BeanDefiniton에 따라서 활용하는 방법이 달라지게 된다.
  • BeanDefinition(빈 설정 메타정보)
    • 속성에 따라 컨테이너가 Bean을 어떻게 생성하고 관리할지 결정
    • @Bean or <bean> 당 각 1개씩 메타 정보가 생성

Bean Scope

  • 특정 bean 정의에서 생성된 객체에 연결할 의존성 및 구성 값뿐만 아니라 특정 bean 정의에서 생성된 개체의 범위도 제어할 수 있다.

스프링 컨테이너 생성과정

설정 방식은 XML,java기반의 애너테이션 기반 이 두가지가 존재한다.

1. 스프링 컨테이너 생성

ApplicationContext applicationContext = new AnnotationConfigApplicationContext(AppConfig.class);

  • ApplicationContext를 스프링 컨테이너라고 한다.
  • ApplicationContext는 인터페이스이다.
  • 자바 설정 클래스를 기반으로 스프링 컨테이너를 만들었다.

2. 스프링 컨테이너 생성 호출 시 생성과정

(1) 스프링 컨테이너 생성

  • 스프링 컨테이너를 생성할 때 설정 클래스(AppConfig.class)를 지정해야 한다.

(2) 스프링 빈 등록

  • 스프링 컨테이너는 파라미터로 넘어온 설정 클래스 정보를 사용해서 스프링 빈을 등록한다.
  • 빈 이름은 메서드 이름을 사용한다
  • 빈 이름을 직접 부여가 가능하다
    • @Bean(name="memeberService2")
    • 빈 이름은 항상 다른 이름을 부여해야 한다. 같은 이름을 부여하면 , 다른 빈이 무시되거나 기존 빈을 덮어버리게 된다.

(3) 스프링 빈 의존관계 설정 - 준비

(4) 스프링 빈 의존관계 설정 - 완료

🎓Reference

스프링 컨테이너 생성과정

profile
" To be BE "

0개의 댓글