이 프로젝트는 현대 자바 서버 애플리케이션을 구성하는 기반 기술들을 밑바닥부터(Bottom-Up) 직접 분석하고 구현해보며 그 원리를 깊이 이해하는 것을 목적으로 합니다.
순수 소켓 프로그래밍에서 시작하여 직접 서블릿 컨테이너를 만들어보고, 최종적으로 현대적인 프레임워크인 스프링 부트에 이르기까지, 웹 서버가 어떻게 추상화되고 발전해왔는지를 5개의 모듈을 통해 점진적으로 학습합니다.
프로젝트에 대한 기록 및 인사이트에 대해서는 블로그 시리즈 에서 확인하실 수 있습니다.
본 프로젝트는 Gradle 멀티-모듈로 구성되어 있으며, 각 모듈은 독립적으로 실행 가능한 웹 애플리케이션입니다.
프로젝트 루트 디렉터리에서 아래 명령어를 통해 각 모듈을 실행할 수 있습니다. 각 모듈은 기본적으로 8080 포트에서 실행됩니다. (2번 모듈은 8081 포트에서도 NIO 서버가 실행됩니다.)
# 1번 모듈(원시 소켓 서버) 실행
./gradlew :1-java-http-socket:run
# 2번 모듈(자체 구현 서블릿 컨테이너) 실행
./gradlew :2-servlet-container-impl:run
# 3번 모듈(내장 톰캣) 실행
./gradlew :3-tomcat:run
# 4번 모듈(Spring MVC)은 외부 톰캣에 WAR 파일로 배포해야 합니다.
# WAR 파일 생성 명령어:
./gradlew :4-spring-webmvc:war
# 5번 모듈(스프링 부트) 실행
./gradlew :5-spring-boot:run이 프로젝트는 5개의 모듈을 통해 점진적으로 기술을 발전시키는(Bottom-Up) 과정을 보여줍니다.
Java의 기본 java.net.Socket API만을 사용하여 웹 서버의 가장 원시적인 형태를 구현합니다. 스레드 관리, HTTP 프로토콜 파싱 등 모든 것을 수동으로 처리하며 네트워크 통신의 가장 근본적인 동작 원리를 학습합니다.
1번 모듈의 저수준 로직을 추상화하여 Tomcat과 유사한 구조의 서블릿 컨테이너를 직접 구현합니다. net -> bridge -> container의 3계층 아키텍처를 통해 네트워크 통신, 프로토콜 처리, 서블릿 생명주기 관리를 분리하며 웹 애플리케이션 서버(WAS)의 내부 구조를 깊이 있게 탐구합니다.
2번 모듈에서 직접 만들었던 복잡한 컨테이너를 버리고, 검증된 표준 기술인 내장 톰캣(Embedded Tomcat) 으로 대체합니다. 이를 통해 서버의 핵심 기능을 안정적인 외부 엔진에 위임하고, 개발자는 애플리케이션 로직에 더 집중할 수 있게 되는 과정을 학습합니다. 서버 설정 및 구동은 여전히 프로그래밍 방식으로 직접 제어합니다.
스프링 프레임워크(Spring Framework) 를 도입하여 애플리케이션 로직과 서버 환경을 완전히 분리합니다. 스프링의 핵심 철학인 제어의 역전(IoC) 을 통해 DispatcherServlet이 요청을 중앙에서 처리하고, 컨트롤러는 평범한 자바 객체(POJO)로 구현됩니다. 결과물은 WAR 파일로 빌드되어 외부 서블릿 컨테이너에 배포되는 전통적인 방식을 따릅니다.
이전 과정들의 장점만을 모아놓은 여정의 최종 목적지입니다. 스프링 부트는 3번 모듈의 내장 서버 방식과 4번 모듈의 강력한 프로그래밍 모델을 결합하고, 자동 설정(Auto-Configuration) 이라는 마법을 통해 모든 인프라 설정을 자동화합니다. 모든 의존성과 내장 서버가 포함된 단일 실행 가능 JAR 파일 하나로 배포가 완료되며, 개발자는 오직 비즈니스 로직에만 집중할 수 있는 현대적인 개발 환경을 경험합니다.