본문 바로가기

Spring

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

제어의 역전(Inversion of Control)이란

  • 프로그램의 제어 흐름 구조가 뒤바뀌는 것
  • 일반적으로 프로그램의 흐름은 아래의 과정이 반복되는데 제어의 역전은 이런 제어 흐름의 개념을 거꾸로 뒤집는다. 즉 프로그램의 제어권이 개발자가 아닌 프레임워크에게 있는 것을 의미한다.
1. 프로그램이 시작되는 지점에서 다음에 사용할 오브젝트를 결정 
2. 결정한 오브젝트를 생성 
3. 만들어진 오브젝트에 있는 메소드를 호출 
4. 그 오브젝트 메소드 안에서 다음에 사용할 것을 결정하고 호출

의존성 주입(Dependency Injection)이란

  • 스프링 IoC 기능의 대표적인 동작원리로 제어의 역전(IoC)는 이 DI를 통해서 일어난다.
  • 객체를 직접 생성하지 않고 외부에서 생성하여 주입시켜주는 방식
  • 의존성 주입을 이용하면 주입받는 객체가 주입되는 객체의 정확한 클래스 타입을 알 필요가 없어지기 때문에 모듈간의 결합도가 낮아지고 응집도가 높아져 객체지향 설계 원칙(SOLID) 중 하나인 개방 폐쇄 원칙을 따르기 쉽게 도와준다.
개방 폐쇄 원칙
- 클래스나 모듈은 확장에는 열려 있어야 하고 변경에는 닫혀있어야 한다.

응집도
- 모듈 내부의 기능적인 응집 정도
- 응집도가 높다는 건 하나의 모듈, 클래스가 하나의 책임 또는 관심사에만 집중되어 있다는 뜻

결합도
- 하나의 오브젝트가 변경이 일어날 때 관계를 맺고 있는 다른 오브젝트에게 변화를 요구하는 정도
- 결합도가 낮다는 건 하나의 모듈에서 변경이 발생할 때 관계를 맺고 있는 다른 모듈에 끼지는 영향이 적다는 뜻

의존성 주입 방식

1. 생성자 주입 방식

스프링 빈 객체를 생성하기 전에 주입될 빈 객체를 찾아 주입한 후 생성하기 때문에 컴파일 단계에서 순환참조 오류를 찾을 수 있고 final 변수를 사용함으로써 스프링 빈 객체가 Null아님을 보장하고 예기치 못한 상황에 빈 객체가 수정될 위험을 방지할 수 있어 가장 권장하는 방식이다.

public class UserDao {

    private final ConnectionMaker connectionMaker;
    
    public UserDao(ConnectionMaker connectionMaker) {
    	this.conntectionMaker = connectionMaker
    }
    
}

 

생성자 주입 방식의 경우 아래와 같이 @RequiredArgsConstructor 어노테이션을 이용하여 쉽게 사용할 수 있다.

 

@RequiredArgsConstructor
public class UserDao {

    private final ConnectionMaker connectionMaker;
        
}

2. 필드 주입 방식

public class UserDao {

    @Autowired
    private ConnectionMaker connectionMaker;

}

3. 수정자 주입 방식

public class UserDao {

    private ConnectionMaker connectionMaker;
    
    public void setConnectionMaker(ConnectionMaker connectionMaker) {
    	this.connectionMaker = connectionMaker;
    }
    
}

용어 정리

빈(bean)

  • 스프링이 IoC방식으로 관리하는 오브젝트
  • 모든 오브젝트가 다 빈은 아니다. 스프링이 직접 생성과 제어를 담당하는 오브젝트만을 빈이라고 함

빈 팩토리(bean factory)

  • 스프링의 제어의 역전(IoC)를 담당하는 핵심 컨테이너
  • 빈을 등록하고, 생성하고, 조회하고 돌려주고, 그 외에 부가적인 빈을 관리하는 기능을 담당

애플리케이션 컨텍스트(application context)

  • 빈 팩토리를 확장한 IoC 컨테이너
  • 빈 팩토리라고 부를 때는 주로 빈의 생성과 제어의 관점에서 말하는 것이고 애플리케이션 컨텍스트라고 할 때는 스프링이 제공하는 애플리케이션 지원 기능을 모두 포함해서 부르는 것이다.

IoC 컨테이너

  • 제어의 역전 방식으로 빈을 관리한다는 의미에서 애플리케이션 컨텍스트나 빈 팩토리를 IoC 컨테이너라고도 한다. 즉 빈 팩토리과 애플리케이션 컨텍스트 그리고 IoC 컨테이너는 같은 개념이며 어떤 관점에서 보느냐에 따라 다르게 불린다.