본문 바로가기
개발/스프링

[Spring] 스프링의 IoC, DI

by 카펀 2022. 2. 21.

개요

스프링은 가장 대중적인 웹 프레임워크입니다.

Java 기반이며 (요새는 Kotlin으로도 동작합니다), 요새는 Node.js, django 등 다른 프레임워크도 많지만 백엔드 개발자라면 한 번씩은 써 보게 됩니다.

특히 한국에서는 전자정부표준프레임워크에 채택되어 있어 SI, SM 업계에서는 거의 필수적으로 사용하고 있습니다 (예전 버전이지만...).

 

https://spring.io/

Spring! 이름의 유래는 봄입니다.

Spring 이전에는 EJB가 Java 기반 엔터프라이즈 소프트웨어 개발의 중심이었는데, 이 때를 Java 개발의 겨울에 비유하고, Spring의 등장으로 Java 개발 환경에 봄이 왔다는 뜻에서 지었다고 합니다.

 

저 역시 백엔드 개발을 Spring으로 하고 있습니다.

(정확히는 Spring Boot를 통해 하고 있는데, Spring과 Spring Boot의 차이는 조만간 작성하도록 하겠습니다.)

이미 책을 따라서 Spring을 이용한 기초 개발을 맛봤고, 현재 개인 프로젝트도 진행하고 있지만, 아직 Spring에 대해 잘 안다고 할 수 없습니다.

오히려 Spring을 전혀 모른다고 하는 것이 더 잘 어울리는 표현이 어울리겠습니다.

 

오늘은 스프링의 중요한 개념인 제어 역전 (Inverson of Control; IoC)과 의존성 주입 (Dependency Insertion; DI)에 대해 다루어 보겠습니다.

 

제어 역전

전통적인 개발 프로세스에서는 개발자가 작성한 코드가 외부 라이브러리를 호출하여 사용합니다.

제어 역전은 말 그대로 이런 관계가 역전되는 것을 의미합니다. 즉 외부 라이브러리 코드가 개발자의 코드를 호출하여 사용합니다.

여기서 외부 라이브러리 코드가 Spring을 의미합니다.

 

더 자세히 언급하자면, 스프링 컨테이너가 필요에 따라 개발자 대신 Bean들을 제어하게 됩니다.

Bean이란, Spring이 제어하는 Java 객체를 의미하는데요.

즉, Spring이 객체를 제어해 주는 개념을 제어 역전이라고 부릅니다.

 

제어 역전이 왜 중요할까요?

우선 Spring이 객체를 관리/제어해 주므로, 개발자는 설계 및 개발에 더 집중할 수 있습니다.

더 구체적으로, 객체의 생명 주기 (생성 - 설정 - 초기화 - 소멸) 과정을 Spring이 전부 해 줍니다 (IoC 컨테이너에서 담당).

예를 들어, Java에서 늘 사용하는 new (Queue<Integer> q = new LinkedList<>();)를 Spring에서는 더 이상 사용하지 않아도 됩니다.

Spring이 객체를 생성하도록 도와주기 때문입니다.

이 개념이 Spring 프레임워크를 사용하는데 가장 근본적인 개념인 만큼, 확실히 이해하고 있는 것이 중요합니다.

 

의존성 주입

보통 객체를 생성할 때, 클라스 내부에서 값을 넣어 줍니다.

하지만 이를 클라스 외부에서 넣어주는 경우가 있는데, 이를 의존성 주입이라고 합니다.

즉 하나의 객체가 생성될 때, 각각의 상황에 맞게끔 값을 주입받게 되는 것입니다.

 

이로써 얻을 수 있는 장점은 객체들 간의 의존성을 낮추며 유연성을 높일 수 있는 점입니다.

보통 개발을 하다 보면, 수많은 객체가 서로 의존되어 있게 되는데, 한 객체를 수정하게 되면 (이름을 바꾸는 등) 다른 객체도 이에 맞추어 신경을 써 주어야 합니다.

그러다 보면 프로그램 유지/보수에 많은 노력과 어려움이 발생할 수 밖에 없습니다.

 

하지만 의존성 주입 덕분에 객체 간 의존성이 낮아지면, 유연성이 높아지면?

객체가 서로서로 느슨하게 결합되었다고 표현하기도 합니다.

그만큼 유지/보수가 쉬워지고, 생산성이 증가하게 됩니다.

 

 

 

참고

댓글