프로그래밍을 해본 사람들이라면 이 두 단어들을 많이 들어봤을 것이다. 하지만 필자도 이 단어에 대해 자세히 알아본 경험은 없기에 느낌적으로 우리가 개발을 하는데 도움을 주는 친구들.. 정도의 느낌으로 다가온다. 이번 글로 이 두 단어의 개념과 차이점, 상황에 따른 선택 등에 대해 알아보고자 한다.
먼저 프레임워크와 라이브러리에 대한 개념들을 한가지 예를 들어 살펴보자.
글을 쓰는 날 기준 어제가 복날이어서 우리가 치킨집을 창업한다고 한다면 우선 치킨을 튀기기 위한 재료와 도구들을 사서 치킨을 튀겨볼 것이다. 맛이 없다면 새로운 치킨을 튀겨보고 여러 번 반복한다면 맛있는 치킨을 튀길 수 있는 방법을 찾을 것이다. 하지만 치킨집은 치킨만 잘 튀긴다고 되는 것이 아니라 가게를 구하고, 상호명을 정하고, 가게를 등록하고… 엄청 많은 다른 과정들이 필요하다. 이런 과정들이 현실에서도 많이 어려운 만큼 우리 주변엔 BBQ, BHC, 60계, 푸라닭 등등 다양한 치킨 프렌차이즈들이 많이 보이고 실제로 치킨집을 연다고 하면 이런 프렌차이즈를 이용할 것이다.
이때 치킨 가게를 열 때 쉽게 열 수 있도록 도움을 주는 프렌차이즈 회사가 프레임워크로 비유 가능하다. 하지만 가게를 여는 것은 프렌차이즈를 이용하지 않고도 다양한 창업 보조 회사들을 잘 골라서도 가능한데 이런 보조 회사들을 라이브러리라고 비유할 수 있다.
프레임워크
개념
- 프레임워크의 단어는 뼈대, 하부 구조와 같은 뜻을 가지고 있다.
- 소프트웨어 관점에서의 프레임워크는 소프트웨어를 개발하는데 있어 개발자가 더 쉽게 구현할 수 있도록 도와주며 개발 시간을 줄이고 코드의 재사용성을 증가시키기 위해 클래스 등과같은 기초들을 일정 규칙에 따라 제공하는 것이다.
특징
- 개발자에게 기초적인 가이드를 제공한다.
- 자주 쓰이는 것들을 모아둔 클래스나 컴포넌트 제공한다.
- 프레임워크마다 개발할 수 있는 범위가 정해져있다.
- 개발편의성을 주기 위한 도구이기 때문에 다양한 도구, 플러그인 등을 지원한다.
장점
- 개발편의성을 위해 만들어진 만큼 개발 시간을 줄일 수 있다.
기본적으로 세세한 기능들과 이런 기능들의 연결에 많은 시간이 소비되기도 하는데 이런 부분들을 프레임워크가 기본 제공해주고 있기 때문에 개발 시간을 줄일 수 있다.
- 기본 틀이 정형화 되어있어 일정 수준의 품질을 기대 할 수 있다.
어느 정도 검증이 되어 있기도 하고 내부의 기능들을 많이 활용하게 되면 그것에 대한 품질은 보증되어 있기 때문이다.
- 유지-보수가 쉽다.
개발자 간 규격화 되고 통일화된 부분을 공통적으로 사용하고 결국 개발자는 비즈니스 로직 관련 부분에 집중 가능하게 된다. 이는 체계적인 관리가 가능해지기 때문에 유지보수에 강점이 생긴다.
단점
- 프레임워크에 의존하면 본연의 개발 능력만을 이용하는 것이 아니기 때문에 개발 능력이 떨어질 수 있다.
- 개발에 활용하기 위해선 해당 프레임워크를 공부해야 하기에 이런 부분에서 시간이 걸린다.
→ 단점이라고 적긴 했지만 이는 장점에 비해 아주 사소한 것이기 때문에 프레임워크를 사용하지 않을 이유가 적다.
예시
프레임워크는 개발을 도와주는 도구인 만큼 정말 다양하다. 그 중 아래와 같은 도구들이 있고 이 중에서 가장 유명하다고 할 수 있는 Spring을 비롯해 조금 더 적어봤다.
- Java의 Spring: 자바 애플리케이션 개발을 도와주는 프레임워크
- POJO: 순수 자바를 이용한 객체
- IoC / DI(제어역전, 의존성 주입): 의존 관계는 개발자가 직접 구현하기에 반복작업이 필요하다. 이런 것을 스프링이 대신 해주는 것이다. (한 객체가 외부에서 객체를 가져온다고 하면 주체인 객체와 대상인 객체를 연결시켜주는 도구가 필요하기 때문에 이와 같은 프레임워크가 생겨남. )
- AOP(관계 지향 프로그래밍): 개발 할 때 해당 프로젝트에 전반에 걸쳐 적용되는 공통 기능을 동작 로직으로부터 분리해 내는 것.
- PSA(일관된 서비스 추상화): 데이터베이스를 예로 들면 데이터베이스 프로그램을 같은 sql 계열 중에서 바꾼다면 이런 변경에 대응해서 자동으로 프로그램에 맞게 적용해주는 것과 같은 편의성을 말한다.
- Python의 Django
- iOS, macOS의 Cocoa
- Android의 Android 프레임워크
라이브러리
개념
- 이 단어도 사전적 의미는 도서관 이란 뜻이다. 도서관 처럼 다양한 정보가 책이라는 집합으로 이뤄져 정리되어 있는 것을 떠올리면 될 것 같다.
- 소프트웨어의 라이브러리는 특정 기능을 개발하기 위해 필요한 것들을 미리 구현해 둔 도구 혹은 함수들의 집합이라고 할 수 있다. 여기에는 미리 작성된 코드, 변수, 함수, 클래스 등이 있을 것이고 개발자가 개발하는 도중 필요한 것들을 호출해 사용 가능하다.
특징
- 특정 함수, 클래스, 컴포넌트 등을 모아둔 집합이기 때문에 누구나 만들 수 있다.
- 특정 동작에 대한 로직을 구현해 둔 것이기 때문에 활용이 보다 간편하다.
예시
- c++의 표준 템플릿 라이브러리(STL)
- HTM의 클라이언트 사이드 조작을 단순화하는 jQuery
- React
- React라는 단어는 많이 들어봤어서 익숙하지만 그동안 Spring 같은 프레임워크라고 생각했다. 이것이 왜 라이브러리인지 아래의 차이점에서 살펴볼 것이다.
- 딥러닝 개발의 Tensorflow와 Pythorch
- 학교 수업 중 인공지능 시간에 Pytorch를 썼었는데 인공지능 학습에 필요한 기본적인 함수들, 순전파와 역전파, 학습에 따른 다양한 수치와 같은 것들을 아주 간편하게 할 수 있도록 되어있다.
프레임워크와 라이브러리의 차이점
가장 중요한 포인트는 제어 흐름의 주도권이다.
간단하게 말하면 흐름을 개발자가 컨트롤 한다면 라이브러리, 소프트웨어가 컨트롤 한다면 프레임워크이다. 여기서 자바의 Spring을 간단 설명할 때 적은 제어 역전에 대한 설명이 필요하다.
- 제어 역전
- 어떤 일을 하도록 만들어진 프레임워크에게 제어의 권한을 넘김으로써 클라이언트 코드(개발자가 작성한 코드)가 고민해야 할 부분을 줄이는 전략.
- 조금 더 쉽게 생각하면 프레임워크를 사용하지 않는다고 하면 프로그램의 시작부터 종료까지 모든 부분에 대한 오류 가능성 등을 체크하면서 구현을 해야 하지만 프레임워크를 이용한다면 개발자에게 기초적인 시작과 끝은 미리 구현 했으니 이 사이에 들어가야 하는 로직에 대한 구현만 하라고 하는 것이다.
이런 제어 역전을 생각해 본다면 결국 프레임워크를 사용한다는 것은 프레임워크가 정해둔 규칙 아래에서 내가 구현하고자 하는 것을 구현하고 프레임워크에 넘겨주는, 즉 프레임 워크의 동작에 내 구현을 얹어서 하는 방식으로 동작하는 것이다. 이는 곧 프레임워크를 사용하면 수동적으로 동작을 구현하게 된다는 뜻이다.
하지만 라이브러리를 사용한다는 것은 라이브러리가 정해둔 변수, 함수, 객체와 같은 것을 내가 원할 때 사용하고 이런 데이터들을 내가 원하는 방식대로 변환해 사용하게 된다. 이는 곧 개발된 프로그램의 흐름을 개발자가 제어하고 그 제어가 더 쉽게 될 수 있도록 라이브러리가 도와주는 꼴이 된다.
프레임워크와 라이브러리의 관계

이의 관계는 이 그림 하나로 정리할 수 있다.
- 프레임워크를 불러온다.
- 사용자는 프레임워크에 포함된 라이브러리를 이용해 코드를 작성한다.
- 라이브러리는 이런 사용자의 호출에 맞게 필요한 정보를 제공한다.
- 프레임워크는 사용자가 작성한 코드를 가져와서 프레임워크의 흐름에 사용자의 로직을 집어 넣는다.
결론
- 개발자 한 명 한 명이 모든 것을 구현한다는 것은 비용이 많이 들고 시간도 오래 걸리기 때문에 프레임워크와 라이브러리를 이용해 비용과 시간을 단축할 수 있다.
- 프레임워크는 개발자의 사용성을 증대시키기 위해 특정 규칙을 따르는 구성(클래스, 함수 등 혹은 이를 포함하고 있는 라이브러리 등)을 제공하고 이런 규칙에 따라 개발자가 개발 할 수 있도록 환경을 제공해준다.
- 라이브러리는 개발자가 반복적으로 필요하거나 하나하나 구현하기 어려운 것들을 모아서 개발할 때 필요한 함수, 변수, 객체 등을 수월하게 작성할 수 있도록 돕와주는 코드들의 집합이다.
- 제어 역전은 프로젝트의 개발에 있어 전반적인 흐름에 대한 제어를 개발자가 아닌 환경이 할 수 있도록 하는 것이다.
- 프레임워크는 개발자가 작성한 코드를 가져와서 프레임워크의 흐름에 넣어 동작하는 것이다. 이런 구조상 개발자는 프레임워크가 제공하는 자원과 규칙에 따라서 코드를 작성해야 하는 의무를 지니게 되기 때문에 수동적인 개발을 하게 된다.
- 라이브러리는 이런 프레임워크 안에 들어가서 개발을 도와주기도 하지만 기본적으로는 개발자가 필요하다고 하는 자원들을 제공해 주고 개발자는 이런 자원을 이용해 필요한 데이터를 형성한다. 여기서 개발자는 데이터의 흐름을 직접 구현하기 때문에 능동적인 개발을 하게 된다.
참고 자료
https://webclub.tistory.com/458
https://sharonprogress.tistory.com/169
https://velog.io/@whitecloud94/프레임워크-vs-라이브러리
https://idkim97.github.io/2022-08-16-프레임워크 vs 라이브러리/#google_vignette