이번 글은 유튜버 원투코딩 님의 영상 https://www.youtube.com/watch?v=M8E6vYAIuzQ 을 보고 작성했습니다.
백엔드 시스템은 여러 구성 요소가 유기적으로 상호작용하여 동작합니다. 그중에서도 **웹 서버, 웹 애플리케이션 서버(WAS), 데이터베이스(DB)**는 백엔드를 이루는 가장 중요한 3가지 핵심 요소입니다. 이들의 역할과 관계를 통해 백엔드 아키텍처의 기본을 이해해 보겠습니다.
## 1. 웹 서버 (Web Server)
웹 서버는 **정적 콘텐츠(Static Contents)**를 클라이언트에게 제공하는 서버입니다.
1990년대 초 WWW가 등장했을 당시, 웹은 주로 연구소나 대학에서 문서나 자료를 공유하기 위한 목적으로 사용되었습니다. 이때 지구 반대편의 사용자에게도 HTML 문서를 안정적으로 전달하기 위한 필요성에서 웹 서버가 탄생했습니다.
당시의 웹은 누가 접속하든 항상 동일한 페이지를 보여주었는데, 이를 정적 웹이라고 합니다. 이처럼 웹 서버의 주된 역할은 미리 저장된 HTML, CSS, JavaScript, 이미지 파일 등을 요청에 따라 그대로 전달하는 것입니다.
- 대표적인 웹 서버: Nginx, Apache HTTP Server, Microsoft IIS 등
## 2. WAS (Web Application Server)
WAS는 **동적 콘텐츠(Dynamic Contents)**를 생성하여 클라이언트에게 제공하는 서버입니다.
웹 기술이 발전하면서, 사용자마다 다른 내용, 즉 개인화된 페이지를 보여주고자 하는 요구가 생겼습니다. 이를 해결하기 위해 등장한 것이 바로 WAS입니다. WAS는 클라이언트의 요청에 따라 서버 내부에서 비즈니스 로직을 수행하고, 그 결과를 반영한 HTML을 실시간으로 생성하여 전달합니다.
WAS의 등장은 비로소 백엔드의 탄생이라고 할 수 있으며, 그 역할은 다음과 같이 구분할 수 있습니다.
- WAS vs 백엔드 프레임워크: 둘은 유사하지만 다른 개념입니다. 백엔드 프레임워크(Spring, Django, Express 등)는 비즈니스 로직을 개발자가 더 쉽고 빠르게 개발하도록 돕는 **코드의 모음(도구)**입니다. 반면 WAS는 프레임워크로 작성된 코드가 실제 서버 환경에서 실행되도록 하는 실행 환경 그 자체입니다.
- 내장 WAS: 현대의 많은 백엔드 프레임워크는 개발의 편의성을 위해 내장(Embedded) WAS를 포함하고 있습니다. 이 때문에 개발자가 별도의 WAS를 설치하지 않아도 서버를 구동할 수 있습니다.
- 대표적인 WAS: Apache Tomcat, Jetty, Gunicorn, uvicorn 등
## 3. 웹 서버와 WAS를 함께 사용하는 이유
현대의 웹 아키텍처는 정적 콘텐츠 처리와 동적 콘텐츠 처리를 분리하기 위해 웹 서버와 WAS를 함께 사용하는 구조를 채택하는 경우가 많습니다. 웹 서버를 WAS 앞 단에 **리버스 프록시(Reverse Proxy)**로 배치하는 것입니다.
- 기능 분리를 통한 서버 부하 감소: 웹 서버는 정적 파일 처리에, WAS는 비즈니스 로직 처리에 집중하여 각자의 역할을 효율적으로 수행합니다. 이는 WAS가 불필요한 작업에서 벗어나 핵심 로직에만 집중할 수 있게 하여 전체 시스템의 성능을 향상시킵니다.
- 로드 밸런싱 (Load Balancing): 여러 대의 WAS를 운영하는 경우, 웹 서버가 요청을 받아 각 WAS에 균등하게 분배해주는 로드 밸런서 역할을 수행할 수 있습니다. 이를 통해 특정 서버에 과부하가 걸리는 것을 방지합니다.
- 보안 강화: 외부에는 웹 서버만 노출시키고, 내부망에 WAS와 DB를 배치함으로써 보안을 강화할 수 있습니다. 웹 서버가 악의적인 공격을 막아내는 방어막 역할을 수행합니다.
## 4. 데이터베이스 (Database)
데이터베이스는 데이터를 체계적으로 저장하고 영속적으로 보존하는 역할을 합니다.
WAS만으로는 서버를 재시작하면 메모리에 있던 모든 데이터가 사라집니다. 사용자의 정보와 같이 영구적으로 보관해야 할 데이터가 늘어나면서 이를 저장할 공간이 필요해졌습니다. 단순 텍스트 파일에 데이터를 저장하는 방식은 다음과 같은 치명적인 문제점들을 가지고 있었습니다.
- 동시성 제어 (Concurrency Control): 여러 사용자가 동시에 같은 데이터를 수정하려고 할 때 데이터가 훼손되는 **경쟁 상태(Race Condition)**가 발생할 수 있습니다. 데이터베이스는 **잠금(Lock)**과 같은 정교한 메커니즘을 통해 이를 제어합니다.
- 데이터 무결성 (Data Integrity): 텍스트 파일은 데이터의 유효성을 보장하기 어렵습니다. 데이터베이스는 **트랜잭션(Transaction)**이라는 작업 단위를 통해, 여러 작업이 하나의 묶음처럼 모두 성공하거나 모두 실패하도록 하여 데이터의 무결성을 보장합니다.
- 검색 속도 (Search Speed): 텍스트 파일에서 특정 데이터를 찾으려면 모든 내용을 순차적으로 읽어야 하므로 매우 느립니다. 데이터베이스는 **인덱스(Index)**를 사용하여 방대한 양의 데이터 속에서도 원하는 정보를 빠르게 검색할 수 있습니다.
'개발 공부 > 백엔드' 카테고리의 다른 글
| 백엔드 공부 중 (1. ASP, 2. JSON) (0) | 2025.09.14 |
|---|---|
| 스프링 웹 개발 기초: 3가지 방식으로 웹 요청 처리하기 (0) | 2025.09.14 |
| 스프링 부트: 정적 콘텐츠와 동적 콘텐츠 처리 방식 (0) | 2025.09.13 |
| 스프링 부트 입문: 첫 프로젝트 시작하기 (김영한님 강의 정리) (1) | 2025.09.13 |
| 백엔드 기초 (1) | 2025.09.01 |