스프링 이전의 프레임워크, EJB (Enterprise Java Bean)
2000년대 초반, 스프링 이전에 등장한 프레임워크로 스프링과 비슷한 기능을 제공하는 프레임워크이다.
개발자들이 복잡하고 어려운 로우 레벨 기술에 신경을 쓰기 보다는 정말 중요한 애플리케이션의 핵심인 비즈니스 로직을 좀 더 빠르고 효과적으로 개발할 수 있도록 돕기위해 등장하였다.
EJB는 주로 기업환경에서 분산된, 트랜잭션을 다루는, 확장 가능한 Java 애플리케이션을 개발하기 위한 컴포넌트 아키텍처로 사용되었다. 이론적으론 되게 좋은 기술이었지만, 실제로 사용하기에는 너무 비쌌고 비즈니스 로직 보다 EJB를 사용하기 위해서 따로 구현하거나 상속해야 하는 등 EJB에 너무 의존적이고 종속적인 개발을 할 수 밖에 없어 자바의 최대 장점인 객체 지향을 살릴 수 없게 되었다.
스프링(Spring)의 등장
개발자들이 EJB에 대해 많은 불편함을 느끼고 있던 와중에 스프링 프레임워크가 등장했다. 스프링의 이름이 Spring인 이유도, 추운 겨울이였던 EJB를 지나 맞이한 봄이라는 뜻을 가지고 있다.
스프링은 초기 설정만 잘 해두면 EJB와 거의 동일한 기능을 제공하면서, EJB의 목적이였던 비즈니스 로직과 어플리케이션 기술의 분리라는 목적도 성공적으로 달성할 뿐 아니라 자바의 최대 장점인 객체 지향을 최대한 살려서 개발할 수 있는 환경을 제공했다.
또한, 스프링이란 하나의 기술이 아니고 여러 가지 스프링 프로젝트들의 모음이다. 스프링 클라우드, 스프링 시큐리티와 같은 모든 스프링 프로젝트 들은 스프링 프레임워크를 기반으로 동작한다.
스프링과 부트의 등장
하지만 스프링 생태계가 점점 커져가고 스프링 프레임워크의 기능이 많아지고 오픈소스의 등장으로 스프링에서 외부 라이브러리를 끌고 와서 작업해야 하는 경우가 많아졌다. 이로 인해 스프링으로 개발을 시작할 때 직접 해야 하는 설정이 너무 많아지고 복잡해져서 개발자들이 비즈니스 로직에 집중한다기 보단 초반 설정을 하느라 대부분의 시간을 사용하게 되었다.
스프링 부트란?
이후 이러한 불편함을 해결하기 위해 등장한 서브 프로젝트가 바로 스프링 부트이다. 스프링 부트는 '스프링 프레임워크 개발 도구'로 엔터프라이즈급 애플리케이션을 개발하기 위해서 필요한 기능들을 제공해 주는 개발도구 이다. 하지만 이제는 완전한 메인 프로젝트가 되어버린 특이한 케이스다.
스프링과 스프링 부트 비교
스프링 부트가 없던 시절 스프링의 어려움과 스프링 부트는 이를 어떻게 해결 했는지 알아보자
내장 서버
스프링 부트가 없던 시절 웹 어플리케이션을 만들어서 배포를 하려면 먼저 WAS를 설치하고 개발한 어플리케이션 코드를 WAR로 빌드한 이후 WAR 파일을 WAS에 넣고 WAS를 실행해야 했다. 이런 귀찮은 과정을 해결하기 위해 스프링 부트는 내장서버를 지원한다.
WAS인 톰캣도 자바로 이루어져 있다. 스프링 부트는 톰캣을 라이브러리로 포함하는 내장 톰캣 기능이 있다. 스프링 부트는 메인 메소드가 존재하고 개발자들은 별도로 WAS를 설치 할 필요 없이 이 메인 메소드를 한번 실행 하면 웹 서버와 개발한 스프링을 바로 띄울 수 있게 되었다.
편리한 의존성과 권장 버전 관리
기존의 레거시 스프링 기반의 개발은 Spring WEB MVC, 내장 톰캣, JSON 관련 라이브러리, 로그 관련 라이브러리 등 많은 것들을 직접 다 선택해서 추가해야했다. 그리고 이들간의 호환성을 위해 버전도 직접 선택해야 했다. 이런 귀찮음과 불편함이 스프링 부트에서는 라이브러리를 관리하는 편리한 툴을 제공하여 해결했다.
spring.dependency-management라는 플러그인을 추가하면 버전을 생략할 수 있게 되고, 스프링이 제공하는 기본 라이브러리의 묶음을 스프링 부트 스타터라는 패키지를 통해 자동으로 가져오게 되었다. 웹 개발을 하고 싶으면 스프링 부트 스타터 웹, JDBC를 사용하려면 스프링 부트 스타터 JDBC를 넣어주면 된다. 스프링 부트를 사용하고나서는 개발자들은 훨씬 편리하게 라이브러리를 관리할 수 있게 되었다.
자동 구성(auto-configuration)
JdbcTemplate, DataSource, TransactionManager 등과 같은 일반적으로 자주 사용하는 수 많은 빈들을 스프링 부트가 자동으로 등록해주는 기능이다. 이러한 빈들을 확인하려면 spring-boot-autoconfigure 라이브러리를 확인하면 된다. 여기에 존재하는 수많은 폴더들이 스프링 부트가 자동으로 등록해주는 빈들이다.
위의 @EnableAutoConfiguration 어노테이션이 자동 구성을 활성화 시켜주는 어노테이션이다. 해당 어노테이션 안에 들어가면
위 사진의 AutoConfigurationImportSelector를 import 하고 있다. importSelector는 설정 정보 대상을 동적으로 선택하는 역할을 하는데, 내부 로직을 통해 상황에 따라 import 를 동적으로 선택해주는 역할을 한다. AutoConfigurationImportSelector는 모든 라이브러리들을 확인해서 자동 설정에 대한 동적 import를 하는 역할을 한다.
이렇게 해당 파일의 설정 정보가 스프링 컨테이너에 자동으로 등록되면서 빈들이 자동으로 올라가게 된다.