IoC & DI

김우진·2021년 11월 3일
0

Spring & Spring Boot

목록 보기
1/9

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

정의

간략히 말하자면 프로그램의 제어 흐름 구조가 바뀌는 것(개발자 -> 프레임워크)
일반적인 구조는 모든 종류의 작업을 사용하는 쪽(개발자)에서 제어하는 구조

  • ex) main() 같은 프로그램이 다음에 사용할 오브젝트를 결정, 생성, 호출 작업 반복)

이에 반하여 IoC는 제어 흐름의 개념을 거꾸로 뒤집음 오브젝트는 자신이 사용할 오브젝트를 스스로 생성하거나 선택하지 않고 자신이 어떻게 만들어지고 어디서 사용되는 지 알 수 없다.

모든 제어 권한을 자신이 아닌 다른 대상에게 위임
프로그램 시작을 담당하는 main()같은 엔트리 포인트를 제외하면 모든 오브젝트는 이런 방식으로 위임받은 제어 권한을 갖는 특별한 오브젝트에 결정되고 만들어짐

Spring에서의 IOC

Spring에서는 일반적인 Java 객체를 new 키워드를 통해서 생성하고 이를 개발자가 관리하는 것이 아니라 Spring Container에게 모두 맡긴다.

Spring에서 IoC 구현 방법

DL(Dependency Lookup) - 의존성 검색

저장소에 저장되어 있는 빈에 접근하기 위해 개발자들이 컨테이너에서 제공하는 API를 이용하여 사용하고자 하는 빈을 검색하는 것

DI(Dependency Injection) - 의존성 주입

각 계층 사이, 각 클래스 사이에 필요로 하는 의존 관계를 컨테이너가 자동으로 연결
각 클래스 사이의 의존 관계를 빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결

이를 통해서 코드를 의존성으로 부터 격리시켜 코드 테스트에 용이하고, 코드를 확장하거나 변경 할 때 영향을 최소화 한다.

DL은 사용 시 컨테이너 종속성 증가, 그러므로 DI를 사용

DI 주입 방법

Setter Injection

인자가 없는 생성자나 인자가 없는 static factory 메소드가 bean을 인스턴스화 하기 위하여 호출된 후 bean의 setter 메소드를 호출하여 실체화 하는 방법
(set 방식으로 의존성을 주입하는 방식인 것 같다.)

장점

  • 객체를 생성 후 의존성 삽입 방식으로 구현 시에 좀 더 유연하게 사용
    단점
  • 세터를 통하여 필요한 값이 할당되기 전까지 객체를 사용할 수 없다.

Constructor Injection

생성자를 이용하여 클래스 사이의 의존 관계를 연결

장점

  • 생성자에 파라미터를 지정함으로 생성하고자하는 객체가 필요로 하는 것을 명확하게 표현
  • Setter메소드를 제공하지 않으므로 간단하게 필드를 불변 값으로 지정 가능

단점

  • 생성자의 파라미터가 많을 경우 코드가 복잡해 보일 수 있다.
  • 생성의 순서를 지켜야 한다.

Method Injection

Singleton 인스턴스와 Non Singleton 인스턴스의 의존 관계를 연결시킬 필요가 있을 경우 사용
많이 사용하지 않음

출처

  1. Spring docs : Spring core
  2. Spring boot docs : Spring Boot Current docs

0개의 댓글