웹 서버 만들기

9. 웹 서버 만들기

웹 서버 소개

웹 서버(WS, Web Server)는 인터넷을 통해 사용자에게 웹 페이지를 제공하는 컴퓨터 시스템입니다. 웹 서버는 클라이언트(일반적으로 웹 브라우저)로부터 HTTP 요청을 수신하고, 요청된 웹 페이지나 리소스를 반환하는 역할을 합니다. 이를 통해 사용자는 원하는 정보를 웹 브라우저를 통해 실시간으로 확인할 수 있습니다.

주요 기능

  • HTTP 요청 처리: 웹 서버는 클라이언트로부터 HTTP 요청을 수신하고, 적절한 응답을 반환

  • 정적 콘텐츠 제공: HTML, CSS, JavaScript 파일 및 이미지와 같은 정적 파일을 제공하여 웹 페이지를 구성

  • 동적 콘텐츠 처리: PHP, ASP.NET, JSP와 같은 서버 측 스크립트를 실행하여 동적으로 생성된 콘텐츠를 제공

  • 보안 기능: SSL/TLS 암호화를 통해 데이터 전송의 보안을 보장하고, 인증 및 권한 부여 기능을 통해 사용자 접근을 제어

  • 로드 밸런싱: 여러 서버에 트래픽을 분산시켜 서버 과부하를 방지하고 성능을 최적화

  • 로그 관리: 웹 서버는 요청, 오류, 성능 등을 기록하여 분석 및 모니터링에 활용

대표적인 웹 서버 소프트웨어

  • Nginx: 높은 성능과 낮은 메모리 사용량으로 유명한 웹 서버로, 로드 밸런서 및 리버스 프록시 서버로도 많이 사용

  • Apache HTTP Server: 오픈 소스 웹 서버로, 유연성과 확장성이 뛰어나고, 다양한 모듈을 지원

  • Microsoft Internet Information Services (IIS): Windows Server 환경에서 사용하는 웹 서버로, .NET 기반 애플리케이션과의 호환성이 높음

웹 서버 애플리케이션 소개

웹 애플리케이션(Web Application)은 인터넷을 통해 웹 브라우저에서 접근할 수 있는 애플리케이션 소프트웨어입니다. 사용자는 웹 애플리케이션을 통해 다양한 기능을 수행할 수 있으며, 전통적인 GUI 데스크탑 애플리케이션과는 달리 설치가 필요 없고, 어디서든 인터넷만 연결되어 있으면 접근할 수 있다는 장점이 있습니다.

주요 특징

  • 접근성: 웹 애플리케이션은 인터넷이 연결된 어느 곳에서나 접근할 수 있습니다. 사용자는 특정 장치에 구애받지 않고, 다양한 디바이스(PC, 태블릿, 스마트폰 등)에서 웹 브라우저를 통해 애플리케이션 이용 가능

  • 업데이트 용이성: 웹 애플리케이션은 서버에서 실행되므로, 업데이트나 패치가 필요할 때 사용자 측에서 별도의 조치가 필요 없음. 서버 측에서 업데이트를 적용하면 모든 사용자가 즉시 최신 버전을 사용 가능

  • 플랫폼 독립성: 웹 애플리케이션은 웹 브라우저를 통해 접근하므로, 특정 운영 체제에 종속되지 않음. 다양한 운영 체제(Windows, macOS, Linux, Android, iOS 등)에서 동일하게 작동

  • 유연한 배포: 개발자들은 웹 애플리케이션을 단일 서버 또는 분산 시스템에 배포할 수 있으며, 트래픽이 많아지면 손쉽게 서버를 추가하여 확장 가능

웹 애플리케이션 프레임워크

웹 애플리케이션 프레임워크는 웹 애플리케이션 개발을 용이하게 하기 위해 제공되는 소프트웨어 프레임워크입니다. 이러한 프레임워크는 개발자들이 웹 애플리케이션의 구조와 기능을 더 쉽게 구현할 수 있도록 다양한 라이브러리, 도구, 패턴을 제공합니다. 웹 애플리케이션 프레임워크는 주로 클라이언트 측과 서버 측으로 구분합니다.

  • 서버 측 프레임워크

프레임워크

장점

단점

Django
(Python)

- 많은 기본 기능 제공으로 신속한 개발 가능
- 강력한 ORM: 데이터베이스 작업을 쉽게 처리
- 보안 기능: CSRF, XSS 방지 등 제공
- 관리자 인터페이스: 자동으로 생성

- 높은 진입 장벽: 초보자에게는 복잡
- 많은 기능이 포함되어 경량 앱에는 부적합
- 패턴을 따르지 않으면 구현이 어려움

Flask
(Python)

- 경량 및 유연성: 필요한 기능만 추가해 사용
- 간단한 구조: 배우기 쉽고 빠른 프로토타이핑
- 확장성: 다양한 확장 모듈 추가 가능

- 많은 기능을 직접 구현해야 함
- 보안 부족: 기본 제공 보안기능 적음
- 대규모 애플리케이션 부적합

FastAPI
(Python)

- 높은 성능: 비동기 지원으로 높은 성능
- 타입 검사: 타입 힌트 사용
- 자동 문서화: 자동 API 문서 생성
- 사용성: 간단한 코드로 빠른 개발

- 비교적 신생: 커뮤니티 자료가 적음
- 큰 프로젝트에 대한 검증 부족: 사례가 적음

Express
(Node.js)

- 비동기 처리: Node.js 기반 비동기 처리
- 최소한의 기능만 포함, 필요한 기능은 추가 개발
- 유연성: 미들웨어로 기능 확장 가능
- 커뮤니티: 큰 커뮤니티와 많은 자료

비동기 코드 콜백 헬 문제 발생
- 보안 문제: 기본적인 보안 기능 부족
- 프로젝트 구조에 대한 명확한 규약 없음

Spring
(Java)

- 엔터프라이즈급: 대규모 개발에 적합
- 강력한 보안: 다양한 보안 기능 내장
- 모듈화: 다양한 모듈을 지원
- 생산성: DI(Dependency Injection)와 같은 기능을 통해 생산성 향상

- 복잡성: 초기 학습 곡선이 높음
- 무거움: 많은 기능이 포함되어 있어 경량 애플리케이션에는 부적합
- 설정 과다: 기본 설정이 많아 관리가 어려움

  • 클라이언트 측 프레임워크

프레임워크

장점

단점

Native JavaScript
(JavaScript)

- 모든 브라우저에서 지원
- 추가 라이브러리나 프레임워크 없이 사용
- 유연성: 자유로운 코드 작성 가능
- 학습 필수: 웹 개발의 기본 기술

- 복잡한 DOM 조작
- 생산성 낮음: 많은 기능을 직접 구현
- 코드가 복잡해질 수 있음
- 표준화 부족: 구조와 패턴 일관성 떨어짐

React
(JavaScript)

- 재사용 가능한 UI 컴포넌트로 개발 용이
- 가상 DOM: 빠른 렌더링 성능
- 큰 커뮤니티: 풍부한 자료와 라이브러리
- 페이스북 꾸준한 업데이트와 신뢰성

- 높은 학습 곡선: JSX와 복잡한 생태계
- 복잡한 상태 관리 라이브러리 필요
- 빈번한 업데이트: 자주 변경되는 API와 툴

Angular
(TypeScript)

- 종합적인 도구와 기능 제공
- 모델과 뷰의 자동 동기화
- 모듈 간 의존성 관리 용이
- 강력한 지원: 구글의 꾸준한 업데이트

- 높은 학습 곡선: 복잡한 구조와 많은 개념
- 퍼포먼스: 대규모 DOM 조작 시 성능 문제
- 코드의 복잡성: 복잡한 코드베이스

Vue.js
(JavaScript)

- 간결하고 직관적: 쉬운 학습 곡선
- 가상 DOM: 빠른 렌더링 성능
- 유연성: 점진적 채택 가능
- 활발한 커뮤니티와 풍부한 플러그인

- React와 Angular에 비해 작은 커뮤니티
- 유연성: 프로젝트 구조의 일관성 부족
- 큰 기업의 공식적인 지원 부족

앱 애플리케이션 서버

웹 애플리케이션 서버(WAS, Web Application Server)는 웹 애플리케이션의 비즈니스 로직을 처리하고, 클라이언트 요청에 따라 동적으로 콘텐츠를 생성하여 응답하는 서버입니다. 웹 애플리케이션 서버는 웹 서버와 함께 동작하며, 클라이언트 요청을 받아 데이터베이스와 상호작용하고, 필요한 처리를 수행한 후 결과를 클라이언트에게 전달합니다.

웹 서버와 웹 애플리케이션 서버는 각기 다른 역할을 수행하며, 대부분의 현대 웹 애플리케이션에서는 두 가지가 모두 필요합니다. 웹 서버만으로는 웹 애플리케이션의 요구를 모두 충족하기 어렵기 때문에, 웹 애플리케이션 서버의 필요성을 이해하는 것이 중요합니다.

웹 서버의 역할

웹 서버는 클라이언트(웹 브라우저)로부터 HTTP 요청을 수신하고, 정적 콘텐츠(HTML, CSS, JavaScript 파일, 이미지 등)를 제공하는 역할을 합니다. 웹 서버의 주요 기능은 다음과 같습니다:

  • 정적 콘텐츠 제공: 파일 시스템에서 HTML, CSS, JavaScript, 이미지 파일 등을 클라이언트에게 전송

  • HTTP 요청 처리: 클라이언트로부터 HTTP 요청을 받고, 이에 대한 적절한 응답을 반환

  • 리버스 프록시: 웹 애플리케이션 서버와 클라이언트 간의 중계 역할을 하여 요청을 라우팅

  • 로드 밸런싱: 여러 서버에 트래픽을 분산시켜 성능을 최적화

웹 애플리케이션 서버의 필요성

웹 애플리케이션 서버는 동적 콘텐츠 생성과 비즈니스 로직 처리에 필수적입니다. 웹 서버만으로는 동적 요청을 처리할 수 없기 때문에, 웹 애플리케이션 서버가 필요합니다. 웹 애플리케이션 서버의 주요 기능은 다음과 같습니다:

  • 비즈니스 로직 처리: 사용자의 요청을 기반으로 비즈니스 로직 처리. (예) 사용자의 로그인 요청을 처리하고 세션을 관리

  • 데이터베이스 연동: 데이터베이스와 상호작용하여 데이터를 조회, 저장, 업데이트, 삭제하는 작업을 수행. ORM(Object-Relational Mapping)을 사용하여 데이터베이스 작업을 쉽게 수행

  • 동적 콘텐츠 생성: 사용자 요청에 따라 동적으로 생성된 콘텐츠를 제공. (예) 사용자 프로필 페이지를 동적으로 생성하여 제공

  • 세션 상태 관리: 사용자의 상태를 유지하고 세션 관리. (예) 사용자가 로그인한 후 세션을 유지하여 다음 요청에서도 사용자를 인식할 수 있도록 처리

  • 보안 관리: 인증, 권한 부여, 데이터 암호화 등의 보안 기능 제공.

Python으로 만든 웹 애플리케이션을 관리하는 웹 애플리케이션 서버

uWSGI와 Gunicorn은 Python 기반의 웹 애플리케이션을 배포하는 데 사용되는 두 가지 인기 있는 WSGI(Web Server Gateway Interface) 서버입니다. 이들 서버는 Python 웹 애플리케이션 프레임워크(예: Django, Flask)와 웹 서버(예: Nginx) 사이에서 작동하여 클라이언트 요청을 처리하고 웹 애플리케이션으로 전달하는 역할을 합니다.

구분

uWSGI

Gunicorn

장점

- 높은 성능: 다양한 프로토콜 지원 및 최적화
- 유연성: WSGI, HTTP, FastCGI, SCGI 등 다수 프로토콜 지원
- 확장성: 플러그인 시스템을 통한 기능 확장 가능
- 관리 기능: 모니터링, 자동 재시작, 캐싱 등 다양한 기능 제공

- 간단한 설정: 설정이 간단하고 쉽게 시작 가능
- 경량화: 가벼운 구조로 높은 성능 제공
- 다중 워커: 여러 워커 프로세스를 통해 높은 동시성 처리
- 호환성: 다양한 프레임워크와의 호환성 우수

단점

- 복잡한 설정: 다양한 기능으로 인해 설정이 복잡할 수 있음
- 초보자에 어려움: 초기 설정 및 사용법이 다소 어려울 수 있음
- 메모리 사용량: 고성능을 위해 비교적 높은 메모리 사용량

- 제한된 기능: uWSGI에 비해 기능이 제한적
- 기본 기능 부족: 일부 고급 기능은 직접 구현 필요
- 리소스 관리: 높은 동시성에서 리소스 관리가 어려울 수 있음

WS, WAS, Web App의 관계

../../_images/ch09_00_01_ws_was_app.png

Fig. 9.1 WS, WAS, Web App의 관계(예시)

무엇을 써야 하나요?

사용할 수 있는 기술이 너무 다양해서 복잡한가요?

맞습니다. 어떤 기술을 선택할지는 아무도 결정해 주지 않습니다. 어찌보면 개발자의 몫이라고 할 수 있습니다. 개발자에게 선택의 다양성을 준다는 점에서는 좋지만, 한편으로는 공부해야 할 양이 방대해지고 선택의 고민에 빠지게 하는 단점이기도 합니다.

웹 애플리케이션 백엔드 개발에 사용할 기술 스택을 선택하는 것은 프로젝트의 요구사항, 팀의 기술적 역량, 유지보수 용이성, 성능 요구사항 등 여러 요소를 고려해야 합니다. 다양한 기술 스택의 조합은 특정 요구에 맞게 최적화될 수 있으며, 각 조합의 장단점을 이해하는 것이 중요합니다.

대표적인 백엔드 기술 조합(테크 트리 또는 기술 스택 이라고 부르기도 함)

Python + Django + Gunicorn/uWSGI + Nginx

  • Django: 배터리가 포함된 웹 프레임워크로, 신속한 개발과 유지보수가 용이합니다. ORM, 관리자 인터페이스, 인증 등 다양한 기능이 내장되어 있습니다.

  • Gunicorn/uWSGI: WSGI 애플리케이션 서버로 Django 애플리케이션을 서비스합니다.

  • Nginx: 정적 파일 제공, 리버스 프록시, 로드 밸런싱 등을 처리합니다.

Python + Flask + Gunicorn/uWSGI + Nginx

  • Flask: 경량 웹 프레임워크로, 필요한 기능만 추가하여 사용할 수 있습니다. 유연성이 높고 배우기 쉽습니다.

  • Gunicorn/uWSGI: Flask 애플리케이션을 서비스하는 WSGI 서버입니다.

  • Nginx: 정적 파일 제공 및 리버스 프록시 역할을 합니다.

Node.js + Express + PM2(process manager) + Nginx

  • Express: Node.js의 경량 웹 프레임워크로, 빠른 개발이 가능합니다. 비동기 처리가 용이합니다.

  • PM2: Node.js 애플리케이션을 관리하고, 자동 재시작 및 로드 밸런싱을 제공합니다.

  • Nginx: 정적 파일 제공 및 리버스 프록시 역할을 합니다.

Java + Spring Boot + Tomcat + Nginx

  • Spring Boot: 엔터프라이즈급 애플리케이션을 위한 프레임워크로, 다양한 기능을 제공합니다.

  • Tomcat: Spring Boot 애플리케이션을 서비스하는 서블릿 컨테이너입니다.

  • Nginx: 정적 파일 제공 및 리버스 프록시 역할을 합니다.

우리의 선택은?

적합한 기술 스택을 선택하는 것은 프로젝트 성공의 중요한 요소입니다.

각 기술 스택의 장단점을 이해하고, 프로젝트 요구사항에 맞춰 적합한 조합을 선택하여 개발을 진행해야 합니다.

기술 스택 선택 고려사항

  • 프로젝트 요구사항: 프로젝트의 복잡성, 성능 요구사항, 개발 속도 등을 고려하여 적합한 프레임워크와 서버

  • 팀의 기술 역량: 팀이 익숙한 언어와 프레임워크를 선택하는 것이 개발 속도와 유지보수에 유리

  • 유지보수 용이성: 문서화, 커뮤니티 지원, 확장성 등을 고려하여 유지보수가 용이한 스택을 선택

  • 성능: 특정 기술 스택이 제공하는 성능 최적화 기능을 고려

  • 보안: 선택한 기술 스택이 제공하는 보안 기능을 고려

맨 위로 이동