상세 컨텐츠

본문 제목

[Spring] 제어의 역전(IoC)에 관한 고찰

JAVA\Spring

by 박집실 2022. 11. 22. 18:59

본문

  # 제어의 역전(IoC)

 

- 프로그램의 제어 흐름 구조가 뒤바뀌는 것. 

 

거의 모든 코드에서 좋지 않은 구조라 말 할 수 있는 경우가 main() 메소드 등을 가지고 모든 종류의 작업을 사용하는 쪽에서 제어하는 구조이다. 이런 구조를 제어의 역전 개념을 통해서 이런 모든 걸 다 사용하는 쪽에서 총괄하는 구조를 즉, 이런 제어의 흐름의 개념을 뒤집는 것이다. 그래서 제어의 역전에선 오브젝트가 자신이 사용할 오브젝트를 스스로 선택하지 않고 모든 제어 권한을 자신이 아닌 다른 대상에게 위임한다. 정리를 하자면 main()과 같은 스타팅/엔트리 포인트를 제외하고 모든 오브젝트는 이렇게 위임받은 제어 권한을 갖는 특별한 오브젝트에 의해 결정되고 만들어짐. 또한 제어의 역전에서는 프레임워크 나 컨테이너와 같이 애플리케이션 컴포넌트의 생성과 관계설정, 사용, 생명주기 관리등을 관장하는 존재가 필요 등등 요약하면 그냥 기능 호출을 위한 제어권을 가진 존재가 필요하단 소리다.

 

 

ex ) 

 

- 서블릿:

서버안에서 특정 컨테이너가 서블릿에 대한 제어 권한을 가진 채로 적절한 시점에 서블릿 오브젝트를 만들고 그 안의 메소드를 호출하여 적절한 기능을 하게한다. 이 때 개발자는 서블릿을 서버에 배포만 할 수 있으뿐 main()과 같은 스타팅 포인트가 없기에 직접 개입할 수 없지만 서버에서 적절한 때 컨테이너를 통해 서블릿 오브젝트를 만들어 해당 메소드를 호출한다. 때문에 대부분의 작업을 컨테이너가 제어권을 같고 서블릿에 메소드 형태로 이관되었기에 서블릿이 필요할 때만 호출되어 사용되기에 제어의 역전이라고 할 수 있다.

 

-  템플릿 메소드 패턴:

제어권을 상위 템플릿 메소드에 넘기고 자신은 필요할 때 호출되어 사용되기에 템플릿 메소드에 실질적 제어권을 가지게 되고 밑에 훅 메소드 혹 추상 메소드는 오버라이딩되어 필요할 때만 제어권에 의해 호출되어 사용된다. 그러니 제어의 역전이 있다고 할 수 있다.

 

- 프레임워크:

프레임워크는 프로그램이 런타임의 흐름을 가지고 개발자가 만든 애플리케이션 코드를 사용하도록 만드는 방식. 즉쓴, 개발자가 짠 코드가 프레임워크에 의해서 사용된다. 반면 라이브러리는 코드 상에서 필요할 때 호출되어 해당 기능을 불러올 뿐 런타임의 흐름은 개발자가 짠 코드에 의해서 주도된다. 이를 정리를 하자면 개발자가 짠 어플리케이션 코드는 런타임에 대한 흐름의 제어권을 가지고 있지않고 오히려 프로그램인 프레임워크가 제어권을 가지고 있어 프레임워크가 동작을 하다가 필요한 작업이 필요할 때 개발자가 짠 코드를 호출하여 코드에서 기능을 실행할 뿐이다. 그래서 이 또한 프레임워크는 제어의 역전 개념을 가지고 있어야한다라고 말할 수 있다.

 

 

# 결론 및 정리

 

- 제어의 역전의 핵심은 바로 제어권과 제어를 통해 불러오기 위한 기능 구현의 코드 분리이다. 여기에서 중욧한 한 점은 이 제어권을 가지고 있는 주체가 누구인지는 중요하지 않다는 것이다. 그것이 main() 메소드의 엔트리 포인트이던가 컨테이너이든가 아님 프레임워크던가 말이다.,그저 중요한 것은 제어권과 구현된 기능을 서로 분리하여 높은 응집도, 낮은 결집도 - 관심사의 분리(SoC)를 이루어내었냐이다. 이 방식을 통해 코드의 설계가 깔끔해지고 가독성이 좋아져서 필요한 기능이 필요할 때 해당 기능 코드를 모아놓은 클래스 파일로 가서 수정만 하면 되기에  확장할 수 있는 유연성이 엄청나게 높아진다. 

관련글 더보기