본문 바로가기
우테코 자유테크 스터디/자유주제

[스터디] IoC : 제어의 역전

by ♡˖GYURI˖♡ 2023. 12. 22.

저번 스터디에서 DI에 대해 발표했었다.

그것과 연결하여 이번에는 IoC에 대해 알아보았다.

 

[스터디] 의존관계 주입(DI : Dependency Injection)

최근 김영한님의 Spring 핵심 원리 - 기본편 강의를 듣고 있는데 DI라는 단어가 자주 나왔다. 도대체 DI가 정확히 뭘까? 이번 기회에 한 번 알아보겠다. 의존관계란? "A가 B를 의존한다."라는 표현은

newbie-in-softengineering.tistory.com

 

 

제어의 역전 (Inversion of Control, IoC)

직장에 차를 몰고 가는 것은 내가 차를 제어하는 것이다.

직접 차를 운전하는 대신 운전 기사를 고용한다면? 이것을 제어의 역전이라고 한다.차를 직접 운전할 필요가 없고 운전자가 운전하게 함으로써 나는 본업에 집중할 수 있게 된다.

 

소프트웨어 공학의 주요 원칙 중 하나는 클래스 간의 상호 의존성을 최소로 가져야 한다는 것이다.IoC는 클래스 간의 결합을 느슨하게 해 테스트와 유지 관리를 더 쉽게 하는 설계 원칙이다.

 

Don't call us, we will call you.
- 헐리우드 원칙

 

프레임워크 없이 개발할 때에는 객체의 생성, 설정, 초기화, 메서드 호출, 소멸(~생명주기~)을 프로그래머가 직접 관리한다. 또한 전통적인 프로그래밍에서는 외부 라이브러리를 사용할 때, 개발자가 직접 외부 라이브러리를 호출하는 형태로 이용한다.

 

하지만, 프레임워크를 사용하면 객체의 생명 주기를 모두 프레임워크에 위임할 수 있다. 즉, 외부 라이브러리가 프로그래머가 작성한 코드를 호출하고 흐름을 제어한다.

 

이와 같이 개발자가 작성한 객체나 메서드의 제어를 개발자가 아니라 외부에 위임하는 설계 원칙을 제어의 역전이라고 한다. 즉, 프레임워크는 제어의 역전 개념이 적용된 대표적인 기술이라고 할 수 있다.

 

제어의 역전에서는 오브젝트 스스로가 사용할 오브젝트를 결정하지도, 생성하지도 않는다. 원칙의 이름 그대로 제어에 대한 권한이 개발자에서 외부 환경으로 역전되는 것이다.

 

정리해보자면, 전통적인 방식으로 라이브러리를 사용하는 것은 우리의 프로젝트의 일부분으로서 라이브러리를 가져와 직접 제어하는 것이다. 반면 IoC는 우리의 코드가 프레임워크의 일부분이 되어 프레임워크에 의해 제어되는 것이다.

 

어플리케이션의 제어 책임이 프로그래머에서 프레임워크로 위임되므로, 개발자는 핵심 비즈니스 로직에 더 집중할 수 있다는 장점이 있다.

 

 

 

IoC와 DI

IoC는 DI와 밀접한 관련이 있다. DI는 IoC 원칙을 실현하기 위한 여러 디자인패턴 중 하나이다. IoC와 DI 모두 객체간의 결합을 느슨하게 만들어 유연하고 확장성이 뛰어난 코드를 작성하기 위한 패턴이다.

 

 

 

예시

public class A {
    private B b = new B();
    b.method1();
}

 

위 같은 경우는 A 객체가 B 객체에 의존하고 있다. B 객체가 언제 생성이 되는지 명시되어 있는데, 이는 개발자가 이 객체의 생명주기를 직접 생각해야한다는 의미이다.

public class A {
    @Autowired
    private B b;

    b.method1();
}

 

하지만 스프링이 제공하는 @Autowired 어노테이션을 사용하면 객체를 초기화하거나 새로 생성하지 않고도 사용할 수 있다.

 

즉, 객체의 생명주기가 프로그래머에서 스프링 프레임워크로 위임된 것이다.

 

@Controller
public class ProfileController {
    @Autowired
    private ProfileService profileService;
    
    @RequestMapping(value="/profile/create", method=RequestMethod.POST)
    public void createProfile(ProfileRequest profileRequest) {
        profileService.create(profileRequest);
    }
}

 

 

ProfileService가 한 곳에서만 쓰인다면 모르겠지만 만약 1000회 이상 다른 곳에서 사용되어야 한다면 직접 관리하기가 어렵다.

이럴 때 @Autowired 한 줄이면 알아서 관리를 해주니 개발자의 부담을 덜 수 있다.

 

 

 

스프링 컨테이너(IoC 컨테이너)

IOC 컨테이너에는 2가지의 핵심적인 클래스가 있다.

  • BeanFactory
    • 자바 객체(bean) 인스턴스를 생성, 설정, 관리하는 실질적인 컨테이너이다.
    • getBean() 메소드를 통해 빈을 인스턴스화할 수 있다.
    • BeanFactory 컨테이너는 구동될 때 Bean 객체를 생성하는 것이 아니라, 클라이언트의 요청이 있을 때 Bean 객체를 생성한다.
  • ApplicationContext:
    • BeanFactory를 상속받은 BeanFactory의 확장 버전이다.
    • BeanFactory를 상속받은 interface이며, ApplicationContext 컨테이너는 구동되는 시점에 등록된 Bean 객체들을 스캔하여 객체화한다.
    • 부가 기능과 빈을 지연 없이 얻을 수 있다는 장점으로 ApplicationContext을 실제 개발에서 주로 사용한다.

 

 

IoC의 장점

  • 어플리케이션 코드의 양을 줄일 수 있다.
  • 클래스 간의 결합을 느슨하게 한다.
  • 어플리케이션의 테스트와 유지 관리를 쉽게 해준다.

 

 

 


 

 

 

 

[Spring] 의존성 주입, 제어의 역전

공부하며 작성한 내용이기 때문에 오류 사항이 있을 수 있습니다. 잘못된 부분은 피드백 부탁드립니다.Spring에서의 의존성 주입과 제어의 역전에 대해 알아본다. Spring에서의 의존성 주입이란 다

velog.io

 

 

[Spring] IoC(Inversion of Control) - 제어의 역전 이란?

스프링 프레임워크(Spring Framework) 하면 또 빼놓을 수 없는 단어가 DI, IoC가 아닐까 싶은데요! IoC는 스프링 뿐만 아니라 다른 프레임워크에서도 사용되는 범용적인 개념입니다. 왜 IoC라는게 생겼을

jhyonhyon.tistory.com