Spring Boot

"Spring Boot makes it easy to create stand-alone, production-grade Spring based Applications."

— 복잡하고 뚱뚱한 설정 지옥의 스프링 프레임워크를 편리하게 경량화했다는 공식 선언.

대한민국 SI 업계의 절대권력이자, '우리는 전자정부프레임워크를 씁니다'라고 쓰고 '실제론 스프링 부트를 가져다 씁니다'라고 읽는 생태계의 중심. 자동 설정(Auto-configuration)이 너무 편리해서 고맙긴 한데, 에러 났을 때 스프링 내부 프록시 객체 스택트레이스 읽다 보면 머리가 돌 것 같다...

1. 개요

Spring Boot는 기존 Java 진영의 Spring Framework가 자랑하던 살인적인 XML 설정 지옥을 타파하고, '설정보다 관례(CoC)'를 앞세워 현대 웹 애플리케이션 개발의 사실상 절대 표준으로 자리 잡은 프레임워크이다. 내장 서블릿 컨테이너(Embedded Tomcat)를 품고 있어 복잡한 WAS 설치 없이 단독 실행 가능한 Jar 파일 하나로 배포가 끝나는 혁신을 불러왔다.

특히 한국에서는 공공기관 및 대기업 SI 프로젝트의 마지노선인 전자정부프레임워크의 중심부 기술로 자리 잡고 있어, '스프링 할 줄 알아요?'가 한국 백엔드 개발자 구직 시장의 알파이자 오메가로 기능하고 있다.(...)

2. 제어의 역전(IoC), 의존성 주입(DI), 그리고 마법의 자동 설정(Auto-Configuration)

2.1. 스프링의 근본: IoC와 DI

스프링의 가장 큰 아키텍처적 기반은 제어의 역전(IoC: Inversion of Control)의존성 주입(DI: Dependency Injection)이다. 개발자가 직접 new 키워드로 객체를 생성하고 수명을 관리하던 방식에서 벗어나, 스프링 컨테이너(ApplicationContext)가 객체(Bean)들을 스스로 생성하고 싱글톤으로 관리하며 필요한 곳에 주입해 준다. 덕분에 클래스 간 결합도가 극적으로 낮아지고 유연한 설계가 가능해졌지만, 입문자들에게는 대체 이 객체가 언제 어디서 생성되어 들어온 건지 코드로 추적하기 힘들어 미아가 되게 만드는 주범이기도 하다.1

2.2. 스프링 부트의 알파: 자동 설정 (Auto-Configuration)

부트의 치트키는 바로 @EnableAutoConfiguration이다. 내 프로젝트의 의존성 라이브러리에 spring-boot-starter-web이 꽂혀 있으면, 부트가 알아서 '아, 이 자식은 웹 서버를 띄우겠구나!' 하고 내장 톰캣을 올리고 JSON 변환기(Jackson)를 자동으로 바인딩해 준다. 예전 스프링 시절 일주일 동안 설정 파일에 수천 줄의 XML을 적어가며 수작업으로 띄우던 웹 서버가 이제 단 3초 만에 올라가는 기적을 선사했다.

3. 한국 SI 시장의 애환과 전자정부프레임워크(eGovFrame)의 독점

대한민국 공공기관 프로젝트에 참여하기 위해서는 국가 표준 공공 프레임워크인 전자정부프레임워크를 무조건 사용해야 한다. 문제는 이 프레임워크가 아주 무거운 스프링 기반 위에 레거시 구조를 덕지덕지 얹어 놓았다는 것이다.

신세대 스프링 부트를 사용하여 우아하고 기민하게 마이크로서비스(MSA)를 빌드하고 싶은 개발자들은 SI 시장의 두껍고 딱딱한 벽에 부딪혀 결국 무덤 같은 대형 공공 사이트 아키텍처 속으로 빨려 들어간다. '스프링 버전은 무조건 3.x여야 한다'는 고집스러운 제안요청서(RFP)를 마주할 때마다, 한국 백엔드 개발자들의 이마에는 핏대가 서고 야근용 커피잔은 무겁게 쌓여만 간다.(...)2

그럼에도 스프링 부트의 뛰어난 호환성 덕분에, 현대의 스마트한 개발자들은 최신 부트로 껍데기를 짜고 속으로 전자정부 컴포넌트를 억지로 우겨넣는 타협을 이뤄내며 꿋꿋하게 생계를 유지하고 있다.

4. Bean 등록 순서 꼬임과 스프링 지옥

4.1. AbstractSingletonProxyFactoryBean

자바 스프링 특유의 극단적인 객체지향 추상화 설계로 인해 기하급수적으로 길어진 클래스명을 상징하는 대표적 클래스이다. 클래스명 하나가 거의 문장 수준에 육박하여, IDE의 자동완성 기능이 없던 시절 개발자들의 손가락 관절염을 유발했던 유서 깊은 풍자의 대상이다.

5. 여담

  • 이름의 유래: 왜 이름이 '스프링(Spring)'인가 하면, 전통적인 Java Enterprise 기술(EJB)의 무겁고 끔찍했던 '겨울'을 끝내고, 개발자들에게 따뜻한 '봄'을 가져다주겠다는 의미에서 로드 존슨이 작명한 감성 가득한 이름이다.
  • 초기 XML 삽질사: 스프링 부트가 없던 2010년대 극초반에는, 데이터베이스 연결 하나 설정하기 위해 수백 줄의 XML 설정 파일을 복사-붙여넣기하며 태그 하나 잘못 닫아서 에러를 찾느라 사흘 밤을 새우는 일도 허다했다.
  • 내장 톰캣의 딜레마: 서버에 WAS(Web Application Server)를 따로 설치하지 않고 .jar 실행 파일에 톰캣이 내장되어 있어, '어째서 자바로 만든 백엔드가 가볍게 도는 거지?'라며 신기해하는 주니어 개발자들의 단골 호기심 연구 대상이다.

6. 관련 문서

각주

  1. 런타임 시점에 스프링이 동적으로 클래스에 프록시(CGLIB, JDK Dynamic Proxy)를 입혀 트랜잭션을 적용하기 때문에 디버깅 스택을 찍어보면 내 코드는 온데간데없고 스프링 프록시 내부 코드만 수백 줄이 찍힌다.

  2. 한국 공공 SI 프로젝트는 철저하게 개발자들의 'M/M(Man-Month)' 단위로 노동력을 갈아 넣는 구조라, 기술적 혁신보다는 기존 시스템을 그대로 복제해서 기한 내에 때려 박는 것이 안전하다는 슬픈 어른들의 사정이 깔려 있다.