프레임워크와 라이브러리 — 뭐가 다른 거야?
코딩을 배우다 보면 "프레임워크"와 "라이브러리"라는 단어가 계속 나옵니다. Express는 "웹 프레임워크"이고, jQuery는 "라이브러리"이고, React는... 사실 "라이브러리"인데 "프레임워크처럼" 쓰인다고 합니다.
대체 뭐가 다른 걸까요?
실험실 비유: 키트 vs 시약
라이브러리 = 개별 시약
Bradford assay 시약을 떠올려보세요. 단백질 정량이 필요할 때 내가 꺼내서 쓰고, 안 쓸 때는 냉장고에 넣어둡니다. 실험 흐름은 내가 설계하고, 시약은 그중 한 단계에서만 등장합니다.
코드에서 라이브러리도 마찬가지입니다:
const axios = require("axios");
const response = axios.get("https://api.example.com/genes");axios라는 라이브러리를 내가 필요할 때 불러서 쓰고 있습니다. 전체 프로그램의 흐름은 내가 결정합니다.
프레임워크 = 실험 키트 (프로토콜 포함)
ELISA 키트를 떠올려보세요. 키트 안에 96-well plate, 항체, 버퍼, wash solution이 들어있고, 정해진 프로토콜대로 진행해야 합니다. 1단계: coating → 2단계: blocking → 3단계: 시료 추가... 순서를 바꾸면 결과가 안 나옵니다.
Express도 마찬가지입니다:
const express = require("express");
const app = express();
app.get("/samples", function(req, res) {
res.json({ message: "시료 목록" });
});
app.listen(3000);Express라는 프레임워크가 정한 구조 안에서, 내가 채워야 할 부분("/samples" 경로에서 무엇을 응답할지)만 작성합니다. app.get()이라는 틀 안에 내 코드를 넣는 것이지, 내가 HTTP 요청 처리 흐름 전체를 설계하는 것이 아닙니다.
핵심 차이: 누가 누구를 부르는가
| 라이브러리 | 프레임워크 | |
|---|---|---|
| 주도권 | 내가 코드를 쓰고, 필요할 때 라이브러리를 호출 | 프레임워크가 전체 흐름을 관리하고, 내 코드를 호출 |
| 비유 | 내가 시약을 꺼내 쓴다 | 키트 프로토콜이 나를 이끈다 |
| 코드 형태 | 라이브러리.함수() 내가 부름 | 프레임워크가 내 함수를 부름 |
| 자유도 | 높음 (원하는 대로 조합) | 낮음 (정해진 구조 안에서 작업) |
이 차이를 소프트웨어 공학에서는 **"제어의 역전(Inversion of Control)"**이라고 부릅니다. 라이브러리를 쓸 때는 내가 제어권을 가지지만, 프레임워크를 쓸 때는 프레임워크가 제어권을 가지고 내 코드를 적절한 시점에 호출합니다.
Express에서 app.get("/samples", function(req, res) { ... })를 쓸 때 — 이 콜백 함수를 내가 직접 실행하지 않습니다. 누군가 /samples에 접속하면, Express가 알아서 이 함수를 호출합니다. 이것이 "프레임워크가 나를 부르는" 구조입니다.
우리가 배운 것들의 분류
| 이름 | 분류 | 이유 |
|---|---|---|
| Express | 프레임워크 | 요청-응답 흐름을 Express가 관리. 내 코드는 콜백으로 끼워넣음 |
| React | 라이브러리 (공식) | UI 렌더링만 담당. 라우팅/상태관리는 별도 선택 |
| mysql2 | 라이브러리 | DB 연결이 필요할 때 내가 호출 |
| Next.js | 프레임워크 | 파일 구조, 라우팅, 빌드를 Next.js가 관리 |
React는 공식적으로 "라이브러리"입니다. 하지만 Next.js와 함께 쓰면 프레임워크처럼 동작합니다. 이 경계는 칼로 자르듯 명확하지 않습니다.
왜 프레임워크를 쓸까?
"자유도가 낮다면서, 왜 프레임워크를 쓰는 거야?"
일관성 — 팀원 10명이 각자 다른 구조로 서버를 만들면 유지보수가 불가능합니다. 프레임워크가 구조를 강제하면 누가 작성한 코드든 비슷한 패턴으로 읽을 수 있습니다.
반복 제거 — 라우팅, 에러 처리, 미들웨어 같은 것들을 매번 직접 만들면 시간이 낭비됩니다. 프레임워크가 이미 만들어둔 것을 씁니다.
검증된 설계 — 전 세계 수만 명의 개발자가 쓰고 테스트한 구조입니다. 혼자 설계한 것보다 버그가 적습니다.
실험에서도 마찬가지입니다. 자기만의 독자적인 assay를 만들 수도 있지만, 검증된 키트를 쓰면 결과의 신뢰성이 높고, 다른 연구자가 재현하기도 쉽습니다.
결론: 한 문장으로
라이브러리는 "내가 부르는 도구"이고, 프레임워크는 "나를 부르는 시스템"입니다.
Express를 쓸 때 app.get()에 콜백을 넣었던 기억을 떠올리세요. 그 콜백을 실행하는 것은 내가 아니라 Express였습니다. 그것이 프레임워크입니다.