Database 기본 구조와 백엔드 개발자의 관점

3줄 요약

  • 백엔드 개발자에게 Database는 단순 저장소가 아니라 API 응답 시간, 장애 전파, 데이터 정합성을 함께 결정하는 핵심 의존성이다.
  • 하나의 요청은 애플리케이션 스레드, 커넥션 풀, DB 세션, 버퍼 캐시, WAL/binlog, 락, 디스크 I/O를 통과하며 병목은 어느 지점에서도 생길 수 있다.
  • 실무 판단은 “쿼리가 맞는가”에서 끝나지 않고 “동시 요청에서 버티는가”, “장애 때 실패를 제한하는가”, “운영자가 관측하고 복구할 수 있는가”까지 포함한다.

핵심 정리

  • Database는 영속성, 동시성 제어, 트랜잭션, 제약 조건, 인덱스, 실행 계획, 복구 로그를 제공한다. 백엔드 코드는 이 기능들을 API 계약 뒤에서 사용한다.
  • 서버 개발자가 DB를 모르면 느린 API, 커넥션 풀 고갈, 데드락, 읽기 지연, 마이그레이션 장애를 코드 문제로만 오해하기 쉽다.
  • 하나의 SQL은 네트워크 왕복, 파싱, 최적화, 실행, 락 대기, 버퍼 접근, WAL/binlog 기록, 결과 전송 비용을 가진다. ORM을 써도 이 비용은 사라지지 않는다.
  • DB의 한계는 CPU보다 먼저 연결 수, I/O, 락 경합, hot row, 오래 열린 트랜잭션, 잘못된 인덱스에서 드러나는 경우가 많다.
  • 개인 프로젝트에서도 타임아웃, 커넥션 풀 크기, 마이그레이션 이력, 기본 인덱스, 백업과 복구 연습은 챙겨야 한다. 작은 서비스일수록 APM, DBA, 온콜 체계가 없어서 장애 원인을 더 직접 추적해야 한다.
  • 기업 환경에서는 인프라/DBA와 같은 언어로 대화해야 한다. active connection, lock wait, slow query, replica lag, IOPS, buffer cache hit, WAL, vacuum 같은 지표를 코드 변경과 연결해 설명할 수 있어야 한다.

헷갈리는 지점

  • DB는 저장만 담당한다고 생각하기 쉽다. Repository나 DAO 뒤에 숨겨져 있어 실제 실행 비용이 보이지 않기 때문이다.
    • 핵심은 DB가 저장뿐 아니라 동시성, 정합성, 복구, 실행 계획까지 담당한다는 점이다.
    • API 성능과 장애는 애플리케이션 코드와 DB 내부 동작이 합쳐진 결과다.
  • 서버를 많이 늘리면 DB 문제도 같이 해결된다고 오해하기 쉽다. 웹 서버는 수평 확장이 쉬운 편이기 때문이다.
    • 핵심은 DB가 공유 상태를 가진 병목 지점이라는 점이다.
    • 애플리케이션 인스턴스를 늘리면 오히려 DB 연결 수와 동시 쿼리가 증가해 병목이 빨리 드러날 수 있다.
  • 쿼리가 개발 환경에서 빠르면 운영에서도 괜찮다고 판단하기 쉽다. 데이터 양과 동시성이 작을 때는 실행 계획 문제가 숨어 있기 때문이다.
    • 핵심은 운영 성능은 데이터 분포, 통계, 캐시 상태, 동시 요청, 락 상황에 따라 달라진다는 점이다.
    • 중요한 API는 샘플 데이터가 아니라 운영에 가까운 규모와 실행 계획으로 확인해야 한다.
  • DB 지표는 인프라 팀만 보면 된다고 생각하기 쉽다. 백엔드 코드는 SQL 호출 수, 트랜잭션 길이, pool 사용량, migration lock을 직접 만들기 때문이다.
    • 핵심은 장애 공유 때 endpoint, 배포 시각, 실제 SQL, bind 값 패턴, 호출량, pool 지표, lock wait 여부를 함께 전달하는 것이다.
    • 인프라/DBA는 내부 지표를, 백엔드 개발자는 기능 맥락과 코드 변경 이유를 제공할 때 해결 속도가 빨라진다.

확인 질문

  • 백엔드 개발자에게 DB가 단순 저장소가 아닌 이유는 무엇인가?
    • DB가 API 응답 시간, 트랜잭션 정합성, 락 대기, 장애 전파, 복구 가능성을 함께 결정하기 때문이다.
  • 애플리케이션 서버를 늘렸는데 DB 장애가 더 심해질 수 있는 이유는 무엇인가?
    • 서버 인스턴스가 늘면서 커넥션 풀과 동시 쿼리가 늘어나 DB의 연결 수, I/O, 락 경합 한계를 더 빨리 압박할 수 있기 때문이다.
  • 개인 프로젝트에서도 DB 운영 기본기를 챙겨야 하는 이유는 무엇인가?
    • 작은 서비스도 장애가 나면 원인 분석과 복구가 필요하며, 타임아웃, 백업, 마이그레이션, 인덱스 같은 기본 장치가 없으면 문제를 재현하고 고치기 어렵기 때문이다.
  • 인프라/DBA에게 DB 장애 상황을 공유할 때 백엔드 개발자가 가져가야 할 정보는 무엇인가?
    • 발생 시각, endpoint, trace id, 실제 SQL과 bind 값 패턴, 호출량 변화, pool active/idle/pending, lock wait, 최근 배포와 batch 실행 여부다.