1. 라이브러리
  2. 서버와 인프라
  3. 서버 기초

업데이트됨 1개월 전

누군가 "웹 서버가 다운됐다"고 말할 때, 두 가지 전혀 다른 상황을 의미할 수 있습니다:

  1. 컴퓨터 자체가 고장난 경우 — 정전, 하드웨어 장애, 운영체제 충돌
  2. 컴퓨터는 정상 작동 중인데 웹 서버 소프트웨어가 충돌한 경우

두 경우는 대응 방법이 다릅니다. 첫 번째는 인프라 비상사태입니다. 두 번째는 프로그램 하나를 재시작하면 해결될 수도 있습니다. 어떤 문제인지 구분하지 못하면, 효율적으로 해결할 수 없습니다.

바로 이것이 서버와 서비스를 구분하는 것이 중요한 이유입니다.

핵심 차이점

서버는 컴퓨터입니다 — 물리적 하드웨어 또는 가상 머신. CPU, 메모리, 저장장치, 그리고 네트워크 연결을 갖추고 있습니다. 운영체제를 실행합니다. 작업을 수행할 토대를 제공합니다.

서비스는 그 컴퓨터에서 실행되는 소프트웨어입니다. 실제 작업을 수행합니다 — 요청에 응답하고, 데이터를 처리하고, 웹 페이지를 제공하고, 데이터베이스에 기록을 저장합니다.

서버는 식당 건물입니다. 서비스는 그 안에서 일하는 직원들입니다. 건물은 공간, 전기, 배관을 제공합니다. 하지만 요리사가 음식을 만들고, 바텐더가 음료를 만들고, 안내원이 손님을 자리로 안내합니다. 건물이 없으면 일할 공간이 없습니다. 직원이 없으면 건물은 아무도 섬기지 못합니다.

하나의 서버, 여러 서비스

일반적인 서버는 여러 서비스를 동시에 실행합니다:

  • 웹 서버 서비스 (Nginx, Apache)가 HTTP 요청을 받습니다
  • 애플리케이션 서비스가 비즈니스 로직을 실행합니다
  • 데이터베이스 서비스 (PostgreSQL, MySQL)가 데이터를 저장하고 조회합니다
  • 캐싱 서비스 (Redis)가 반복 작업을 빠르게 처리합니다
  • 모니터링 서비스가 나머지 모든 것을 감시합니다

각각은 별도의 프로그램입니다. 서버의 자원 — CPU 시간, 메모리, 디스크 공간 — 을 공유하며, 운영체제가 이를 관리하여 서로 간섭 없이 공존할 수 있습니다.

바로 이 때문에 문제 해결 시 이 구분을 아는 것이 중요합니다. 데이터베이스 서비스가 충돌하면, 해당 서비스를 재시작합니다. 웹 서버는 계속 실행됩니다. 캐시된 페이지를 요청하는 사용자는 전혀 알아채지 못합니다. 하지만 서버의 전원이 끊기면, 모든 것이 한꺼번에 멈춥니다.

"서버"가 모든 곳에 등장하는 이유

"서버"를 컴퓨터와 소프트웨어 양쪽에 모두 사용하기 때문에 용어가 혼란스러워집니다.

"웹 서버"는 다음을 의미할 수 있습니다:

  • 웹 트래픽 처리에 전용된 컴퓨터
  • HTTP 요청을 처리하는 소프트웨어인 Nginx 또는 Apache

"데이터베이스 서버"는 다음을 의미할 수 있습니다:

  • 데이터베이스 작업에 최적화된 머신
  • 데이터를 관리하는 소프트웨어인 PostgreSQL 또는 MySQL

문맥으로 대개 명확해지지만, 항상 그렇지는 않습니다. 정확성이 중요할 때 — 장애 대응, 아키텍처 논의, 또는 문서 작성 시 — 어느 쪽을 의미하는지 명시하세요.

서비스를 서비스답게 만드는 것

서비스는 일반 애플리케이션과 구분되는 특성을 공유합니다:

사용자 인터페이스 없이 실행됩니다. 아무도 로그인해서 "시작"을 클릭하지 않습니다. 서비스는 서버가 부팅될 때 시작되어 백그라운드에서 계속 실행됩니다.

네트워크 포트에서 대기합니다. 웹 서비스는 포트 80 또는 443에서 대기합니다. 데이터베이스 서비스는 포트 5432 또는 3306에서 대기합니다. 클라이언트가 이 포트로 요청을 보내면 서비스가 응답합니다. 포트가 다르기 때문에 많은 서비스가 하나의 서버에서 공존할 수 있습니다.

지속적인 운영을 위해 설계되었습니다. 서비스에는 충돌 시 자동 재시작, 정상 작동 여부를 확인하는 상태 점검, 데이터 손실을 방지하는 안전한 종료 기능이 포함됩니다.

서로 의존합니다. 애플리케이션 서비스는 데이터베이스 서비스가 먼저 실행되어야 합니다. 웹 서비스는 애플리케이션 서비스가 필요합니다. 이 의존 관계가 계층 구조를 형성합니다 — 잘못된 순서로 시작하면 문제가 발생합니다.

문제 해결의 이점

무언가 고장났을 때, 무엇이 고장났는지 파악하면 수정 방법이 결정됩니다.

서비스 문제: 데이터베이스 서비스가 충돌했습니다. 재시작합니다. 같은 서버의 다른 서비스는 계속 실행됩니다. 다운타임은 데이터베이스에 의존하는 작업으로 제한됩니다.

서버 문제: 서버의 디스크가 가득 찼습니다. 서버의 모든 서비스가 느려지거나 실패합니다. 무언가 복구되려면 디스크 공간을 확보해야 합니다.

자원 경합: 서버에 자원은 충분하지만 한 서비스가 모두 소비하고 있습니다. 해당 서비스의 자원 할당을 제한하거나, 최적화하거나, 다른 서버로 이동할 수 있습니다.

"느리다"고만 말하면 도움이 되지 않습니다. "서버 CPU가 20%를 유지하는 동안 API 서비스 응답 시간이 급증했다"고 말하면 서비스 계층을 직접 가리킵니다. "CPU가 100%에 도달했을 때 모든 서비스가 동시에 저하됐다"고 말하면 서버를 가리킵니다.

서버 확장 vs. 서비스 확장

이 구분은 성장을 어떻게 처리할지에도 영향을 미칩니다.

서비스가 과부하 상태라면:

  • 코드를 최적화합니다
  • 서버의 자원을 더 많이 할당합니다
  • 여러 서버에 걸쳐 여러 복사본을 실행합니다 (수평 확장)

서버가 과부하 상태라면:

  • CPU, 메모리, 또는 스토리지를 추가합니다 (수직 확장)
  • 서버를 더 추가하고 서비스를 분산합니다
  • 자원을 많이 사용하는 서비스를 전용 하드웨어로 이동합니다

현대 아키텍처는 종종 동일한 서비스를 여러 서버에서 동시에 실행합니다. 트래픽은 모든 복사본에 분산됩니다. 하나의 서버가 실패하면 나머지가 그 부하를 흡수합니다. 개별 서버가 작동하지 않더라도 서비스는 계속 이용 가능합니다.

이것은 관계를 역전시킵니다: 하나의 서버가 많은 서비스를 실행하는 대신, 이제 하나의 서비스가 많은 서버에 걸쳐 실행됩니다.

두 계층 모두 모니터링하기

각 계층의 문제는 다르게 나타나기 때문에, 포괄적인 모니터링은 서버와 서비스를 별도로 추적합니다.

서버 수준 지표:

  • CPU 사용률
  • 메모리 사용량
  • 디스크 공간 및 I/O 처리량
  • 네트워크 트래픽

서비스 수준 지표:

  • 서비스가 실행 중인가?
  • 요청 수 및 응답 시간
  • 오류율
  • 서비스별 지표 (초당 쿼리 수, 캐시 적중률)

건강한 서버가 문제 있는 서비스를 실행할 수 있습니다. 과부하 상태의 서버는 멀쩡한 서비스도 고장난 것처럼 보이게 할 수 있습니다. 정확하게 진단하려면 두 계층 모두를 들여다볼 수 있어야 합니다.

정확하게 말하기

모호한 표현은 중요한 정보를 숨깁니다.

"서버가 느리다" 대신:

  • "API 서비스가 느리게 응답하고 있습니다" — 서비스 계층 성능 문제
  • "서버 CPU가 포화 상태입니다" — 서버 계층 자원 고갈
  • "데이터베이스 서비스가 충돌했습니다" — 특정 소프트웨어 장애
  • "서버가 네트워크 연결을 잃었습니다" — 인프라 문제

정확성은 진단을 빠르게 합니다. 온콜 엔지니어가 서비스 로그를 확인해야 할지 서버 지표를 확인해야 할지 즉시 알 수 있으면, 문제가 그만큼 빨리 해결됩니다.

이해의 틀

서버는 토대를 제공합니다. 서비스는 실질적인 역할을 담당합니다.

서비스 없는 서버는 아무 쓸모 없는 컴퓨터입니다 — 전력을 소비하고, 공간을 차지하고, 기다릴 뿐입니다. 서버 없는 서비스는 실행될 곳이 없습니다 — 배포되기 전까지는 그저 코드, 잠들어 있는 상태입니다.

서비스가 충돌하면, 서버는 여전히 거기서 묵묵히 돌아가고 있습니다 — 하지만 아무것도 호스팅하지 않습니다. 서비스는 사라졌고, 그 서버가 하던 모든 유용한 일들도 함께 사라졌습니다.

서버가 실패하면, 그 위의 모든 서비스가 한꺼번에 사라집니다. 코드는 어딘가에 여전히 존재합니다 — 저장소, 컨테이너 이미지, 배포 스크립트 어딘가에. 하지만 실행 중이 아닙니다. 새로운 보금자리를 찾을 때까지 그 기능은 멈춰 있습니다.

이것이 중요한 구분입니다. 용어를 위해서가 아니라, 올바른 이해의 틀이 올바른 질문, 올바른 조사, 그리고 올바른 해결책으로 이어지기 때문입니다.

서버와 서비스에 대한 자주 묻는 질문

서비스가 서버 없이 실행될 수 있나요?

아니요. 서비스는 소프트웨어이고, 소프트웨어는 실행하기 위한 하드웨어(또는 가상화된 하드웨어)가 필요합니다. "서버리스" 컴퓨팅 — 오해를 불러일으키는 이름 — 조차도 다른 누군가가 관리하는 서버에서 코드를 실행합니다. 그 서버를 직접 보거나 관리하지는 않지만, 존재합니다.

서버가 서비스 없이 실행될 수 있나요?

기술적으로는 가능하지만, 아무 의미가 없습니다. 운영체제만 있고 서비스가 없는 서버는 아무것도 제공하지 않으면서 전기만 소비하는 컴퓨터입니다. 실제로는, 최소한의 서버조차도 기능하기 위해 시스템 서비스(로깅, 네트워킹, 시간 동기화)를 실행합니다.

문제가 서버 문제인지 서비스 문제인지 어떻게 알 수 있나요?

문제가 격리되어 있는지 광범위한지 확인하세요. 같은 서버의 다른 서비스는 정상인데 하나의 서비스만 실패하면, 서비스 문제일 가능성이 높습니다. 서버의 모든 서비스가 동시에 저하되면, 서버를 의심하세요. 특정 위치의 모든 서버가 한꺼번에 실패하면, 인프라(전원, 네트워크, 냉각)를 살펴보세요.

왜 사람들은 "서버"와 "서비스"를 혼용해서 사용하나요?

역사적으로, 전용 머신이 단일 서비스를 실행했습니다 — "메일 서버"는 곧 그 컴퓨터이자 소프트웨어였습니다. 현대 인프라는 서버 하나에 여러 서비스를, 서비스 하나에 여러 서버를 운용하기 때문에 이 구분이 중요해졌습니다. 아키텍처가 발전해도 오래된 습관과 명명 관례는 쉽게 사라지지 않습니다.

이 페이지가 도움이 되었나요?

😔
🤨
😃