[Spring] IoC와 DI (1)

Noah·2021년 12월 31일
0

Spring

목록 보기
1/8
post-thumbnail

Inversion of control

Java 객체를 개발자가 생성하여 직접 관리하는 것이 아닌 Spring Container에 객체 관리를 맡기는 제어 권한이 넘어감을 의미한다. 따라서 이것을 제어 역전 현상이라고 부른다. 그리고 이 container에 의해 관리되는 객체들은 Bean이라고 불린다.

그렇다면 왜 개발자가 객체를 직접 관리하지 않고 프레임워크에 의해 관리를 받는 이런 수동적인 방식을 택했는 가에 대해 좀 더 생각해 볼 필요가 있다.

사실 근본적인 이유는 개발할 때 편리함을 위해서 일 것이다. 프레임워크란 그러기 위해 존재하는 것이니까 하지만 단지 편리함 만을 위한 것일까? 나는 그렇지 않다고 생각한다.

기본적으로 자바 언어는 객체지향 프로그래밍을 지향한다. 올바른 객체지향 프로그래밍이란 각 객체마다 자기의 역할과 책임을 온전히 다하며 서로 협력하면서도 변경에 유연한 프로그래밍 방식이라 할 수 있다. 즉 A 객체의 변경이 일어나도 B 객체에 주는 영향을 최소화하도록 프로그래밍해야 한다는 것이다.

하지만 인간은 항상 실수를 한다. 그리고 우리 개발자도 마찬가지로 인간이다. 항상 좋은 코드를 쓸 수 없다. 나 혼자 작업한다면 그나마 괜찮겠지만 우리 모두는 협업을 통해 애플리케이션을 완성한다. 여기서 IoC가 말한다.

"얘들아, 앞으로 객체의 생성과 관리는 모두 내가 할 거야. 너희 모두 제각각 직접 관리하니까 너무 얽히고설키는구나. 대신 너희가 해줘야 할 일이 하나 있어. 어떤 객체를 내가 관리해야 할지 표시만 해주라. 그리고 그 객체에 필요한 것도 내가 '주입'시켜줄게! 너는 그 객체가 해야 할 비즈니스 로직에만 집중을 해!"



Dependency Injection

어떤 객체 A가 B를 필요로 할 때 B는 객체 A에 의존되어 있다고 하며 이때 B를 외부에서 주입하는 것을 DI라고 한다.

토비의 스프링에선 DI의 세 가지 조건은 다음과 같다.

  1. 클래스 모델이나 코드에는 런타임 시점의 의존관계가 드러나지 않는다. 그러기 위해서는 인터페이스에만 의존하고 있어야 한다.

  2. 런타임 시점의 의존관계는 컨테이너나 팩토리 같은 제3의 존재가 결정한다.

  3. 의존관계는 사용할 오브젝트에 대한 레퍼런스를 외부에서 주입해 줌으로써 만들어진다.

장점은 외부로부터 인터페이스 타입으로 얼마든지 부품이 교체될 수 있으니 코드가 매우 유연해진 다는 것이다.

정리하자면 Spring은 IoC를 통해 DI로 수많은 객체들에 의존관계를 맺어주는 동시에 유연하게 개발할 수 있게 도와줌으로써 우리 입장에서는 편하게 비지니스 로직에 집중할 수 있게 하는 것이다.

profile
개발 공부는 🌳 구조다…

0개의 댓글