Framework VS Library 차이가 무엇일까??
개발관련공부를 하다보면 한번쯤 의문을 가질 수 있을것이다.
라이브러리는 알겠는데 프레임워크는 무엇인지 잘 모르겠다..
혹은 프레임워크는 알겠는데 라이브러리는 뭔지 모르겠다..
내가 생각할 때는 우선 크기가 다르다고 생각을 한다.
프레임워크 자체는 환경적인 것이라 생각하고 라이브러리는 환경보다는 작은 내가 마음대로 수정하고 이용할 수 있는 것으로 생각한다.
즉 환경이란 것은 말 그대로 구성되어있기 때문에 특별하게 사람이 수정할 수 없고 주어진 환경에서 활동할 수 있다.
그리고 라이브러리라는 것은 주머니 속 물건처럼 내가 필요할 때마다 꺼내고 사용할 수 있으며 수정할 수 있다.
여기까지가 내 생각이고 이후 정의를 한번 살펴보자.
프레임워크 (Framework)
프레임워크는 Frame + work로 합성어다.
Frame(틀)을 Work(일하다) 이용한다. 즉 틀을 가지고 활용한다 사용한다라고 볼 수 있다.
여기서 틀은 레고라고 생각하는 것도 좋다고 본다. 레고는 블록이라는 틀로 구성되어있으며 특정 모양을 가지고 여러 결과물(집, 차 등등)을 조립하여 만들어 볼 수 있다.
즉 레고 자체의 모양을 직접 바꿀 수 없게 틀로 구성된 자원을 가지고 특정 규칙을 통해(레고를 조립하는 방법) 결과물을 만들어 내는 것이다.
그래서 나는 이것을 환경이라고 외우고 있다.. 받아들이기 편한 비유법을 통해 이해하고 넘어간다면 오랫동안 기억할 수 있을 것이다.
그래서 이러한 Framework는 Spring, Spring Boot, Django 등이 존재한다.
해당 환경에서 특정 요소를 가지고 여러 결과물들을 만들 수 있기 때문이다. 다만 Spring이라는 틀에서 제공하는 요소 자체는 변경이 불가능하다.
라이브러리 (Library)
라이브러리는 그나마 친숙할 것이라 생각한다.
C, C++, Java, Python 등의 프로그래밍 언어를 공부하다 보면 공통적으로 코드 상단의 가장 처음 불러오는 것이 있다.
#include <stdio.h> // 스튜디오라는 헤더
#include <math.h> // 매스라는 헤더
int main()
{
printf("라이브러리는 무엇일까?");
return 0;
}
우리는 구현을 진행하며 이러한 header file 속의 함수를 가져와서 사용할 수 있고 또한 이러한 header file을 직접 만들어서 사용할 수도 있다.
/* header file */
#include <stdio.h>
# define SIZE 1024
# define MAX_NUM 2147483647
# define MIN_NUM -2147483648
typedef struct n_list
{
void *data;
struct n_list *next;
}
또 그건 아니다.
결과를 먼저 말하자면 라이브러리는 기계어로 번역된 바이너리이며 헤더 파일은 컴파일러가 컴파일하기 전 프로그래머가 이해할 수 있는 언어이고 컴파일러가 이런 헤더 파일들을 가지고 심볼네임을 만들고 후에 오브젝트파일이 생성된다. 이후 링커가 심볼네임을 가지고 라이브러리를 찾아 링크시키게 된다.
즉 헤더가 여러 개 모이는게 라이브러리가 아니며 라이브러리는 컴파일된 바이너리이므로 소스파일의 컴파일된 오브젝트파일들을 여러개 묶어놓은 것이 라이브러리이다.
오브젝트 파일은 리눅스, 맥에서는 (. o 파일로) 윈도우에서는 (. obj) 파일로 표현된다.
라이브러리는 리눅스의 경우 .a 로 표현되고 윈도우의 경우에는 .dll 로 표현된다.
그리고 간혹 맥에서 .dylib라는 파일도 있는데 이것은 동적 라이브러리라고 불리며 윈도우에서의 .dll과 유사하다.
자 여기까지 라이브러리를 헤더 파일을 통해 설명해보려고 했으며 이해하지 못해도 괜찮다! 사실 한 줄만 기억해도 상관없으며 후에 컴파일 과정을 꼼꼼하게 공부한 후 다시 한번 읽어본다면 조금 더 깊이 이해할 수 있을 것이다.
라이브러리는 내가 마음대로 수정하고 이용할 수 있는 것이라고 말했다.
라이브러리는 프레임워크보다는 작은 단위로 도구 모음 들이며 이러한 하나의 도구와 같은 것을 직접 만들 수도 수정할 수도 사용하지 않을 수도 있다.
즉 라이브러리는 도구의 모음이다.
프레임워크라는 환경 속에서 해당 프레임워크의 규칙을 지키며 아무 라이브러리나 불러서 사용할 수 있다.
나는 산이라는 프레임워크 속에서 나무를 베고 싶은데 (톱, 도끼)라는 라이브러리를 이용하겠다.
로 말할 수 있다.
엄밀히 따지자면 더 깊은 개념이 있다고 생각이 있으며 틀린 말도 있을 수 있다고 생각한다.
내가 아직 공부한 것이 부족할 수 있기 때문에..
그래도 이 두 가지 개념이 헷갈렸던 사람들은 이 글을 보고 조금 더 쉽게 이해하고 넘어갔으면 좋겠다.
'지식 창고' 카테고리의 다른 글
MSA란 무엇일까? (0) | 2023.01.10 |
---|---|
REST API란? (0) | 2022.09.12 |
HLS protocol 이란 무엇일까? (2) | 2022.09.11 |