Spring과 Spring Boot의 차이를 “설정/의존성/실행/운영” 관점에서 정리하고, Boot가 실무에서 어떤 문제를 줄여주는지 예제로 설명합니다.
도입 (문제 상황)
Spring으로 API 서버를 만들려는데, 시작부터 “설정이 너무 많다”는 느낌을 받으실 때가 있어요. 의존성 조합, 웹 서버 연결, 설정 파일, 로깅, 모니터링까지… 기능 개발 전에 준비 작업이 길어지면 속도가 확 떨어집니다. 그래서 많이들 묻습니다. “Spring Boot는 도대체 뭐가 달라서 다들 쓰는 걸까요?”
핵심 개념 — Spring vs Spring Boot 차이, Boot가 해결한 것들
먼저 용어부터 정리하면, **Spring Framework는 ‘프레임워크(핵심 기능 묶음)’**이고, **Spring Boot는 ‘Spring을 빠르고 안전하게 쓰기 위한 제품화된 패키징/운영 경험’**에 가깝습니다. 비유하자면 Spring이 엔진/부품 세트라면, Spring Boot는 “기본 조립이 끝나 있고 옵션도 추천값으로 맞춰진 완성차”에 가까워요.
Spring Boot가 해결한 핵심은 보통 아래 4가지로 요약됩니다.
- 의존성 지옥 완화 (Starter + BOM)
Spring만으로도 가능하지만, 실무에서는 라이브러리 버전 충돌이 자주 납니다. Boot는spring-boot-starter-*로 “자주 같이 쓰는 조합”을 제공하고,spring-boot-dependencies(BOM)로 검증된 버전 조합을 강제해 줍니다. 덕분에 “A 라이브러리 올렸더니 B가 깨짐” 같은 일이 크게 줄어요. - 설정의 자동화 (Auto Configuration)
Spring의 강점은 유연함이지만, 유연함은 곧 “결정해야 할 게 많다”는 뜻이기도 합니다. Boot는 클래스패스와 설정을 보고 필요한 Bean을 조건부로 자동 등록합니다. 예를 들어spring-boot-starter-web을 추가하면 내장 톰캣, Spring MVC, Jackson 등이 자연스럽게 연결됩니다. - 실행/배포 경험 단순화 (Executable Jar + 내장 서버)
예전에는 WAS에 올릴 WAR 배포가 흔했지만, Boot는 내장 서버로 단독 실행 가능한 Jar를 기본으로 합니다. CI/CD 파이프라인에서 “jar 하나”로 굴릴 수 있어 운영 단위가 단순해집니다. (물론 조직 표준에 따라 WAR도 가능하지만, 기본은 Jar 중심입니다.) - 운영 친화 기능 기본 제공 (Actuator, Metrics, Health)
실무에서 중요한 건 “잘 만든 기능”만이 아니라 장애를 빨리 감지하고 대응하는 능력입니다. Boot는 Actuator로 헬스체크/메트릭/환경정보 등을 표준 엔드포인트로 제공해 운영 도구(Prometheus, Grafana 등)와 연결하기 쉬워요.
아래 표로 Spring과 Spring Boot의 차이를 “개발자가 실제로 부딪히는 지점” 중심으로 정리해 보겠습니다.
| 관점 | Spring Framework | Spring Boot |
|---|---|---|
| 시작 속도 | 필요한 라이브러리/설정을 직접 선택 | Starter로 조합 제공, 기본값으로 빠르게 시작 |
| 설정 방식 | Java Config 중심(직접 구성 비중 큼) | Auto Configuration + properties로 “필요한 것만” 조정 |
| 의존성 버전 | 프로젝트가 직접 관리(충돌 위험) | BOM으로 검증된 버전 조합 제공 |
| 실행/배포 | 환경에 따라 다양(WAR 등) | 내장 서버 + 실행 Jar가 기본 |
| 운영 기능 | 직접 붙이거나 별도 구성 | Actuator로 표준 운영 엔드포인트 제공 |
그리고 실무 포지션을 한 문장으로 말하면 이렇습니다.
Spring Boot는 “Spring으로 서비스 만들 때 반복되는 결정을 표준화해서, 기능 개발과 운영 안정성에 집중하게 해주는 기본 플랫폼”입니다.
flowchart LR
A["Spring Framework"] --> B["Your Configuration"]
B --> C["Application"]
D["Spring Boot"] --> E["Starters + Auto Configuration"]
E --> F["Application (Production-ready defaults)"]

Spring은 구성 조합을 직접 설계하는 비중이 크고, Boot는 검증된 기본값으로 빠르게 “서비스 형태”를 만듭니다.
코드 예제 — Spring Boot가 “기본값 + 운영”을 어떻게 주는지 체감하기
아래 예제는 Spring Boot 3.x + Java 17 기준으로, “웹 API 1개 + Actuator 헬스체크”까지 한 번에 실행되는 최소 구성을 보여줍니다. 복붙 후 실행하면 /api/hello와 /actuator/health가 바로 동작합니다.
build.gradle
plugins {
id 'java'
id 'org.springframework.boot' version '3.3.2'
id 'io.spring.dependency-management' version '1.1.6'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
java {
toolchain {
languageVersion = JavaLanguageVersion.of(17)
}
}
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
// 운영에 필요한 헬스체크/메트릭 엔드포인트 제공
implementation 'org.springframework.boot:spring-boot-starter-actuator'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
application.yml
server:
port: 8080
management:
endpoints:
web:
exposure:
include: "health,info"
endpoint:
health:
probes:
enabled: true
SpringBootApplication
package com.example.demo;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 컴포넌트 스캔 + 자동 설정의 시작점
public class DemoApplication {
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
}
Controller
package com.example.demo;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/api/hello")
public String hello() {
return "hello, spring boot";
}
}
실행 방법
- 실행:
./gradlew bootRun - 확인:
GET http://localhost:8080/api/helloGET http://localhost:8080/actuator/health- (Kubernetes 환경이라면)
GET /actuator/health/liveness,GET /actuator/health/readiness
이 짧은 코드에서 Boot의 가치가 드러나는 지점은 “내장 서버, JSON, MVC, 로깅, 헬스체크”가 따로 조립하지 않아도 기본으로 묶여 나온다는 점입니다. Spring만으로도 만들 수 있지만, Boot는 그 과정을 “표준화된 출발선”으로 바꿔 줍니다.
실무 팁
💡 실무에서는: “자동 설정”을 마법으로 두지 마세요
Boot의 자동 설정은 편하지만, 문제 생겼을 때 원인을 못 찾으면 더 불편해집니다. 트러블슈팅할 때는 Condition Evaluation Report(자동 설정 적용/미적용 이유)를 확인하는 습관이 도움이 됩니다. 또한 운영 환경에서는 Actuator 노출 범위를 꼭 최소화하고(필요한 것만 include), 민감 정보가 노출되지 않도록 보안 설정을 함께 고려해 주세요.
💡 실무에서는: Starter는 “편의”이자 “표준화”입니다
팀에서 의존성을 제각각 추가하면 서비스마다 로깅/HTTP 클라이언트/JSON 설정이 달라져 운영 난이도가 올라갑니다. 가능하면 Starter 중심으로 맞추고, 예외가 필요한 경우에만 이유를 문서화해 두면 유지보수가 훨씬 편해집니다.
핵심 요약
- Spring은 강력한 프레임워크이고, Spring Boot는 Spring을 빠르고 안전하게 쓰기 위한 표준 패키징입니다.
- Starter/BOM, Auto Configuration, 실행 Jar, Actuator로 “반복 작업”과 “운영 공백”을 줄여줍니다.
- 실무에서는 자동 설정을 이해하고, 운영 엔드포인트 노출을 최소화하는 습관이 중요합니다.
다음 글: #02 Spring Initializr로 프로젝트 한방 생성