[스프링] 제어의 역전(IOC)이란?
스프링의 핵심 개념인
제어의 역전(IOC)에 대해서 알아보겠다.
제어의 역전(Inversion of Control)
제어(Control)란 무엇일까?
아래 코드를 살펴보자.
public class A {
B b = new B(); // B 객체 생성
}
1. 생성할 권리
new 연산자로 객체 B를 생성했다. 이는 생성할 권리이다.
2. 접근할 권리
A클래스는 B객체가 저장된 Heap 메모리 주소를 b 참조변수(멤버변수)로 갖는다. 고로, A 클래스의 객체는 B객체에 접근할 권리를 갖는다.
이렇듯,
생성할 권리와 접근할 권리를 통틀어
'제어(Control)'이라 부른다.
A는 B를 생성하고 접근할 권리를 갖는다.
그러나
여기서 한 가지 문제점이 발생한다.
B는 오로지 A가 있어야 존재하고 A만 접근 가능하다. 만약 A가 문제 생긴다면 B는 존재하지 않는다. A와 B의 제어를 가져가 버리면 A와B의 결합도는 강해지게 되고 A의 문제는 B로 전이된다.
이렇듯,
결합도가 강해지면 유지보수가 힘들어진다.
객체지향설계는 모듈 간 결합도를
최대한 느슨하게 유지해야 한다.
팩토리 클래스(Factory Class)
팩토리 클래스(Factory Class)는 '제어(Control)'를
클래스로부터 분리시키는 역할을 한다.
팩토리 클래스가 B 객체를 생성한다.
만약 A가 B에 접근하려면
팩토리클래스에게 주소만 받으면 된다.
즉, 제어(Control)가 팩토리클래스에게
넘어간 것이다.
예를 들어보자
컴퓨터가 A사 프린터와 직접적으로
모든 것이 연결되어 있다면
B사 프린터와 C사 프린터는 사용하지 못한다.
만약
A사 프린터가 문제가 생기면
컴퓨터는 출력을 하지 못한다.
컴퓨터와 프린터 사이에
프린트 드라이버가 있으면 달라진다.
프린트 드라이버는
회사 별 프린터 객체와 로직을 갖는다.
그리고
컴퓨터에 맞는 프린터 주소를
반환하여 접근하게 한다.
A가 문제 있으면 B로
B가 문제 있으면 C를 반환한다.
이와 같이
제어(Control)를 따로 분리시키면
컴퓨터와 프린터 사이의
문제는 전이되지 않아
객체 간 결합도가 느슨해지는 것이다.
작은 규모 프로그램은 팩토리 클래스로
처리가 되지만 프로그램 규모가 커지면
제어(Control)를 책임질 거대한 시스템이 필요하다.
그것이 바로, FrameWork이다.
개발자가 new 연산자를 이용하여
객체를 생성하지 않아도
개발자가 팩토리 클래스를 만들지 않아도
프레임워크가 알아서
객체를 생성하고 주소를 반환하는 시스템이
스프링 프레임워크다.
이렇듯, 제어(Controll)가 개발자에서
프레임워크로 넘어갔다고 하여
'제어의 역전(IOC)'라 표현하게 된 것이다.