Library vs. Framework
이 둘을 명확히 구분하는 정의는 사실 없다고 봐야한다.
개인적으로 호출 시점과 같은 흐름에 대한 자유도로 나누는 견해가 가장 맞는 구분 같지만...
우선 두 용어가 가지는 대략적인 느낌의 차이 정도만 알고 있으면 특정 라이브러리 혹은 프레임워크들을 사용할 때
어느정도 수준으로 기능들이 제공되는지를 파악하는데 도움이 되기 때문에 정리해 둔다.
보면 알겠지만, framework라면 SW의 흐름 (또는 lifecycle이라고도 함)이 이미 정해진 경우가 많아서
제대로 사용하려면 특정 function이나 class파악하는 수준이 아닌 시작품을 만드는 tutorial 정도는 살펴봐야 사용이 가능하다.
Library
SW의 구성요소 중 하나로, 특정 플랫폼에서 개발 중인 SW에
- 특정 기능을 추가하기 위한 목적으로,
- 실행가능한 기계어 또는 바이트코드 형태로 제공되는
- 모듈화된 프로그램들의 묶음.
Library를 어떻게 개발 중인 SW에서 사용할지는 API (Application Programming Interface)를 통해 정의됨.
API는
해당 라이브러리가 포함하고 있는 SW구성요소들의 기능과 관련된 data type들, 호출방법들과 같은
specifiation(사양)을 정의하고 있기 때문에
Library를 API의 구현물(implementation)이라고 정의하기도 함.
API는 구현물이 아닌 "정의"이다. POSIX가 API의 대표적 예라고 할 수 있음.
https://dsaint31.tistory.com/entry/Programming-Application-Programming-Interface-API
라이브러리는 수많은 함수와 객체들의 모임이며,
프로그래밍할 때 필요한 거의 모든 기능이
해당 프로그래밍언어에서 제공하는 표준 라이브러리 또는 다른 기관이나 개인이 만들어 배포한 third party 라이브러리에 있기 때문에
적절한 라이브러리를 효과적으로 활용할 수 있는 능력은 SW개발자에게 매우 중요하다.
라이브러리는 단독으로 동작하지 않으며
해당 기능이 필요할 때,
개발 중인 SW에서 라이브러리가 제공하는 객체나 함수를 호출 하는 방식으로 수행됨.
다른 표현으로는 library는
SW를 개발할 때, 해당 SW가 특정 기능을 수행하기 위해 사용하는 비휘발성 자원 이라고도 정의 된다.
라이브러리는
- build단계에서 실행파일 내에 포함되게 되는 static link방식으로 SW에 포함되거나,
- memory에 shared library로 적재되어 실행파일이 runtime에 호출하는 dynamic link방식으로
사용된다.
전자의 방식으로 사용되는 라이브러리를 statically-linked library (정적 라이브러리)라고 부르고,
후자의 방식으로 사용되는 라이브러리를 dynamically-linked library(동적 라이브러리)라고 부름.
.so
파일(linux 경우)이나 .dll
파일(windows 경우)이 바로 동적 라이브러리 파일이다.
(주로 특정 프로그램 수행시 runtime error등의 메시지로 보게된다. 뭐가 없다는...)
openCV
, numpy
, Qt
, STL
, Pandas
등이 유명한 라이브러리 들이고
이들의 사용법(API)를 익히는 것이 프로그래밍을 익힐 때 많은 시간이 소요되는 부분 중 하나임.
(사실 "Qt" 는 framework라고 보는 사람도 많다.)
Framework
특정 기능 들을 개발자들이 더 빠르고 쉽게 구현할 수 있도록 미리 만들어 놓은 틀(뼈대).
- 일종의
틀
이므로 그 자체가 단독으로 실행되지 않음.
일반적으로 library보다
좀 더 구조화되어 있으며,
사용하기 위한 고정된 작업 방식을 가짐.
자유롭게 응용이 가능한 library 보다 강제성 을 보다 가지고 있어서 framework가 지정한 방식으로 코딩을 해야만 제공하는 기능을 이용할 수 있다.
일반적으로 대상이 되는 분야의 SW가
공통적으로 가져야 하는 기능은 framework가 이미 구현을 해놓았고 이를 사용하기 위한 동작 방식도 다 구현되어 있기 때문에,
개발자는 현재 개발하는 SW 고유의 기능(주로 사용자에게 제공하는 서비스와 관련된)만을 해당 동작방식에 지정된 위치에 코딩하는 방식으로 개발에 사용된다.
Library의 경우,
프로그램 코드의 흐름을 개발자가 자유롭게 결정하고 해당 흐름에서 원하는 위치에서 라이브러리의 함수나 객체를 호출하는 것과 달리,
framework는 이미 코드의 실행 흐름이 결정되어 있고, 각 시점에 호출되는 루틴이 정해져 있다.
개발자는 해당 루틴에 해당하는 객체나 function들을 상속받거나 재정의, 또는 implement하는 형태로 고유의 기능을 추가할 뿐 전체 framework가 동작하는 순서와 방식을 바꾸진 않는다.
예를 들어 설명한다면, framework에서는 이미 호출되는 시점이나 대응하는 event가 고정된 다양한 callback function (or method)을 미리 정의해 놓은 상태로서, 개발자는 framework가 지정한 방식으로 이들 callback 함수에 개발할 SW의 고유기능을 위해 필요한 code만을 추가하면 된다.
Framework는
library에 비해 학습시간이 더 필요하지만,
개발에 걸리는 시간은 대폭 줄어들게 되고
개발 SW의 고유 logic에만 집중할 수 있다는 장점을 가짐.
framework 학습은
다양한 설계패턴이나 컴퓨터공학적인 배경지식이 있어야 이해도가 올라가기 때문에
라이브러리를 익히는 것보다 많은 시간이 들어가는 경우가 일반적이다.
실제로 상용 app를 개발하는 경우, 가장 널리 사용되는 혹은 개발자가 선호하는 framework가 이용되는 경우가 많다.
Spring
, Django
, Vue.js
, Flask
등을 예로 들 수 있음.
읽어보면 좋은 자료
https://namu.wiki/w/%EB%9D%BC%EC%9D%B4%EB%B8%8C%EB%9F%AC%EB%A6%AC
https://namu.wiki/w/%ED%94%84%EB%A0%88%EC%9E%84%EC%9B%8C%ED%81%AC
2023.06.08 - [Programming] - [Programming] Application Programming Interface (API)
http://ds31x.blogspot.com/2017/03/application-binary-interface-abi.html?q=API
'Programming' 카테고리의 다른 글
[Programming] Primitive Data Type : C, C++, NumPy, Torch (0) | 2023.02.01 |
---|---|
[PyQt] Event and Event Handling 작동방식 (0) | 2023.01.26 |
[PyQt6] Install PyQt6 on Windows (2) | 2023.01.03 |
[CE] Introduction of WSL (0) | 2022.12.22 |
openCV : cv2.waitKey bug (1) | 2022.10.21 |