💻 프로그래밍

Backend

백엔드

서버 측 로직을 처리하는 영역. 데이터베이스, API, 인증 담당. 프론트엔드와 대비.

📖 상세 설명

Backend(백엔드)는 사용자에게 직접 보이지 않는 서버 측에서 동작하는 소프트웨어 계층입니다. 웹 애플리케이션에서 Frontend가 사용자 인터페이스를 담당한다면, Backend는 데이터 처리, 비즈니스 로직, 보안, 인증 등 시스템의 핵심 기능을 담당합니다.

Backend 개발은 클라이언트-서버 아키텍처의 등장과 함께 발전해왔습니다. 초기에는 CGI(Common Gateway Interface)와 PHP가 주류였으나, 현재는 Node.js, Python, Go, Java, Rust 등 다양한 언어와 프레임워크가 사용됩니다. 특히 마이크로서비스 아키텍처의 확산으로 Backend 개발 방식도 크게 변화하고 있습니다.

Backend 개발자의 주요 업무는 API 설계 및 구현, 데이터베이스 모델링, 서버 성능 최적화, 보안 강화 등입니다. RESTful API나 GraphQL을 통해 Frontend와 통신하고, PostgreSQL, MongoDB, Redis 같은 다양한 데이터 저장소를 활용합니다. 또한 Docker와 Kubernetes를 활용한 컨테이너화, CI/CD 파이프라인 구축도 현대 Backend 개발의 필수 역량입니다.

AI 시대에 Backend의 역할은 더욱 확대되고 있습니다. ML 모델 서빙, 실시간 추론 API, 대용량 데이터 파이프라인 구축, LLM API 통합 등 AI 서비스의 핵심 인프라를 Backend에서 담당합니다. FastAPI, LangChain, Ray Serve 같은 AI 친화적인 도구들이 Backend 개발 생태계를 풍부하게 만들고 있습니다.

💻 코드 예제

// Node.js Express 백엔드 예제
const express = require('express');
const bcrypt = require('bcrypt');
const jwt = require('jsonwebtoken');

const app = express();
app.use(express.json());

// 사용자 데이터 (실제로는 DB 사용)
const users = [];

// 회원가입 API
app.post('/api/auth/register', async (req, res) => {
    try {
        const { email, password, name } = req.body;

        // 이메일 중복 체크
        if (users.find(u => u.email === email)) {
            return res.status(400).json({ error: '이미 등록된 이메일입니다' });
        }

        // 비밀번호 해싱
        const hashedPassword = await bcrypt.hash(password, 10);
        const user = { id: users.length + 1, email, password: hashedPassword, name };
        users.push(user);

        res.status(201).json({ message: '회원가입 성공', userId: user.id });
    } catch (error) {
        res.status(500).json({ error: '서버 오류' });
    }
});

// 로그인 API
app.post('/api/auth/login', async (req, res) => {
    const { email, password } = req.body;
    const user = users.find(u => u.email === email);

    if (!user || !(await bcrypt.compare(password, user.password))) {
        return res.status(401).json({ error: '인증 실패' });
    }

    const token = jwt.sign({ userId: user.id }, process.env.JWT_SECRET, { expiresIn: '24h' });
    res.json({ token, user: { id: user.id, email: user.email, name: user.name } });
});

// 인증 미들웨어
const authMiddleware = (req, res, next) => {
    const token = req.headers.authorization?.split(' ')[1];
    if (!token) return res.status(401).json({ error: '토큰 필요' });

    try {
        req.user = jwt.verify(token, process.env.JWT_SECRET);
        next();
    } catch {
        res.status(401).json({ error: '유효하지 않은 토큰' });
    }
};

// 보호된 리소스
app.get('/api/profile', authMiddleware, (req, res) => {
    const user = users.find(u => u.id === req.user.userId);
    res.json({ profile: { id: user.id, email: user.email, name: user.name } });
});

app.listen(3000, () => console.log('서버 실행 중: http://localhost:3000'));

🗣️ 실무에서 이렇게 말하세요

💬 회의에서
"이번 기능은 백엔드에서 캐싱 레이어를 추가해야 할 것 같습니다. Redis를 도입해서 DB 부하를 줄이고, API 응답 시간을 200ms 이하로 개선할 수 있어요. 프론트엔드 팀과 API 스펙도 조율이 필요합니다."
💬 면접에서
"백엔드 개발에서 가장 중요한 것은 확장성과 안정성이라고 생각합니다. 제가 담당한 프로젝트에서는 마이크로서비스 아키텍처를 도입하여 서비스별로 독립 배포가 가능하게 했고, 트래픽이 10배 증가했을 때도 수평 확장으로 대응할 수 있었습니다."
💬 코드 리뷰에서
"이 API 엔드포인트에서 N+1 쿼리 문제가 발생하고 있네요. ORM의 eager loading을 사용하거나 DataLoader 패턴을 적용해서 쿼리 수를 줄여주세요. 현재 구조로는 데이터가 많아지면 성능 이슈가 생길 수 있습니다."

이 주제로 모의면접 보기 → WIA SOOM AI 면접 · 무료로 시작

⚠️ 흔한 실수 & 주의사항

❌
민감한 정보 노출

API 응답에 비밀번호 해시, 내부 에러 스택, DB 스키마 등 민감한 정보가 포함되지 않도록 주의하세요. 프로덕션에서는 에러 메시지를 일반화하고, 응답 DTO를 명확히 정의해야 합니다.

❌
인증/인가 로직 부실

모든 보호된 엔드포인트에 인증 미들웨어를 적용하고, 리소스 접근 시 권한 검증(인가)을 반드시 수행하세요. 토큰 만료, 리프레시 토큰 로테이션, 세션 무효화 로직도 필수입니다.

✅
입력 검증과 에러 핸들링

클라이언트로부터 받는 모든 입력은 서버에서 재검증하세요. SQL Injection, XSS 방지를 위해 파라미터화된 쿼리와 입력 이스케이핑을 사용하고, 일관된 에러 응답 형식을 유지하세요.

🔗 관련 용어

📚 더 배우기