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

+ Recent posts