Sprout

29%
성능 향상
85%+
테스트 커버리지
687개
단위 테스트
14편
기술 블로그 글

TL;DR

Spring Boot의 핵심 기능(IoC/DI, AOP, MVC)을 직접 구현한 경량 웹 프레임워크. 비동기 논블로킹 NIO 서버와 WebSocket을 직접 구현하고, JIT 컴파일러 최적화를 통해 응답 안정성을 29% 향상시켰습니다.

📊 핵심 아키텍처

개요

Spring Boot의 핵심 기능을 직접 구현하여 프레임워크 내부 동작 원리를 깊이 이해하고자 시작한 프로젝트입니다. IoC/DI 컨테이너, AOP 프록시, MVC 패턴을 밑바닥부터 구현하며 Spring의 설계 철학을 체득했습니다. 또한 비동기 논블로킹 서버 아키텍처를 설계하고 WebSocket 실시간 통신 프로토콜을 직접 구현했습니다.

핵심 성과

  • Java Reflection과 CGLIB를 활용한 커스텀 IoC/DI 컨테이너 구현
  • 프록시 패턴 기반의 AOP(관점 지향 프로그래밍) 구현
  • Annotation 기반 MVC 프레임워크 및 DispatcherServlet 구현
  • NIO Selector와 이벤트 루프 기반의 비동기 논블로킹 HTTP 서버 구현
  • WebSocket 프로토콜 직접 구현으로 실시간 양방향 통신 지원
  • async-profiler, JMC, JITWatch를 활용한 성능 분석 및 최적화
  • JIT 컴파일러 친화적 코드 리팩토링으로 응답 안정성 29% 향상
  • 687개 단위 테스트 작성 (라인 커버리지 85%+, 분기 커버리지 75%+)

회고

Spring을 매일 쓰면서도 내부가 어떻게 돌아가는지 모른다는 불안감이 컸는데, 직접 구현하면서 그 불안이 사라졌다. 프레임워크는 마법이 아니라 잘 설계된 패턴의 집합이라는 걸 몸으로 이해했다.

  • NIO Selector 기반 이벤트 루프를 구현하면서 블로킹과 논블로킹의 차이가 코드 레벨에서 어떻게 표현되는지 직접 경험했다. Spring이 왜 그런 설계를 선택했는지 자연스럽게 납득됐다.
  • RFC 6455를 읽고 WebSocket을 구현하면서, 명세서가 단순히 '이렇게 해라'가 아니라 '왜 이렇게 설계했는가'까지 담고 있다는 것을 알았다. 마스킹, Sec-WebSocket-Accept, close 핸드셰이크 모두 납득할 이유가 있었다.
  • JIT 최적화 분석을 통해 '빠른 코드'가 단순히 알고리즘 최적화가 아니라 JVM이 최적화하기 좋은 코드를 작성하는 것임을 배웠다. async-profiler와 JITWatch를 쓰기 전까지는 막연했던 개념이었다.
  • 바퀴를 다시 만드는 것이 낭비처럼 보이지만, 그 과정에서 얻는 이해의 깊이는 다른 방법으로 대체하기 어렵다. 687개의 테스트를 작성하면서 설계의 결함을 스스로 발견하고 고치는 경험이 특히 좋았다.

기술 스택

Java 21Reflection APICGLIBNIO (Non-blocking I/O)WebSocketJUnit 5async-profilerJMC (Java Mission Control)JITWatch

관련 블로그 글