강의

멘토링

커뮤니티

인프런 커뮤니티 질문&답변

인생은회전목마님의 프로필 이미지
인생은회전목마

작성한 질문수

Readable Code: 읽기 좋은 코드를 작성하는 사고법

DIP: Dependency Inversion Principle

DIP 설명 후반부에 IOC에 대한 질문 드립니다.

작성

·

13

0

안녕하세요.

스프링 프레임웍에서 IOC 개념을 설명 해주시면서 항상 들었던 궁금한 점을 질문드립니다.

IOC는 개발자가 짠 프로그램이 아닌, 프레임워크에 의해 객체가 관리(생성, 소멸)되는 것이라고 설명 주셨습니다. 저도 스프링 컨테이너의 BEAN를 인스턴스로 활용하는 것으로 대략 알고 있는데요. 그렇다면 IOC에 의해 주입되는 BEAN은 하나의 형태의 구현체 일텐데,, 스프링은 앞서 DIP에서 설명 주신 추상화된 인터페이스가 하나의 고정된 구현체만 BEAN으로 만들어 생성하는 걸까요?

스프링 IOC의 장점을 설명하라고 하면 제어의 역전이 되면서 구현 인스턴스 변경에 유연해진다라고 들었는데,, 하나의 인스턴스로만 고정된다면 그것이 유연한 것일까 항상 궁금했습니다. 아니면 주입될 객체만 바꿔끼면 되니 유연하다는 표현을 하는걸까요?

질문을 해보니 약간 스프링의 질문인데.. 항상 이해가 잘 되게 설명을 해주셔서.. 실례를 무릅쓰고 여쭈어봅니다. ㅠㅠ

답변 2

0

박우빈님의 프로필 이미지
박우빈
지식공유자

안녕하세요, 인생은회전목마 님!

먼저 컴파일 타임과 런타임 시점을 구분해서 이해하셔야 합니다.

DIP가 적용되지 않은 코드는 인터페이스 없이 상위 모듈이 하위 모듈을 직접적으로 참조하고 있게 됩니다. 컴파일 타임부터 어떤 객체를 참조할지 알고 있게 되는 것이죠.
DIP가 잘 적용되어 인터페이스로 참조할 구현체의 기능만 알고 있고, 직접적인 구현체 자체는 알 수 없는 구조라면, 컴파일 시점에는 알 수 없지만 실제 실행 시점인 런타임 시점에 구현체를 주입받게 됩니다.

스프링 IOC의 장점을 설명하라고 하면 제어의 역전이 되면서 구현 인스턴스 변경에 유연해진다라고 들었는데

위와 같이 표현하신 것처럼 직접 참조가 아닌 인터페이스를 통한 참조라면 하위 모듈인 구현체 객체가 변경되어도 (인터페이스 스펙만 유지한다면) 상위 모듈이 영향을 받지 않습니다. 그렇기에 "변경"에 유연해진다고 하는 것입니다.

구현체가 꼭 하나만 있는 상황 말고도, 스프링에서는 런타임 시점에 여러 구현체(Bean) 중 상황에 맞는 것을 선택하여 주입할 수도 있습니다. 이처럼 동일한 인터페이스 스펙만 유지된다면 구현체를 얼마든지 교체할 수 있기 때문에, 스프링 IoC는 변경에 유연한 구조라고 할 수 있습니다.

도움이 되셨기를 바랍니다.

감사합니다. 🙂

 

0

안녕하세요, 인프런 AI 인턴입니다.

인생은회전목마님, 스프링 프레임워크에서의 IoC(제어의 역전)와 Bean 관리에 대한 좋은 질문을 주셨네요.

IoC의 본질은 객체의 생성과 소멸을 포함한 객체의 전체 생명 주기를 개발자가 직접 관리하는 대신, 스프링 프레임워크가 직접 처리함으로써 애플리케이션 설계를 더욱 유연하고 확장 가능하게 만드는 것입니다. 이를 통해 DI(의존성 주입) 패턴을 자연스럽게 구현할 수 있습니다.

질문 주신 내용에 관련하여, 스프링은 인터페이스와 같은 추상화된 구조를 사용하여 유연성을 제공합니다. 인터페이스 뒤에 여러 구현체를 숨길 수 있으며, 스프링 컨테이너는 설정 파일이나 어노테이션 등을 통해 필요한 구현체를 주입하며, 이는 실제 실행 시점에 설정될 수 있습니다. 따라서 특정한 하나의 구현체로 고정되는 것이 아니라, 필요한 경우 다른 구현체로 바꾸어서 사용할 수 있는 유연함이 있게 됩니다.

예를들어, 같은 인터페이스를 구현한 여러 Bean을 정의하고, 주입 시점에 적절한 Bean을 선택해서 사용할 수 있습니다. 이러한 방식으로 IoC와 DI를 결합하여 변화와 확장에 유연한 구조를 갖출 수 있으며, 실질적으로 필요한 구현체만을 주입하여 사용할 수 있게 됩니다.

IoC의 주요 장점은 바로 이러한 유연성과 상호 의존성의 감소에 있습니다. 결국, 주입할 객체를 설정과 구성에 따라 변경할 수 있으므로 유연성을 가진다고 표현할 수 있습니다.

스프링에서의 IoC 사용이 이러한 유연함을 제공하는지 이해가 가셨길 바랍니다. 추가적으로 질문이 있으시면 언제든지 환영합니다!

추가적으로, 스프링 IoC와 관련한 공식 문서를 참고하시려면 아래 링크를 방문해보세요: Spring Framework Core

인생은회전목마님의 프로필 이미지
인생은회전목마

작성한 질문수

질문하기