본문 바로가기

Back-end/Java&Spring

Spring Boot - 핵심 기능

스프링 부트의 핵심 기능을 설명하기 전에 간단하게 왜 Spring Boot가 등장했는지부터 알아보자!

 

Spring Boot 등장 배경

스프링의 생태계가 점점 커지면서 다양한 오픈 소스의 등장으로 수 많은 라이브러리를 함께 사용해야 하게 되었다.
라이브러리를 사용할 때 필요한 설정이 점점 늘어나고 수많은 스프링 빈 등록을 해야했고 심지어 스프링 프로젝트를 시작하는 것 조차 설정이 너무 복잡해 최소한의 인간 개입으로 시작을 위한 설정 과정을 대신 해주는 Spring Boot가 등장하게 되었다.

 

 

Spring Boot 핵심 기능

 

스프링 부트 핵심 기능은 크게 다섯 가지가 있다.

 

1. WAS (Web Application Server)

 

과거에 자바로 웹 애플리케이션을 개발할 때는 먼저 서버에 톰캣 같은 WAS(웹 애플리케이션 서버)를 설치했다. 그리고 WAS에서 동작하도록 서블릿 스펙에 맞추어 코드를 작성하고 WAR 형식으로 빌드해서 war 파일을 만들었다.

이렇게 만들어진 war 파일을 WAS에 전달해서 배포하는 방식으로 전체 개발 주기가 동작했다.

 

또한 WAS를 실행하는 시점에 서비스에 필요한 필터와 서블릿을 등록하고 스프링 컨테이너를 만들고, 디스패쳐 서블릿도 등록해야한다.
(물론 스프링 MVC를 사용하면 해당 과정은 애플리케이션 초기화만 하면 된다.)

 

 

-> 스프링 부트를 사용한다면 Tomcat과 같은 웹 서버를 내장하고 있어 별도의 웹 서버를 설치할 필요가 없다.

 

 

 

2. 라이브러리 관리

 

과거에는 프로젝트를 시작할 때 수많은 라이브러리를 직접 선택해야 했고 또한 각 라이브러리의 버전까지 직접 세팅해야 했다.

각 라이브러리들끼리 호환이 잘 되는 버전도 있지만 잘 안되는 버전들도 있어 프로젝스 세팅 시 많은 시간이 소비되었다.

 

스프링 부트는 개발자가 라이브러리들을 편리하게 사용할 수 있는 다양한 기능들을 제공한다.

 

외부 라이브러리 버전 관리

 

io.spring.dependency-management 플러그인을 통해 버전 관리가 가능하며
과거엔 build.gradle의 dependencies에 버전까지 등록했지만 버전 정보 없이 등록이 가능해진다!

 

스프링 부트 스타터 제공

 

웹 프로젝트를 하나 실행하려면 필요했던 스프링 웹 MVC, 내장 톰캣, JSON 처리, 스프링 부트 관련, LOG, YML 등등 다양한 라이브러리를 모아둔 스프링 부트 스타터를 제공해준다.

 

 

스프링 부트 스타터 목록

 

spring-boot-starter : 핵심 스타터, 자동 구성, 로깅, YAML

spring-boot-starter-jdbc : JDBC, HikariCP 커넥션풀

spring-boot-starter-data-jpa : 스프링 데이터 JPA, 하이버네이트

spring-boot-starter-data-mongodb : 스프링 데이터 몽고

spring-boot-starter-data-redis : 스프링 데이터 Redis, Lettuce 클라이언트

spring-boot-starter-thymeleaf : 타임리프 뷰와 웹 MVC

spring-boot-starter-web : 웹 구축을 위한 스타터, RESTful, 스프링 MVC, 내장 톰캣

spring-boot-starter-validation : 자바 빈 검증기(하이버네이트 Validator)

spring-boot-starter-batch : 스프링 배치를 위한 스타터

 

 

-> 손쉬운 빌드 구성을 위한 스타터 종속성을 제공해 개발자가 직접 사용할 라이브러리를 전부 하나하나 가져오지 않아도 되고, 스프링과 외부 라이브러리의 버전을 자동으로 관리해 충돌 문제가 일어나지 않게 해준다.

 

 

3. 자동 구성

예전에는 프로젝트를 진행할 때 마다 프로젝트에 필요한 객체들을 스프링 빈으로 등록해야 했다.

다른 프로젝트를 진행한다면 또 스프링 빈 등록을 반복해야 하니 번거움이 컸다.

 

 

스프링 부트는 프로젝트 시작에 필요한 스프링과 외부 라이브러리의 빈을 자동으로 등록해준다.

 

4. 외부 설정

 

하나의 애플리케이션을 여러 다른 환경에서 사용해야 할 때가 있다.

문제는 각각의 환경에 따라서 서로 다른 설정값이 존재한다는 점이다.

 

그래서 보통 다음과 같이 빌드는 한번만 하고 각 환경에 맞추어 실행 시점에 외부 설정값을 주입한다.

 

외부 설정 방식은 크게 4가지가 있다.

  1. OS 환경 변수: 운영체제에서 설정된 변수 값을 애플리케이션에서 읽어와 설정에 반영
  2. 자바 시스템 속성: JVM 실행 시 -D 옵션을 사용해 설정값을 전달
  3. 커맨드 라인 인수: 애플리케이션 실행 시 전달되는 인수로 설정값을 지정
  4. 설정 파일: application.properties 또는 application.yml 파일을 통해 환경에 맞는 설정값을 제공

 

(설정 파일에 대한 내용은 다음 게시물에서 좀 더 자세히 다룰 예정이다) 

 

스프링 부트 애플리케이션은 다양한 환경에서 동일한 코드를 유지하면서 환경별로 다른 설정값을 주입받을 수 있다.

이를 통해 각각의 환경에 맞춰 별도로 빌드할 필요 없이, 실행 시점에 필요한 설정값만 외부에서 전달받을 수 있게 된다.

 

스프링 부트는 서버들의 환경에 따라 달라져야 하는 외부 설정을 공통화해준다.

 

 

5. 프로덕션 준비

 

애플리케이션 모니터링은 시스템의 성능을 추적하고 문제가 발생할 경우 신속하게 대응하기 위해 필수적이다.

 

스프링 부트는 또한 액추에이터를 통해 운영 중인 애플리케이션을 모니터링하고 관리하는 데 필요한 다양한 기능을 제공한다.

 

또한 액추에이터와 함께 스프링 부트에서 제공하는 마이크로미터(Micrometer)를 통해 메트릭 수집을,

오픈소스 툴킷인 프로메테우스(Prometheus)로 데이터를 저장하고, 그라파나(Grafana)를 이용해 시각화하여 실시간 모니터링이 가능하다.

 

스프링 부트는 모니터링을 위한 메트릭, 상태 확인 기능을 제공해준다.

 

 

 

 

 

 

 

결론

-> 스프링 부트는 스프링 프레임워크를 쉽게 사용할 수 있게 도와주는 도구이다.