1. IoC (Inversior of Controll)
IoC를 구글링 해보면 반복적으로 나오는 말이 제어의 역전이다. 이 제어의 역전은 어떤 것을 의미할까?
자바를 포함한 객체 지향 언어에는 Class, Object, Instance가 있다.
Class는 쉽게 설계도, Object는 실체화가 가능한 것, Instance는 실체화된 것으로 비유할 수 있다.
Object를 직접 new를 하여 Heap 메모리에 올리게 되는데 IoC는 Object들을 스캔하여 Heap 메모리에 등록한다.
즉 개발자가 직접 하는 일을 대신 해준다는 것이다.
조금 더 자세하기 얘기해보자!!
어떤 프로그램에서 클라이언트 객체가 스스로 필요한 서버 객체를 생성하고 연결하고 실행했다고 가정하자.
이 말은 객체가 프로그램의 제어 흐름을 스스로 관리한다는 것을 의미한다.
그런데 만약 이러한 프로그램의 제어 흐름을 관리하는 객체가 있다면 어떨까?
스프링 애플리케이션은 오브젝트의 생성과 의존 관계 설정, 사용, 제거 등의 작업을 애플리케이션 코드 대신 스프링 컨테이너가 담당한다.
즉 스프링 컨테이너가 프로그램의 제어 흐름을 관리한다는 이야기이다.
정리하자면 프로그램의 제어 흐름을 직접 제어하는 것이 아니라 외부에서 관리하는 것을 IoC라고 하며 스프링 컨테이너를 다른 말로 IoC 컨테이너라고도 한다.
2. DI (Dependency Injection)
DI는 의존 관계 주입이라고 한다. 의존 관계란 무엇일까?
"A가 B를 의존한다."라는 말은 의존하는 대상 B가 변하면 그것이 A에 영향을 미친다는 것이다.
아래 예시를 본다면 Sing이라는 클래스는 Voice라는 클래스에 의존한다. Voice가 변경되었을 때 Sing이라는 클래스도 변화한다.
즉 Voice가 Sing에 영향을 미쳤기 때문에 Sing은 Voice를 의존한다고 할 수 있다.
Class Sing {
private Voice voice;
public Sing() {
Voice = new Voice();
}
}
스프링은 애플리케이션 실행 시점(런타임)에 외부에서 실체 구현 객체를 생성하고 클라이언트에 전달해서 클라이언트와 서버의 실제 의존관계를 형성하는데, 이런 형성하는 것을 의존관계 주입(DI)라고 한다.
객체 인스턴스를 생성하고, 그 참조값을 전달하여 연결되며, 의존 관계 주입을 사용하면 클라이언트쪽 코드를 변경하지 않고, 클라이언트가 호출하는 대상의 인스턴스를 변경할 수 있다.
그리고 의존 관계 주입을 사용하면 정적인 클래스 의존관계를 변경하지 않고, 동적인 객체 인스턴스 의존관계를 쉽게 변경할 수 있다는 장점도 있다.
그러면 이 DI를 사용하면 어떤 장점이 있는지 알아보자
1) 의존성이 줄어든다.
의존한다는 것은 그 의존대상의 변화에 취약하다는 것이다. 따라서 DI로 구현되었다면 주입 받는 대상이 변하더라도 그 구현 자체를 수정할 일이 없거나 줄어들게 된다. 앞서 말한 클라이언트쪽 코드를 변경하지 않고 호출하는 대상의 인스턴스를 변경할 수 있다는 말과 비슷하다.
2) 재사용성 증가
의존 관계를 분리하면 다른 클래스에서 분리한 클래스를 재사용할 수 있기 때문에 재사용성이 증가한다.
3) 테스트의 편리성
분리한 의존 관계 클래스를 각각 테스트 할 수 있기 때문에 테스트가 편리해진다.
4) 가독성 증가
의존 관계를 분리했기 때문에 자연스렇게 가독성을 높일 수 있다.