[Basis] 내가 보려고 정리하는 개발 용어 사전 (1) - 프레임워크(Framework)와 라이브러리(Library)

2023. 5. 29. 12:49Developer Basis

개발 공부를 한 지 2년이 훌쩍 지났다.

하지만, 학교에서도 복수전공은 한 학기 수업 정도, 나머지 1년 반 정도의 시간은 군대에서 보내느라.. 아직까지 내 머릿속에는 개발과 관련된 용어들이 명확하게 정리 (여기서 말하는 "명확하게 정리"란 내가 누군가에게 나의 용어대로 설명을 해줄 수 있는 상태를 말한다.) 되지 않은 상태이다. 아니, 사실 제대로 배운 기회가 아직까지 없었다.

결국은 개발자라면, 한 번쯤은 확실하게 배우고 정리해야 하는 부분들을 앞으로는 "개발 용어 사전"이라는 키워드로 모아서 공부하고, 틈틈이 블로그에 글을 써보려고 한다.

아마 나뿐만 아니라 많은 주니어 개발자들도 대충 각각의 개발 용어들이 무엇을 뜻하는지는 알지만, 정확하게 어떠한 특성을 가지고 있고, 차이점들은 무엇이고 등을 면접관이 질문을 한다고 했을 때 섣불리 대답을 하지 못하는 경우가 있을 거라 생각한다. 
결국 우리에게 필요한 것은 "공부"이다.

오늘은 그 첫 번째로, 프레임워크(Framework)와 라이브러리(Library)의 차이점에 대해서 자세하게 알아보려고 한다.

 

1️⃣ 먼저, 프레임워크(Framework)에 대해 자세하게 이해해보자

복잡한 문제를 해결하거나 서술하는 데 사용되는 기본 개념 구조이다. (위키백과)
어떠한 목적을 달성하기 위해 복잡하게 얽혀있는 문제를 해결하기 위한 구조이며, 소프트웨어 개발에 있어 하나의 뼈대 역할을 한다.

Frame(뼈대, 틀의 의미) + work(일, 문제의 의미)

사전적 개념과 단어만 보더라도 바로 어떤 뜻인지 어느 정도 유추 가능할 것이라 생각된다.

어떤 일이나 문제를 해결하기 위해서 제시해 주는 골격과 뼈대, 틀의 느낌이 바로 프레임워크다.
골격, 뼈대, 틀의 느낌이기에 어떠한 문제를 해결하기 위해 필요한 기능을 제공해 주지만, 그것들에는 어느 정도 일정한 형태와 규칙(매뉴얼)이 있기에 반드시 지켜줘야만 한다.

그 뼈대와 틀을 들여다보면, 클래스(Class)와 라이브러리(Library)가 합쳐져 있다.

프레임워크의 예시로는, iOS 앱 개발에 사용되는 Cocoa Touch나 Python 서버 개발을 할 때 사용하는 Django, Flask 등이 대표적이다.

 

2️⃣ 이번에는 라이브러리(Library)에 대해 자세하게 이해해 보자

주로 소프트웨어를 개발할 때 컴퓨터 프로그래밍이 사용하는 비휘발성 자원의 모임이다. (위키백과)
소프트웨어의 구성요소 중 한 가지로, API를 기반으로 대상 환경(플랫폼)에서 바로 실행될 수 있도록 모듈화 된 프로그램 모음이다. 

한국어 뜻 도서관이나, 영어 라이브러리의 느낌과 같이 무언가 정리되어 있는 곳에서 내가 원하는 것을 꺼내어서 사용하는 느낌과 같다.
더 자세하게 설명하자면, 프로그래밍 속 특정한 기능을 구현하기 위해 미리 만들어진 함수들의 집합 혹은 코드 작성 시 활용 가능한 일종의 도구들을 통틀어 라이브러리라고 말한다.

라이브러리의 대표 예시로는, Python 데이터 분석을 공부하면서 import 했던 넘파이(Numpy), 판다스(Pandas) 등이 있겠다.

 

3️⃣ 두 용어가 헷갈리는 이유 - 공통점이자 두 용어의 혼용 사용

두 개의 개념을 배워본 지금, 어떻게 프레임워크와 라이브러리의 차이가 와닿는가?

아니. 절대 아닐 것이다. 
솔직히 까놓고 말해서, 위 두 개의 용어가 엄밀히 다르다고 말해야 하는 나 역시도 위의 설명으로는 명확한 차이점을 두기가 조금 그렇다.
글을 읽는 주니어 개발자 입장에서는 오히려 두 개의 개념이 "그래서, 뭐가 다른 거야?" 하면서 더 큰 혼란이 오지 않았을까 생각이 든다.

그 생각이 절대 잘못된 것이 아니다.
프레임워크와 라이브러리는 결국, 프로그래밍을 쉽게 할 수 있도록 도와주기 위해서 재사용이 가능하도록 미리 만들어둔 코드 모음에 지나지 않기 때문이다.

그래서 이 두 개념이 항상 헷갈렸던 이유도 명확한 차이점을 두고 두 용어를 구분하기보다는,
요즘에는 코드 모음을 만들어둔 개발자가 라이브러리라고 하면 라이브러리라 부르고, 프레임워크라고 부르면 프레임워크라고 부르는 추세였기 때문이다.

 

4️⃣ 그래서, 프레임워크와 라이브러리의 명확한 차이점이 뭔데?

하지만, 결국 면접에서 "프레임워크와 라이브러리의 차이점"을 물어봤을 때, 답할 수 있어야 하는 우리 주니어 개발자들을 위해 명확하게 이제 설명해 보겠다.

프레임워크와 라이브러리의 가장 큰 차이점은 제어 흐름(Flow)을 누가 갖고 있느냐이다.

이게 무슨 말인고 하면, 프레임워크는 전체적인 흐름을 프레임워크 스스로가 갖고 있고, 라이브러리는 제어할 수 있는 권한이 개발자에게 있다는 것이 가장 큰 차이점이라는 것이다.

프레임워크, 라이브러리, 코드 사이의 관계를 설명하는 사진

조금 더 자세하게 이해해 보자.
파이썬에서 Pandas를 사용했을 때를 생각해 보면, 개발자인 내가 코드를 짜다가 필요한 연산이 있을 때 라이브러리 안에 있는 모듈을 호출해서 내가 사용하고 싶은 곳에 사용을 했었다.
이처럼, 라이브러리(Library)는 개발자가 능동적으로 코드를 짜다가, 필요할 때마다 호출하면서 사용하는 것이다. 

하지만 프레임워크는 가져다가 사용한다는 느낌과는 다르다.
iOS 개발을 할 때, Cocoa Touch를 필요할 때만 가져다가 쓰는 것인가? 
서버 개발을 할 때, Django나 Flask를 개발자가 필요한 경우에만 가져다가 쓰는 것인가?
아니다.

Cocoa Touch Framework라는 큰 틀 아래에서 개발자가 iOS 어플을 개발하는 것이고, Django나 Flask라는 큰 뼈대 아래에서 서버를 구축해나가지 않는가.
이처럼, 프레임워크(Framework)는 큰 틀 아래에서 개발자가 들어가 수동적으로 동작되는 것이다. 
그래서 "제어역전(IoC, Inversion of Control)"이란 생소한 용어도 등장하게 되는데, 말 그대로 개발자가 해왔던 제어(능동적이고 필요할 때마다 쓰는 느낌)를 프레임워크가 대신해 준다는 뜻이다. 전혀 생소하거나 어렵게 느낄 것이 없다.

프레임워크가 라이브러리보다 훨씬 큰 개념이라는 것이 이제 와닿는가?
결국, 프레임워크는 라이브러리를 포함하는 개념이다.

마지막으로 정리해 보자. 이해하기 쉽도록 떡볶이를 가지고 예시도 들어봤으니 천천히 따라가보자~!

프레임워크(Framework)는 수동적으로 개발자가 큰 뼈대 아래에서 동작하는 것 (큰 뼈대의 개념)
-> 떡볶이를 만들다고 할 때, 떡볶이 밀키트가 프레임워크의 느낌
-> 어느 정도 틀이 갖추어져 있지만, 떡볶이의 맛은 내가 떡볶이를 만드는 것보다 밀키트 회사에 따라 정해진다. 맛의 권한이 나한테는 없다.

라이브러리(Library)는 능동적으로 필요할 때마다 개발자가 가져다가 사용하는 것 (호출의 개념)
-> 떡볶이를 만든다고 할 때, 어묵, 떡, 접시, 프라이팬 등 각종 재료가 다 갖춰져 있는 주방이 라이브러리의 느낌
-> 정해져 있는 틀 없이, 요리사인 나에 따라서 도구나 재료들을 자유롭게 꺼내서 사용할 수 있다.