Devlog

[C언어로 웹서버 만들기 (0)] - 소개 본문

Backend/C언어 + 아파치 모듈

[C언어로 웹서버 만들기 (0)] - 소개

recoma 2022. 4. 24. 04:02

시작하며

보통 API 서버 혹은 백엔드 웹 프레임워크로는 Spring, Node.js, DJango, Ruby on Rails 등이 유명합니다. 또 이들을 구현하는 데 사용하는 언어는 차례로 Java/Kotlin, Javascript, Python, Ruby가 되겠습니다. 저는 Python을 주력 언어로 사용하고 있기 때문에 마찬가지로 DJango/FastAPI/Flask를 주력으로 사용하고 있습니다.

하지만 라즈베리 파이같은 임베디드 환경에서의 프로그래밍도 좋아하는 편이라 C언어도 자주 사용하곤 하는데, 이 C언어도 분명히, 최소한 옛날에는 C언어로도 웹서버를 만들지 않았을까 싶어 구글링을 해 본 결과, Apache Engine에 C언어로 Module을 작성해서 붙이는 방식이 있다는 것을 알게 되었고, 가이드까지 발견하게 되었습니다.

 

Developing modules for the Apache HTTP Server 2.4 - Apache HTTP Server Version 2.4

Developing modules for the Apache HTTP Server 2.4 This document explains how you can develop modules for the Apache HTTP Server 2.4 This document will discuss how you can create modules for the Apache HTTP Server 2.4, by exploring an example module called

httpd.apache.org

하지만 어디까지나 거의 대부분이 영어로 된 문서들 뿐이고, 한글로 번역 또는 정리한 블로그 또는 웹사이트가 거의 없습니다. 솔직히 그럴만도 한 게 당연히 웹서버 구현하려고 하면 대부분 자바, 자바스크립트, 파이썬 같은 언어를 쓰지 C언어로 웹서버를 구현하는 경우는 거의 없기 때문입니다. 그래서 아예 제가 직접 삽질하면서 얻어낸 지식들을 블로그에 기록하려고 합니다.

 

권장 사항 및 선수 지식

아파치 모듈 개발을 어느정도 공부를 하면 서 해당 포스트를 이해하기 위한 예상되는 최소한의 지식들을 나열해 봤습니다. 1, 2번의 경우 필요하면 중간중간에 포스팅을 할 예정입니다.

1. GCC환경의 C언어 중급 이상 (+ 알고리즘 기본 지식, 문제 해결 능력)
2. 리눅스 기본 명령어 숙지 + 리눅스 하고 친구 먹기

3. HTTP 메서드에 대한 기본적인 이해
4. 어느 언어든 간에 Database를 활용한 API 서버를 최소 한번 이상 만들어 본 경험
5. 최소 한 번 이상 Apache/NginX에 대해 들어봤다.

GCC 환경의 C언어 중급 이상. (+ 알고리즘 기본 지식, 문제 해결 능력)

클라이언트로부터 받아오는 데이터 문자열들을 일일이 파싱 해서 데이터들을 정리하는 알고리즘을 구현할 때가 있습니다. C언어의 문자열은 포인터 자체로 사용하기 때문에 최소한 포인터를 자유자재로 사용할 줄 알아야 합니다. 예를 들어 GET Method의 파라미터를 불러오는 경우 데이터를 파싱해 주지 않고 그냥 문자열 통째로 불러오기 때문에 이를 파싱 하는 알고리즘을 따로 작성해야 합니다. Apache Module에서도 Memory Management 관련해서 메모리 풀을 따로 제공해 준다고는 하지만. 그 베이스는 결국 포인터입니다.

Apache는 거의 모든 OS에서 동작합니다. 하지만 해당 포스트는 C로 작성된 웹서버를 배포하는 것 까지가 목표이기 때문에 100% 리눅스 환경에서 개발을 하게 됩니다. 그렇기에 비주얼 스튜디오에 가 아닌 리눅스 위의 GCC 개발 환경에 익숙해야 합니다.

또한 문자열 또는 기타 관련 알고리즘을 GET Parameter의 파싱 처럼 라이브러리 없이 직접 구현해야 하는 데다 C언어를 사용하기 때문에 알고리즘 기본 지식 또는 코딩 문제를 많이 풀어보지 않았다면 조금 힘들 수 있습니다.

리눅스 기본 명령어 숙지 + 리눅스 하고 친구 먹기.

위에서 서술했듯이 100% 리눅스 환경이므로 당연히 리눅스의 기본 명령어를 알고 있어야 합니다. 기본 명령어 말고도 개발에 필요한 리눅스 명령어와 일부 지식들을 포스트 중간중간에 추가할 예정입니다.

HTTP Method 기본 이해 + API 서버를 만들어 본 경험

HTTP 웹서버를 구현해야 하기 때문에 HTTP 관련 기본 지식은 당연히 알고 있어야 합니다. API서버를 구현한 적이 있다면 코드들을 이해하는데 훨씬 수월할 것입니다. 만약에 경험이 없다면, 파이썬의 경우 Flask를, 자바일 경우 Spring으로 간단한 웹서버 구현을 한번쯤 해보는 것을 추천드립니다.

목표

아까도 얘기했지만 저는 백엔드와 동시에 임베디드 분야에도 관심이 있습니다. 그래서 아파치 모듈을 라즈베리 파이에 적용시키는 것까지 목표를 하고 있습니다. 따라서 포스팅을 통해 달성하고자 하는 목표들은 다음과 같습니다.

1. 간단한 커뮤니티 사이트 구현

아파치 모듈 프로그래밍을 어느 정도 익힌 다음에 실습 프로젝트로 간단한 웹서버를 구현하려고 합니다. 단순히 구현뿐만 아니라 C언어 상의 테스트 코드 작성, Github Action, CIRCLE_CI 같은 배포 시스템을 이용한 배포까지 진행해 보려고 합니다.

2. 최적화 연구

C언어는 아시다시피 상당히 빠른 언어입니다. 하지만 모든 책임을 프로그래머한테 넘기는 언어이기도 하기에, 코드를 잘못 짜면 성능이나 품질 등이 심각하게 저하가 됩니다. 특히 C언어는 가비지 컬렉션이 없기 때문에, 메모리 할당을 관리해야 한다는 점에서 잘못 관리하면 심각한 메모리 누수가 발생할 수도 있습니다. 이를 예방하기 위해, 아파치 모듈에서의 디버깅, 모듈 작동 구조, 그리고 효율적인 개발 방법을 연구 삽질해서 얻은 정보들을 여기에 기록하려고 합니다.

3. 라즈베리파이 x 아파치 모듈 프로젝트

라즈베리파이를 활용한 프로젝트를 입니다. 사실 라즈베리파이 하면 대부분 파이썬으로 입문하지만 여기서는 오직 C언어만을 사용하려고 합니다.(단, 설치 스크립트나 시스템 스크립트는 파이썬을 사용할 수도 있음.) 주제는 아직 안정했어요.

 

이건 어느 교재 또는 블로그 보다는 아닌 레퍼런스 또는 가이드 원문을 토대로 삽질 및 연구를 통해 작성을 하고 있기 때문에, 틀린 부분이 반드시 존재합니다. 틀린 부분이 있을 때 지적해 주신다면 감사하겠습니다.

반응형