티스토리 뷰
이번에는 SpringBoot의 실행 과정을 소스 코드로 직접 살펴보려고 합니다. Spring Boot의 소스 코드를 자세히 들여다보기 전에 먼저 Spring Boot는 어떠한 장점과 특징들을 갖는지 살펴보도록 하겠습니다.
아래의 내용은 SpringBoot 2.6.3를 기준으로 작성되었습니다.
1. SpringBoot의 장점과 특징
[ SpringBoot의 장점과 특징 ]
과거의 Spring 프레임워크는 XML로 설정을 해야 했고(물론 Spring3.1 부터는 Java로만 설정이 가능하다), 외장 톰캣에 war 파일을 만들어 배포해야 했으며, 설정이 필요한 부분들을 직접 구성하는 등의 번거로움이 상당히 많았다. 하지만 SpringBoot는 이러한 스프링의 문제점을 완벽히 해결해서 손쉽게 웹 애플리케이션을 만들고 실행할 수 있도록 도와주고 있다.
SpringBoot를 이용하면 다음과 같은 장점들을 누릴 수 있다.
- 자주 사용되는 라이브러리들의 버전 관리 자동화
- AutoConfig로 복잡한 설정 자동화
- 내장 웹서버 제공
- 실행 가능한 JAR로 개발 가능
자주 사용되는 라이브러리들의 버전 관리 자동화
우리가 사용하는 도구들(프레임워크나 라이브러리 등)에는 기본적으로 버전이 존재한다. 그리고 여러 도구들의 버전을 올바르게 조합해주지 않으면 예상치 못한 오류가 발생할 수 있다. 스프링 부트 개발자들은 이러한 문제점을 인지하고, 직접 라이브러리 버전들을 관리해준다. 그래서 maven이나 gradle 등과 같은 빌드 도구에 버전을 명시하지 않아도 적합한 라이브러리 버전을 찾아서 가져와준다.
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
implementation 'org.springframework.boot:spring-boot-starter-validation'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
implementation 'com.google.code.gson:gson'
compileOnly 'org.projectlombok:lombok'
annotationProcessor 'org.projectlombok:lombok'
implementation 'com.h2database:h2'
}
AutoConfig로 복잡한 설정 자동화
개발을 진행하다보면 json 메세지 변환, 프로프티 설정 등 다양한 공통적인 설정들이 필요하다. 스프링 부트는 개발을 위해 필요한 공통적인 부분들을 자동으로 구성해준다. 그래서 우리는 기본적으로 스프링 부트 프로젝트를 만들면 별도의 설정 없이 서버를 바로 띄울 수 있다.
그 뿐만 아니라 스프링부트는 ElasticSearch, Redis, Gson 등과 같은 자주 사용되는 외부 라이브러리들 역시도 자동 설정을 제공하고 있다. 해당 의존성을 추가하면 클래스 패스 기준으로 의존성이 존재하는지 파악하여 자동으로 설정을 해준다.
내장 웹서버 제공
과거의 스프링 프레임워크는 서버를 배포하기 위해 톰캣과 같은 별도의 외장 웹서버를 설치하고, war 파일을 생성하여 배포해주어야 했다. 이러한 방식은 상당히 번거롭고 처리 속도도 느렸는데, 스프링 부트는 내장 웹서버(톰캣 or 리액터 네티)을 가지고 있어서 별도의 작업 없이 빠르게 서버를 실행할 수 있도록 도와준다.
실행 가능한 JAR로 개발 가능
위에서 설명하였듯 스프링 프로젝트를 배포하기 위해서는 war파일을 만들어 외장 웹서버에 배포해야 했다. 하지만 스프링 부트는 순수 자바 애플리케이션 프로그램을 실행하는 것처럼 스프링부터 역시 jar로 실행 가능하도록 하였다. 그리고 이러한 부분은 애플리케이션 실행에 상당한 편리성을 제공해주고 있다.
그 외에도 개발자의 편리를 위한 dev-tools나 health check를 위한 indicator 등을 위한 프로젝트도 존재한다. dev-tools 같은 경우에는 애플리케이션 자동 재시작과 리로딩(사용자 코드 변화를 감지하고 애플리케이션을 재시작함), 라이브 리로드(HTML이나 JS 등의 파일이 변경되어도 다시 실행하지 않아도 됨) 등 개발에 상당히 편리하고 유용한 기능들을 제공하고 있다. 그 외에도 스프링 부트는 서블릿 컨텍스트까지 관리할 수 있어서 DelegatingFilterProxy 없이도 필터를 등록할 수 있다. (해당 내용을 모르면 여기를 참고하도록 하자.)
지금까지 스프링 부트가 어떠한 특징과 장점을 갖는지, 왜 스프링이 아닌 스프링 부트를 사용해야 하는지 살펴보았다. 누군가는 스프링 부트가 안정성이 좋지 못한다느니, 대용량 트래픽에 적합한지 검증되지 않았다느니 이상한 얘기를 하기도 한다.
스프링 부트는 기존의 스프링에서 편리한 부분들을 자동 제공하도록 만들어진 프로젝트이므로, 기본적인 골격과 동작 방식은 동일하다. 그러므로 신규 프로젝트를 해야 한다면 반드시 스프링 부트를 사용하도록 하자.
이어지는 다음 포스팅부터 스프링 부트가 어떻게 구성되어 있는지, 어떻게 동작하는지 소스코드를 보면서 자세히 살펴보도록 하자.
위의 내용들은 개인적으로 공부를 하면서 작성을 한 내용이라 충분히 틀리거나 잘못된 내용들이 있을 수 있습니다. 혹시 그러한 내용들을 발견하셨다면 댓글 남겨주세요! 반영해서 수정하도록 하겠습니다:)
관련 포스팅
- SpringBoot 소스 코드 분석하기, SpringBoot의 장점과 특징 - (1)
- SpringBoot 소스 코드 분석하기, 애플리케이션 컨텍스트(Application Context)와 빈팩토리(BeanFactory) - (2)
- SpringBoot 소스 코드 분석하기, @SpringBootApplication 어노테이션의 속성과 구성요소 - (3)
- SpringBoot 소스 코드 분석하기, SpringBootApplication의 생성과 초기화 과정 - (4)
- SpringBoot 소스 코드 분석하기, SpringBootApplication의 run 메소드와 실행과정 - (5)
- SpringBoot 소스 코드 분석하기, 애플리케이션 컨텍스트(ApplicationContext)의 refreshContext 동작 과정 - (6)
- SpringBoot 소스 코드 분석하기, DispatcherServlet(디스패처 서블릿) 동작 과정 - (7)