웹서비스의 뼈대 — 백엔드란 무엇인가? 10가지 핵심(1)

웹서비스의 뼈대 — 백엔드란 무엇인가? | 10가지 핵심으로 완벽 이해하는 실무 가이드

웹서비스의 뼈대 — 백엔드란 무엇인가?

처음 실무에서 서버를 띄웠을 때 터미널에 Server running on port 3000이 찍혔습니다. 겉으론 아무 일도 일어나지 않은 것처럼 보였죠. 하지만 그 한 줄은 요청을 받고, 로직을 수행하고, 데이터를 안전하게 저장해 응답을 만드는 웹서비스의 심장이 뛰기 시작했다는 뜻이었습니다. 이 글은 그때 제가 넘었던 허들을 그대로 녹여, 백엔드의 전체 그림을 실무 관점으로 풀어드립니다. (키워드: 웹서비스의 뼈대 — 백엔드란 무엇인가?)

이 글에서 다루는 것
프론트엔드 vs 백엔드, 백엔드의 역할(요청 처리·데이터 저장·인증), HTTP Request → Server → Response 흐름, Node.js/Express 구조, 그리고 Hello World API 실습까지.

백엔드를 처음 접했을 때의 막막함

초반에 가장 큰 허들은 보이지 않는 결과였습니다. 프론트엔드는 버튼 하나만 바꿔도 화면이 즉시 달라집니다. 반면 백엔드는 “코드를 분명 수정했는데… 뭐가 달라졌지?”라는 느낌이죠. 여기서 관점을 바꾸면 편해집니다.

  • 시스템 관점: 화면이 아닌 요청-로직-데이터-응답의 파이프라인을 본다.
  • 관심사 분리: UI보다 정확한 로직, 데이터 무결성, 에러 회복력에 집중한다.
  • 관찰 가능성: 로그·메트릭·트레이싱으로 눈에 보이게 만든다.

실무에서 제게 전환점이 된 건 요청이 서버에 들어와서 어떤 미들웨어와 핸들러를 지나 어떤 데이터로 응답되는지를 로그로 따라가 본 경험이었습니다. 파이프라인이 보이면 백엔드는 쉬워집니다.

프론트엔드와 백엔드의 차이

구분프론트엔드백엔드
주요 역할UI/UX, 상호작용, 접근성, 렌더링 최적화도메인 로직, 데이터 관리, 인증/권한, 확장성
주요 기술HTML/CSS/JS, React/Vue/Svelte, SPA/SSR/CSRNode.js/Express, Spring, Django/FastAPI, DB/캐시/큐
관심사레이아웃, 반응성, 접근성, 성능정합성, 보안, 트랜잭션, 장애 복구
검증 포인트브라우저 테스트, 반응형, 렌더링 시간API 계약, 스키마, 로깅, 모니터링, SLA

브라우저 위의 프론트엔드

프론트엔드는 사용자와 직접 만납니다. 버튼 클릭, 입력 폼 검증, 화면 전환 같은 상호작용을 담당하죠. 네트워크 비용과 렌더링 성능을 끌어내려 좋은 경험을 제공합니다.

서버 뒤의 백엔드

백엔드는 요청을 받아 검증 → 비즈니스 로직 → 데이터 연동 → 응답 순으로 처리합니다. 이 과정에서 보안(입력 검증, 인증/권한, 암호화)과 안정성(트랜잭션, 재시도, 타임아웃)이 핵심입니다.

백엔드가 실제로 하는 일

요청(Request) 처리

  • 라우팅: URL/메서드에 따라 핸들러를 매핑합니다.
  • 유효성 검증: 스키마(예: zod/Joi)로 입력을 검증합니다.
  • 예외 처리: 표준화된 에러 응답(JSON)과 상태코드를 사용합니다.
  • 로깅/트레이싱: 요청 ID, 소요 시간, 오류 스택을 기록합니다.

데이터 저장과 데이터베이스 연동

관계형(SQL)과 문서형(NoSQL) 중 도메인에 맞는 스토리지를 고릅니다. 핵심은 정합성성능입니다.

  • 읽기 많은 트래픽은 캐시(Redis)로 완화
  • 쓰기 일관성은 트랜잭션과 고립성 수준으로 보장
  • 마이그레이션과 스키마 버저닝으로 진화 가능한 데이터 모델 유지

인증(Authentication)과 권한(Authorization)

인증은 “누구인가”, 권한은 “무엇을 할 수 있는가”입니다. 세션/쿠키, JWT, OAuth를 상황에 맞게 선택합니다. 최소 권한 원칙만료/갱신 전략을 명확히 하세요.

HTTP 요청/응답 흐름 (Request → Server → Response)

브라우저에서 요청이 시작되는 순간

  1. DNS 조회로 IP를 찾고,
  2. TCP 핸드셰이크(TLS 포함)로 연결을 맺은 뒤,
  3. HTTP 메서드(GET/POST/PUT/DELETE 등)와 헤더/바디를 전송합니다.
GET /api/hello HTTP/1.1 Host: localhost:3000 Accept: application/json User-Agent: Mozilla/5.0 

서버가 응답을 만드는 과정

  1. 미들웨어 체인에서 로깅, 인증, 파서(JSON/form) 수행
  2. 핸들러에서 도메인 로직 실행
  3. 직렬화해 JSON/HTML 등으로 응답
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 {"message":"hello, world"} 

HTTP 사양과 헤더에 대해 더 알고 싶다면 MDN 문서를 권합니다: MDN HTTP 개요

Node.js와 Express로 보는 서버 구조

Node.js 이벤트 루프 이해

Node.js는 단일 스레드로 논블로킹 I/O를 활용합니다. 디스크/네트워크 작업을 비동기로 넘겨 기다리는 동안 다른 요청을 처리할 수 있어, I/O가 많은 웹 API에 유리합니다. 콜백 지옥은 Promise/async-await로 완화합니다.

Express.js 라우팅 구성

Express는 미들웨어라우터 중심 프레임워크입니다. 요청은 미들웨어 체인을 순서대로 통과합니다.

// 라우터의 전형적인 뼈대 const express = require('express'); const app = express(); app.use(express.json()); // JSON 바디 파서 app.use(require('./middlewares/logger')); // 요청 로깅 app.get('/api/health', (req, res) => { res.json({ status: 'ok', ts: Date.now() }); }); app.use(require('./middlewares/error')); // 에러 핸들러 app.listen(3000); 

Express 공식 문서도 함께 참고해 보세요: Express 공식 사이트

실습: Hello World API 만들기

프로젝트 세팅과 환경 준비

  1. Node.js LTS 설치
  2. 프로젝트 초기화:
    mkdir hello-api && cd hello-api npm init -y npm install express 
  3. package.json에 스크립트 추가(선택):
    { "name": "hello-api", "version": "1.0.0", "main": "index.js", "type": "commonjs", "scripts": { "start": "node index.js", "dev": "node index.js" } } 

Express 서버 작성

index.js 파일을 생성하고 아래 코드를 붙여 넣습니다.

const express = require('express'); const app = express(); // 간단한 요청 로깅 미들웨어 app.use((req, res, next) => { const start = Date.now(); res.on('finish', () => { const ms = Date.now() - start; console.log(`${req.method} ${req.url} - ${res.statusCode} (${ms}ms)`); }); next(); }); // Hello World 엔드포인트 app.get('/api/hello', (req, res) => { res.status(200).json({ message: 'hello, world' }); }); // 존재하지 않는 라우트 처리 app.use((req, res) => { res.status(404).json({ error: 'not_found' }); }); // 에러 처리기 app.use((err, req, res, next) => { console.error(err); res.status(500).json({ error: 'internal_error' }); }); const PORT = process.env.PORT || 3000; app.listen(PORT, () => { console.log(`Server running on port ${PORT}`); }); 

요청과 응답 테스트

  1. 서버 실행: npm start
  2. 브라우저에서 http://localhost:3000/api/hello 접속
  3. 또는 터미널에서:
    curl -i http://localhost:3000/api/hello 

정상이라면 아래와 유사한 응답을 확인합니다.

HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8

{"message":"hello, world"}
실무 팁
1) 라우트는 리소스 중심으로 설계(/api/users, /api/tokens).
2) 오류 응답 형식을 표준화({ code, message, details }).
3) 공통 헤더(요청 ID)와 타임아웃을 미들웨어로 통일.
4) 개발/스테이지/운영 환경 값을 dotenv로 분리.

다시 묻는다: 웹서비스의 뼈대 — 백엔드란 무엇인가?의 핵심

  • 백엔드는 문제를 푸는 서비스 로직데이터의 신뢰성을 책임집니다.
  • HTTP 요청에서 응답까지 한 줄 로그로 스토리를 추적하세요.
  • 작게 시작하되(Hello World), 표준화관찰 가능성을 일찍 도입하세요.

FAQ: 자주 묻는 질문

Q1. 프론트엔드 개발자인데 백엔드로 넘어가려면 무엇부터?

HTTP 기본(메서드·상태코드·헤더) → Node.js 런타임 감각 → Express로 REST API 만들기 → DB(관계형/문서형) CRUD → 인증/권한 순서로 추천합니다.

Q2. 데이터베이스는 무엇을 선택해야 하나요?

거래·정합성 중심이면 관계형(PostgreSQL/MySQL), 스키마 유연성과 빠른 개발이면 문서형(MongoDB). 읽기 많은 트래픽엔 Redis 캐시를 곁들여 보세요.

Q3. JWT와 세션의 차이는?

세션은 서버 저장(상태ful) 모델, JWT는 토큰 자체에 정보가 담긴 상태less 모델입니다. 규모·보안 요구·회수 전략에 따라 선택하세요.

Q4. 에러 처리는 어떻게 표준화하나요?

에러 코드를 사전에 정의하고(예: INVALID_INPUT, UNAUTHORIZED) JSON 스키마를 고정합니다. 요청 ID로 로그를 묶으면 추적이 쉬워집니다.

Q5. 로컬에서만 되는데 서버에 올리면 안 돼요.

환경 변수 누락(.env), 포트 충돌, CORS 설정, 방화벽, 바인딩 주소(0.0.0.0) 등을 점검하세요. 프로세스 매니저(PM2)와 헬스 체크도 유용합니다.

Q6. Next.js 같은 프레임워크로도 백엔드를 대체할 수 있나요?

간단한 API나 서버 액션은 충분히 가능하지만, 복잡한 도메인 로직·권한·대규모 트래픽·백그라운드 잡이 있다면 전용 백엔드가 더 적합합니다.

마무리 — 문제를 푸는 기술로서의 백엔드

백엔드는 “화면을 그리는 기술”이 아니라 “문제를 푸는 기술”입니다. 오늘은 프론트엔드와 백엔드의 차이, 백엔드의 핵심 역할, HTTP 요청/응답 흐름, Node.js·Express 구조, 그리고 Hello World API까지 실습했습니다. 다음 편에서는 라우팅을 확장하고, 데이터베이스를 붙여, 인증을 도입하는 단계로 나아가 보겠습니다. 여기까지 따라오셨다면, 이미 “웹서비스의 뼈대 — 백엔드란 무엇인가?”를 실무 관점에서 이해하신 겁니다.


외부 자료 · MDN HTTP 개요 · Express 공식 사이트


댓글 남기기