← 프로그래밍
PROGRAMMING

Spring Framework와 Spring Boot: 차이와 Boot로 시작하는 이유

의존성 주입부터 자동 구성까지 역할을 비교하고, 첫 웹 애플리케이션을 Spring Boot로 시작하는 이유를 정리한다.

두 기술은 어떤 관계인가

Spring Framework는 애플리케이션의 기반이고, Spring Boot는 그 기반을 사용해 애플리케이션을 구성하고 실행하는 일을 돕는다. Boot 애플리케이션도 Framework의 기능을 사용한다. 둘의 관계를 먼저 정리하면 무엇부터 배워야 할지 조금 선명해진다.

웹 요청을 처리하는 기능은 Spring MVC가 제공하고, 웹 애플리케이션에 필요한 구성과 실행 환경은 Boot가 준비를 돕는 식이다. 이름이 비슷해 처음에는 메뉴가 두 개인 줄 알기 쉽다. 실제로는 함께 쓰는 경우가 많다. 이 글에서는 특정 릴리스의 설치법보다 두 프로젝트의 역할과 학습 순서를 살펴본다.

Spring Framework가 제공하는 기반

Spring Framework 공식 소개는 의존성 주입, AOP, 트랜잭션, 데이터 접근, 테스트, Spring MVC와 WebFlux 등을 주요 기능으로 안내한다. 애플리케이션을 구성하는 여러 작업의 기반이 여기에 있다.

의존성 주입은 객체가 필요한 협력 객체를 외부에서 받도록 구성하는 방식이다. Spring 컨테이너에 등록된 객체를 Bean이라고 하며, 컨테이너는 객체의 생성과 의존 관계 연결을 관리한다. 각 객체가 맡은 역할을 나누고 테스트하기 쉽게 만드는 데 도움이 된다.

트랜잭션은 여러 데이터 변경을 하나의 작업 단위로 다룰 때 사용하는 기반이다. 웹 애플리케이션에서는 컨트롤러가 요청을 받고, 서비스가 업무 규칙을 처리하며, 데이터 접근 계층이 저장소와 통신하도록 역할을 나눌 수 있다. 이런 구조는 개발자가 설계한다. Boot를 사용해도 업무 규칙이 어느 객체에 들어갈지는 여전히 결정해야 한다.

Framework만으로도 애플리케이션을 만들 수 있다. 선택한 기능에 필요한 의존성과 구성, 실행·배포 방식을 프로젝트에서 준비하면 된다. Java 기반 구성도 지원하므로 Framework와 Boot를 XML 사용 여부로 나누는 구분은 정확하지 않다.

Spring Boot가 줄여주는 준비 작업

Spring Boot 공식 소개는 독립 실행 애플리케이션, starter 의존성, 자동 구성, 내장 서버, 상태 확인과 외부 설정 등의 기능을 설명한다. 애플리케이션을 만들기 위해 반복해서 준비하던 일을 줄여주는 방향이다.

Starter는 특정 용도에 필요한 의존성을 묶는다. Spring Initializr에서 웹 기능을 선택하면 해당 Boot 버전에 맞는 의존성을 포함한 프로젝트를 생성할 수 있다. 실제 라이브러리 버전과 조합은 생성된 빌드 파일에서 확인할 수 있다.

내장 서버를 사용하는 웹 애플리케이션은 별도 서버에 WAR를 배포하는 과정을 줄이고 애플리케이션 자체를 실행하는 방식으로 시작할 수 있다. 서버가 필요한지는 웹 의존성과 선택한 애플리케이션 유형에 따라 달라진다. Boot 애플리케이션이라는 이유만으로 언제나 웹 서버가 뜨는 것은 아니다.

운영 기능은 실행 이후를 돕는다. Actuator를 추가하면 상태 확인과 관측 기능을 사용할 수 있다. 필요한 항목과 접근 범위는 설정해야 한다. 실행이 간단해져도 운영상의 판단까지 사라지지는 않는다.

자동 구성은 무엇을 자동으로 하는가

자동 구성 문서에 따르면 Boot는 추가된 라이브러리 등을 바탕으로 애플리케이션 구성을 준비하려고 시도한다. 설정 파일과 이미 등록된 Bean 같은 조건도 구성 선택에 영향을 줄 수 있다.

공식 문서는 직접 DataSource Bean을 정의하면 기본 데이터베이스 자동 구성이 물러나는 예를 설명한다. 특정 자동 구성을 제외하는 방법도 있다. 자동 구성은 조건에 맞는 기본값을 제공하며, 필요한 부분은 개발자가 직접 구성할 수 있다.

이 원리를 모르면 자동 구성은 편리함과 당혹스러움을 함께 준다. 예상과 다르게 동작할 때는 어떤 조건으로 구성이 적용됐는지 확인해야 한다. --debug 옵션으로 조건 평가 보고서를 확인하는 방법도 공식 문서에 안내되어 있다. 기본값을 활용하는 것과 그 기본값을 이해하는 일은 함께 가는 편이 좋다.

역할을 표로 비교하기

비교 항목 Spring Framework Spring Boot
주된 역할 객체 관리, 웹, 데이터 접근 등 핵심 기반 Spring 애플리케이션의 구성과 실행을 단순화
의존성 준비 필요한 라이브러리를 직접 선택·구성 starter와 의존성 관리 기능으로 준비를 도움
구성 방식 필요한 Bean과 기능을 구성 조건에 맞는 기본 구성을 제공하고 직접 변경 가능
웹 서버 실행 선택한 방식에 맞게 실행 환경 준비 내장 서버로 독립 실행 가능
학습 대상 DI, Bean, MVC, 트랜잭션 등 자동 구성, 설정, 실행, 운영 기능 등

Boot로 시작해도 Framework의 개념은 계속 배우게 된다. 준비된 기반 위에서 자신이 작성한 객체와 업무 로직이 어떻게 동작하는지 이해해야 하기 때문이다.

첫 API를 만들어보는 순서

Spring Initializr에서 Java와 Maven을 선택하고, 화면에서 제공하는 정식 Boot 버전과 호환 Java 버전을 선택한다. 의존성에 Spring Web을 추가하고 프로젝트를 내려받으면 된다. 정확한 버전별 요구 사항은 선택한 버전의 공식 문서에서 확인한다.

생성된 애플리케이션 클래스와 같은 패키지에 다음 컨트롤러를 추가한다. 구조를 설명하는 최소 예제이므로 package는 자신의 프로젝트에 맞춘다.

package com.example.demo;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HelloController {
    @GetMapping("/hello")
    public String hello() {
        return "Hello, Spring Boot!";
    }
}

Maven 프로젝트 루트에서 다음 명령을 실행한다. Windows에서는 mvnw.cmd spring-boot:run을 사용할 수 있다.

./mvnw spring-boot:run

기본 포트를 변경하지 않았다면 http://localhost:8080/hello에서 문자열 응답을 확인할 수 있다. 웹 요청 처리 방식과 실행 흐름은 공식 REST 서비스 가이드를 참고했다. 코드는 별도 Java 프로젝트에서 실행하는 예제다.

생성된 메인 클래스의 @SpringBootApplication은 자동 구성 활성화, 컴포넌트 스캔, 추가 구성 정의를 함께 제공한다. 공식 어노테이션 문서에서 각 역할을 확인할 수 있다. 컨트롤러를 메인 클래스와 같은 패키지에 두는 이유는 기본 스캔 범위 안에 들어가도록 하기 위해서다.

왜 Spring Boot로 시작해야 하는가

새로운 Java 웹 애플리케이션을 배우는 상황이라면 Spring Boot로 시작하는 것을 권한다. 첫 요청과 응답을 빠르게 만들고, 컨트롤러·서비스·저장소를 나누며 Framework의 개념을 실제 코드에 연결할 수 있기 때문이다. 앞서 살펴본 기능을 바탕으로 한 학습 순서의 제안이다.

첫 API를 만든 다음 생성자 주입으로 서비스를 연결하고, 데이터 접근과 트랜잭션을 배운 뒤 자동 구성과 운영 설정을 살펴보는 순서가 좋다. 실행되는 작은 애플리케이션을 기준으로 배우면 각 개념이 어떤 문제를 해결하는지 확인하기 쉽다.

이미 Framework 기반으로 운영 중인 프로젝트를 다루거나 특별한 배포 제약이 있다면 기존 구조를 먼저 이해해야 한다. 새로운 프로젝트에서는 Boot가 준비 작업을 줄여준다. Boot로 실행 가능한 결과를 만들고, 그 안에서 Spring Framework를 차근차근 이해하는 방향이 자연스럽다. 시작에 필요한 설정은 줄이고, 이해해야 할 개념은 실제 코드와 함께 배워가는 방식이다.

← 전체 글로 돌아가기