Framework와 Library. 개발을 하다보면 정말 많이 듣게 되는 말인데 둘이 무엇이 다른지 물어본다면 대답은 못할 것 같았다… 둘이 다른 건 알겠는데 왜 다른지 설명할 자신이 없었기에 그 자신감을 채워보고자 한다..!
소프트웨어적으로는 목적에 맞게 잘 설계된 구조와 미리 구현된 공통 모듈(라이브러리)이 포함된 소프트웨어 개발 환경을 의미
Framework는 뼈대나 기반구조를 뜻하며 Application 개발시 필요한 알고리즘, 데이터베이스 연동 등과 같은 기능을 위해 구조를 제공해주는 것이다. 때문에 Framework는 완성된 어플리케이션이 아니며 프로그래머가 직접 완성시키는 작업을 진행해야한다.
라는 특징들이 있지만 사실 제일 중요한 특징은 바로 제어의 역전(IoC) 개념이 적용된 대표적인 기술이라는 것이다. 제어의 역전이 무엇인지는 조금 더 뒤에서 자세하게 설명하도록 하겠다!
우선 장점부터 살펴보자면
효율적인 생산이 가능하다.
기본적으로 작은 기능들과 세부적인 코드들을 하나하나 구현해서 개발하기엔 시간이 너무 많이 소요가 된다. 특히 규모가 커지게 된다면 개발 속도가 현저히 느려질 수 있다. 하지만 프레임워크마다 내장된 메서드가 존재하고 메서드 기능에 대한 코드를 작성할 필요없이 탬플릿만 재사용할 수 있다. 이로 인해 개발의 시간을 줄일 수 있다.
개발이 질적으로 향상된다.
위에서 얘기한 템플릿은 검증된 코드의 템플릿이다. 따라서 단순반복 등의 작업에서 일어날 수 있는실수를 줄이고 예방할 수 있어 질적으로 향상될 수 있다.
유지 보수가 가능하다.
프레임워크를 사용하게 된다면 개발자 간 통용되는 형식으로 구성이 되어 업무 처리나 코드 공유가 수월해지고 코드가 비교적 체계적이기에 개발과 유지 보수 측면에서 안정적이다.
그렇다면 단점으로는 무엇이 있을까?
학습 시간이 길다.
각 프레임워크의 코드 사용 방식을 습득을 해야하기 때문에 시간이 오래 걸릴 수 있다.
개발환경이 자유롭지 못하다.
프레임워크를 사용하게 되면 그에 따른 코드 사용 방식과 규칙을 따라야하기 때문에 개발자는 자유롭고 유연하게 프로그램을 개발하는 데 한계가 있을 수 있다.
그러나 사실 학습시간은 처음부터 공부를 해서 모든 것을 개발하는 것과 비슷하거나 오히려 적은 시간이 걸린다. 또한 자유롭지 못하다고 하더라도 그 안에서 충분히 구현할 수 있기 때문에 단점에 대한 체감은 잘 되지 않는다;;
오히려 프레임워크를 사용하여 공통된 형식의 개발 표준 가이드를 지킬 수 있다면 얻을 수 있는 이점이 더 많기 때문에 프레임워크는 사용을 하는 것이 좋다..!
Framework와 짝꿍처럼 나오는 단어가 바로 이 Library이다. 이 Library가 Framework와 어떤 연관이 있길래 이렇게 자주 나오는 것일까?
특정 기능에 대한 도구나 함수들을 모은 집합
프로그래머가 개발을 하는데 필요한 함수들이 있을 것이다. 이때 이를 직접 구현해도 되지만 다른 개발자가 만들어놓은 집합을 불러와서 자신의 클래스에서 호출하여 사용해도 되는데, 이때 불러오는 이 집합을 Library라고 한다.
마찬가지로 장점부터 살펴보자면
유연성
개발자가 필요한 기능을 자유롭게 선택하고 조합하여 사용할 수 있다.
효율성
이미 개발된 코드를 활용하여 개발 시간을 단축하고 효율성을 높일 수 있다.
다양성
다양한 기능을 제공하는 Library가 존재하여 선택의 폭이 넓다.
그렇다면 단점에는 어떠한 것들이 있을까?
책임 분담
Library가 제대로 작동하지 않을 경우 개발자가 직접 해결해야 할 수 있다.
호환성
다양한 Library를 사용할 경우 호환성의 문제가 발생할 수 있다.
따라서 Library는 꼭 사용해야한다라는 느낌보다는 필요할 때 선택적으로 사용을 하는 것이 좋다. 또한 사용할 때 공식 문서를 읽어보면서 자신에게 필요한 Library를 사용해야지 무작정 Library만 가져다 쓰게 된다면 원하는 동작이 아닐 수도 있다는 점을 유의해야한다..!

이 둘의 차이를 가장 잘 설명하는 그림을 가지고 와봤다.
그림을 딱 보자마자 알 수 있을 것이다. Framework와 Library의 차이점은 Flow, 즉 흐름에 대한 제어 권한이 어디에 있는지에 대한 차이이다.
Framework는 전체적인 흐름을 자체적으로 제어하며, 프로그래머가 흐름을 위해 필요한 코드를 작성한다.
Library는 사용자가 흐름을 제어하며 필요한 상황에 호출해서 사용을 한다.
이를 설명한 개념이 바로 제어의 역전(Inversion Of Control)이다.
일반적으로 개발을 한다고 하면 프로그램의 제어 흐름은 개발자가 컨트롤한다. 하지만 Framework에서 내가 작성한 코드를 대신 실행하여 제어 흐름을 컨트롤 하는 것을 제어의 역전이라고 한다.
말이 너무 어려우니 다시 차근차근 설명을 해보겠다.
일반적으로 소프트웨어 개발을 할 때 내가 직접 개발을 했기 때문에 프로그램에 대한 제어 흐름도 스스로 컨트롤을 하는 것이 당연하다고 생각이 들것이다. (내가 코드를 짰으니까 내가 컨트롤 할거야! 라는 느낌으로)
그러나 제어의 역전에서는 이러한 제어의 흐름을 컨트롤하는 권한을 내가 아닌 Framework에게 위임하고 그 권한을 받은 Framework는 Application 코드에 대한 지원과 지침을 제공하며 흐름을 결정하게 된다. 이처럼 모든 권한을 위임 받은 주체를 IoC 컨테이너라고 한다.
그렇다면 이 제어의 역전, 왜 필요한 것일까? 어차피 우리가 코드를 짜니까 우리가 직접해도 되는 게 아닐까? 라고 생각할 수 있다.
하지만 조금만 생각해보면 알 수 있다. 우리는 개발을 하면서 비즈니스 로직을 짜는데도 굉장한 시간을 소모하게 된다. 하지만 객체의 생명주기 등 세세한 것까지 신경을 쓰게 된다면 개발속도는 현저히 느려지게 될 것이다. 따라서 이러한 생명주기 같은 권한을 Framework에게 넘겨줌으로써 개발자들은 비즈니스 로직에만 신경쓸 수 있도록 해주기 위함이다!
💡 IoC와 DI?
IoC는 DI에 의해 구현이 된다.
DI는 Dependency Injection(의존성 주입)이라는 뜻으로 각 클래스 사이에 필요한 의존 관계를
빈 설정 정보를 바탕으로 컨테이너가 자동으로 연결해주는 것이다.
Framework는 Application 개발시 목적에 맞게 설계된 틀을 제공해준다!
Library는 필요한 특정 기능에 대한 도구나 함수들을 모은 집합이다!
둘의 가장 큰 차이점을 제어의 역전(IoC)로 설명할 수 있다!