직접 스프링 프레임워크 만들어보기(바퀴 두번 만들기)

yyubin·2025년 6월 5일

작년 10월 정도에 스프링의 기초 개념인 DI IoC, AOP 들과 Argument Resolver, Exception Resolver, 톰캣의 ThreadPool 등의 내용을 POJO(Java 17)와 몇몇 라이브러리들(리플렉션 등) 만을 활용하여 "나만의 작은 WAS이자 프레임워크"를 만들어본 바가 있다.

만들면서 실제로 재밌기도 했고, 이번엔 TODO로 남겨놓은 부분들을 추가로 개발해 볼 예정이고, 기존 코드의 복잡성을 낮추기 위해 리팩토링을 시작할 예정인데 이를 블로그에 연재식으로 남겨볼까 한다.

이유는, 만들면서 새로 배우는 것들을 더 잘 남겨보기 위해서, 그리고 실제 스프링과 정확히 어떤 차이점을 가지는 지에 대해서도 남기면 좋을 것 같은데 README.md에 전부 쓰기엔 양이 방대할 것 같아서 이다.

https://github.com/yyubin/sprout

위 레포지토리가 지금까지 DI(생성자로 주입함), IoC 컨테이너(타입 안전 이종 컨테이너이긴 함..), AOP(동적 프록시로 만들었음), @GetMapping 이라던지 등등의 기초적인 구현이 되어있고 추가로 만들어 보려고 하는 부분은 아래와 같다.

  1. Blocking I/O 에서 Non Blocking I/O로 전환
    현재는 고정 스레드풀을 사용하면서 실제 요청이 오면 스레드에 실어주는데, 이는 그냥 BIO방식이다. 당연히 최근 스프링은 NIO를 사용하기 때문에 이를 적용해보면 재밌지 않을까.. 현재 구상으로는 java.nio.channels.Selector를 이용한 Reactor 패턴을 적용하면 좋지 않을까 싶지만 아직까지는 구상단계
  2. 미들웨어 계층 추가
    우선적으로 생각 중인 것은 Spring Security의 필터/인터셉터, 스레드 로컬 등을 활용한 보안 개념 구현이다. 실제로 요청 받아서 필터나 인터셉터 레이어를 거치게 만들면 된다. 아주 어렵진 않을 듯.. 그리고 현재는 외부 세션 라이브러리를 사용했는데, 스레드 로컬로 전환해볼까 한다. 스레드 로컬 자체도 사실 JAVA에 탑재되어 있어서 어려울 건 없을 것 같다. NIO만 잘 만들면 된다..ㅎㅎ

우선은 이거 두개 먼저.. 더 구상하고 있긴한데 더 적어뒀다간 공수표 될 수 있을 것 같아서 추후에 추가되면 수정하는 걸로..🤔

우선은 기존 코드 리팩토링을 하고 설명하는 식으로 진행해볼 예정이다.

profile
블로그 이전 https://cassidycodes.vercel.app

0개의 댓글