본문 바로가기

코딩

[Talk] 프레임워크와 라이브러리의 차이

우연히 kldp를 탐색하다가 좋은 질문과 답변을 만났다. (https://kldp.org/node/124237)


Q.

안녕하세요. 컴퓨터공학과 학생입니다.
뜬금없지만 갑자기 프레임워크와 라이브러리의 차이가 무엇인지 궁금해서
검색을 해보았는데 내공부족으로 인하여 명확한 답을 얻을 수 없었습니다.
제가 이해하는 바를 말씀드리면 라이브러리는 재사용 관점에서 짜여져 있는 
독립적인 컴포넌트라고 알고있고 프레임워크는 라이브러리를 클래싱 또는 패키징을 하여
사용의 관점에서는 개발의 생산성을 돕고 또한 그 플랫폼에서 추구하는 방향으로 응용될 수
있도록 하는 이점(?)이 있다고 알고 있습니다.
그런데 찾아보다보니 제어의 역전의 개념이 중요한 차이라고들 말합니다.
라이브러리는 어플리케이션에 의해 불려지고 프레임워크는 프레임워크가 동작하다가 
어플리케이션을 호출한다라고 덧붙여 설명하고 있습니다.
저는 지금까지 라이브러리건 프레임워크건 정적인 컴포넌트로 
애플리케이션에 의해 불려지는 놈들이라고 받아들였기때문에 이 말을 이해할 수 없었습니다.
고수님들의 설명을 듣고 싶습니다





A. 

- A님


일단 모든 소스코드든 라이브러리든 메모리에 들어가는 정보는, 컴파일러나 인터프리터에게는 호출가능한 모듈일 뿐입니다.

이런 물리적인 계층을 보지말고, 그 위의 논리적인 계층을 봐야합니다.

라이브러리는 톱, 망치, 삽같은 연장입니다.
사람이 들고 썰고, 바꿔들고 내려치고, 다시 바꿔들고 땅을 파는 겁니다.

프레임워크는 차, 비행기, 배같은 탈것입니다.
사람이 타서 엔진 켜고, 기어 넣고, 핸들 돌리고, 운전하거나, 조종하거나 해야합니다.

도구를 쓸 때, 급하면 썰어야 할 곳에 망치를 쳐도 됩니다. 땅 파야할 때 톱으로 땅을 긁어내도 됩니다.
사람은 도구를 선택하는 입장이기 때문에, 어떤 도구를 사용하든 원하는 것을 만들어낼 수 만 있으면 됩니다.

반면에, 탈것은 정해진 곳으로만 다녀야 합니다. 차를 타고 하늘을 날거나, 배를 타고 땅으로 갈 수는 없습니다.
하지만, 그 목적에 맞게 만들어져 있기 때문에, 톱이나 망치를 들고 먼저 탈것을 만들어야할 필요가 없습니다.
그저 정해진 규칙에 맞춰서 엔진, 기어, 핸들만 잘 돌리면 됩니다.

라이브러리와는 달리 프레임워크는 이미 프로그래밍할 규칙이 정해져 있습니다.
예를 들어, 설정파일로 사용되는 XML에 어떤 태그를 써야하며, 어떤 함수를 추가적으로 작성해야하고,
소스 파일을 어느 위치에 넣어야하며, DB와 연동하기 위해 무엇을 써넣어야 하는지 정해져 있습니다.
보통 이런 대부분의 작업은 프레임워크가 하고자 하는 일에 비하면 아주 작은 일이며, 사람은 극히 일부분만 조정함으로써 목적을 달성할 수 있습니다.

만약 프레임워크가 담당하는 부분이 내가 하고자 하는 목적과 다를 경우에는 어떻게 할까요?
그럼 그냥 프레임워크를 잘못쓴겁니다.
더 목적에 가까운 프레임워크를 찾아보면 대부분 있을겁니다.
없거나 구하기 힘들다면, 비슷한 프레임워크를 라이브러리 단계에서 변경해서 다른 프레임워크로 만들면 됩니다.
차를 튜닝한다음, 차를 다시 운전하면 된다는 말이지요.

혹시 프레임워크 없이 그냥 라이브러리로만 만들면 안될까요?
안될 이유가 어딨겠습니까?
그냥 다 다시 만들 능력과 시간과 여유만 있다면 그렇게 해도 되지요.
스스로 만든 프레임워크는 버그도 스스로 잡아야하지만, 남들이 만들어놓은 프레임워크는 쓰는 사람이 많은 만큼 그만큼 수정이나 업데이트도 빠릅니다.
기능이 마음에 안드는 부분이 있다면, 프레임워크를 고치면 됩니다. 처음부터 다 만드는 것보다는 싸게 먹히지요.
내일 당장 지방에서 서울로 출근해야하는데, 혼자서 차를 만들어서 타고 가야한다는 생각을 해보세요.


- B님


디자인 패턴 관련 책을 읽어 보셨는지 모르겠지만..
패턴을 이용해서 설명하면 프레임워크를 좀 이해하기 쉽게 설명할 수 있을것 같습니다.

템플릿 메소드 패턴이라고 하는 패턴이 있는데,
작은 프레임워크 패턴이라는 별명이 있을 정도로 목적과 동작이 유사합니다.
(실제로 객체 지향 언어에서 프레임워크의 구현은 템플릿 메소드 패턴으로 도배되어 있습니다. )

상위 클래스에서 추상 메소드를 정의하고, 추상 메소드들을 활용해서 로직을 구현해 놓고,
상속 받은 하위 클래스에서 추상 메소드를 구현하게끔 되어 있습니다.

여기서 상위 클래스를 프레임워크라고 보시고, 
하위 클래스에서 추상 메소드를 구현하는 작업이 프레임워크를 이용해서 어플리케이션을 작성하는 일로 보시면 됩니다.

따라서 프레임워크를 이용해 어플리케이션을 작성하는건
사실은 이미 프레임워크에서 어플리케이션이 일부 구현이 빠져 있는 채로 존재하는 것에

그 빠진 부분을 채워넣는 직업이라고 보시면 됩니다.