Spring Boot

Spring Boot는 왜 쓰는가? — Spring vs Spring Boot 차이와 실무 포지션

IT Lab 2026. 3. 4. 22:09

Spring과 Spring Boot의 차이를 “설정/의존성/실행/운영” 관점에서 정리하고, Boot가 실무에서 어떤 문제를 줄여주는지 예제로 설명합니다.

도입 (문제 상황)

Spring으로 API 서버를 만들려는데, 시작부터 “설정이 너무 많다”는 느낌을 받으실 때가 있어요. 의존성 조합, 웹 서버 연결, 설정 파일, 로깅, 모니터링까지… 기능 개발 전에 준비 작업이 길어지면 속도가 확 떨어집니다. 그래서 많이들 묻습니다. “Spring Boot는 도대체 뭐가 달라서 다들 쓰는 걸까요?”

핵심 개념 — Spring vs Spring Boot 차이, Boot가 해결한 것들

먼저 용어부터 정리하면, **Spring Framework는 ‘프레임워크(핵심 기능 묶음)’**이고, **Spring Boot는 ‘Spring을 빠르고 안전하게 쓰기 위한 제품화된 패키징/운영 경험’**에 가깝습니다. 비유하자면 Spring이 엔진/부품 세트라면, Spring Boot는 “기본 조립이 끝나 있고 옵션도 추천값으로 맞춰진 완성차”에 가까워요.

Spring Boot가 해결한 핵심은 보통 아래 4가지로 요약됩니다.

  1. 의존성 지옥 완화 (Starter + BOM)
    Spring만으로도 가능하지만, 실무에서는 라이브러리 버전 충돌이 자주 납니다. Boot는 spring-boot-starter-*로 “자주 같이 쓰는 조합”을 제공하고, spring-boot-dependencies(BOM)로 검증된 버전 조합을 강제해 줍니다. 덕분에 “A 라이브러리 올렸더니 B가 깨짐” 같은 일이 크게 줄어요.
  2. 설정의 자동화 (Auto Configuration)
    Spring의 강점은 유연함이지만, 유연함은 곧 “결정해야 할 게 많다”는 뜻이기도 합니다. Boot는 클래스패스와 설정을 보고 필요한 Bean을 조건부로 자동 등록합니다. 예를 들어 spring-boot-starter-web을 추가하면 내장 톰캣, Spring MVC, Jackson 등이 자연스럽게 연결됩니다.
  3. 실행/배포 경험 단순화 (Executable Jar + 내장 서버)
    예전에는 WAS에 올릴 WAR 배포가 흔했지만, Boot는 내장 서버로 단독 실행 가능한 Jar를 기본으로 합니다. CI/CD 파이프라인에서 “jar 하나”로 굴릴 수 있어 운영 단위가 단순해집니다. (물론 조직 표준에 따라 WAR도 가능하지만, 기본은 Jar 중심입니다.)
  4. 운영 친화 기능 기본 제공 (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 vs Spring Boot 비교 일러스트

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/hello
    • GET 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로 프로젝트 한방 생성