Java Spring

IoC / DI (Inversion of Control / Dependency Injection, 제어의 역전 / 의존성 주입)

Machine_웅 2024. 12. 26. 13:40
728x90
반응형

IoC / DI (Inversion of Control / Dependency Injection, 제어의 역전 / 의존성 주입)

Java 애플리케이션의 동작 흐름에서 중요한 것은 무엇일까요?

아무래도 Java는 객체지향 언어이므로, 객체들 간의 관계를 적절히 맺어주는 것이 중요한 요소일 것입니다.

객체들 간에 관계를 맺어준다는 것은 거창한 것이 아닙니다.

 

A 인스턴스가 B 인스턴스의 메서드를 호출하고 있다면 A는 B와 의존 관계를 맺은 것이 되며,

이 둘의 관계를 “A가 B에 의존하는 관계”라고 표현할 수 있습니다.

 

A가 B의 기능을 가져다가 사용하고 있으니까요.

 

 

 

위의 A와 B의 의존 관계는 개발자에 의해 만들어집니다.

개발자가 직접 new 키워드를 사용하여 인스턴스를 생성하는 코드를 작성했기 때문입니다.

그런데, 위처럼 코드를 작성할 때에 필연적으로 발생하는 문제가 있습니다.

 

만약, A가 사용할 객체를 B가 아니라, 새롭게 C를 정의해서 사용하고자 한다면 어떻게 해야 할까요?

당연하게도, A의 코드를 아래와 같이 변경할 수밖에 없을 것입니다.

 

위 예제에서는 기존에 B를 사용하던 객체가 A 하나뿐이므로 간단하게 바꿔주면 되지만, 

만약 기존에 B를 사용하던 객체가 A 뿐만 아니라, 수십 또는 수백개가 있다면 모든 객체의 코드를 수정해주어야 합니다. 

실무에서 코드를 이런 방식으로 작성해두었다면 야근을 피하기는 힘들 것 같습니다.

 

하지만, 야근 걱정은 하지 않으셔도 됩니다.

스프링을 사용하면 위처럼 변화가 발생한 상황에 최소한의 수정만으로 변화를 유연하게 수용할 수 있습니다.

스프링을 사용하여 좀 더 변화에 유연하게 대응할 수 있는 코드를 작성하려면 아래와 같이 코드를 수정해주어야 합니다. (1) ~ (5)의 설명을 순서대로 읽으면서 어떤 부분이 어떻게 바뀌었는지 파악해보세요.

 

 

 

위 예제에서 A는 자신이 사용할 객체를 스스로 생성하지 않고, 생성자를 통해 외부로부터 받아오고 있습니다. 

 

즉, A는 자신이 사용할 객체를 알지 못하며,

그저 i에 할당된 인스턴스에 example()이라는 메서드가 존재한다는 것만 알고 있습니다.

 

그렇다면 누군가 A가 사용할 객체를 결정하고 생성해서 A가 인스턴스화될 때 인자로 전달해주어야만 합니다.

그래야 A는 B의 것이든, C의 것이든 example() 메서드를 호출할 수 있을 것이기 때문입니다.

 

그 누군가가 무엇일까요?

그 누군가가 바로 바로 스프링입니다.

스프링을 사용하면 애플리케이션의 로직 외부에서 A가 사용할 객체를 별도로 설정할 수 있습니다. 

개발자가 설정 클래스 파일에 A가 사용할 객체를 C로 설정해두면,

애플리케이션이 동작하면서 스프링이 설정 클래스 파일을 해석하고,

개발자가 설정해둔대로 C 객체를 생성하여 A의 생성자의 인자로 C를 전달해줍니다.

 

이처럼 개발자가 아닌

스프링이 A가 사용할 객체를 생성하여 의존 관계를 맺어주는 것을

IoC(Inversion of Control, 제어의 역전)라고 하며,

 

그 과정에서 C를 A의 생성자를 통해 주입해주는 것을

DI(Dependency Injection, 의존성 주입)라고 합니다.

 

 

 

https://www.codestates.com/blog/content/%EC%8A%A4%ED%94%84%EB%A7%81-%EC%8A%A4%ED%94%84%EB%A7%81%EB%B6%80%ED%8A%B8

 

스프링과 스프링부트(Spring Boot)ㅣ정의, 특징, 사용 이유, 생성 방법

스프링은 Java 백엔드 개발에 있어 떼어놓을 수 없는 프레임워크입니다. Java 백엔드의 핵심 기술이 되는 스프링 프레임워크와 스프링 부트가 무엇인지, 나아가 스프링 부트를 활용하여 프로젝트

www.codestates.com

 

728x90
반응형

'Java Spring' 카테고리의 다른 글

Spring MVC 모델 2  (0) 2025.01.02
AOP (Aspect Oriented Programming, 관심 지향 프로그래밍)  (0) 2024.12.26
DAO, DTO 란?  (0) 2024.12.24
Server-Sent Events vs WebSockets  (0) 2024.07.02
Spring 구조 ( 퍼옴 )  (0) 2024.03.05