Spring Framework와 Spring Boot의 차이: Java 백엔드 시작하기

Alchemist·2026년 10월 8일

KT AIVLE

목록 보기
84/130

Java 문법으로 작은 프로그램을 만들 때는 main()에서 객체를 직접 연결해도 충분하다. 하지만 웹 서비스에는 HTTP 요청 처리, 객체 간 연결, DB 트랜잭션, 설정 등 반복되는 기반 작업이 많다. Spring Framework는 이런 공통 기능을 제공하고, Spring Boot는 Spring 기반 애플리케이션을 편리하게 설정하고 실행하게 해준다.

왜 Spring을 사용할까?

회원 가입 기능을 생각해보자. 요청을 받는 Controller, 가입 규칙을 처리하는 Service, 데이터를 읽고 쓰는 Repository가 협력한다.

HTTP 요청 → Controller → Service → Repository → DB
                 ↑             ↓
             HTTP 응답 ← 처리 결과

Spring은 객체 생성·연결을 관리하는 IoC/DI, 반복되는 부가 기능을 분리하는 AOP, 트랜잭션·캐시·웹 기술의 차이를 감추는 서비스 추상화를 제공한다.

Spring Boot는 이러한 Framework 위에 실행 환경과 자동 설정을 얹는다. Boot가 Framework를 대체하는 것은 아니다. @Service, @Component, @Transactional의 핵심 동작은 여전히 Framework에 속한다.

지금 프로젝트를 만든다면

예전 Java 프로젝트의 Java 8 필수 설정이나 Maven 리소스 빌드 플러그인을 최신 프로젝트에 그대로 복사하지 말자. 해당 프로젝트가 사용한 의존성 때문에 생긴 제약일 수 있다.

Spring Initializr에서 다음과 같이 시작한다.

  • Language: Java / Build: Gradle 또는 Maven
  • Spring Boot: 화면에서 안정 버전 선택
  • Java: Spring Boot 버전이 지원하는 JDK 선택 (예: 21 또는 25)
  • Dependencies: Spring Web MVC (spring-boot-starter-webmvc)

2026년의 Spring Boot 4 계열은 Java 17 이상을 요구한다. Boot 4에서는 오래된 spring-boot-starter-web보다 spring-boot-starter-webmvc를 선택하는 것이 권장된다. 버전 번호는 직접 추측해서 조합하지 않고 생성된 프로젝트의 의존성 관리를 따른다.

java -version
.\gradlew.bat --version

이 명령으로 Windows에서 실행하는 JDK와 Gradle 설정을 확인할 수 있다.

API 하나 만들어보기

기본 패키지가 com.example.shop이라면 아래 파일을 src/main/java/com/example/shop/StatusController.java에 만든다.

package com.example.shop;

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

@RestController
public class StatusController {
    @GetMapping("/api/status")
    public String status() {
        return "running";
    }
}

@RestController는 HTTP 응답 본문을 반환하는 컨트롤러라는 의미이고, @GetMapping은 GET 요청과 메서드를 연결한다. 생성된 메인 클래스에는 다음과 같은 진입점이 존재한다.

package com.example.shop;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class ShopApplication {
    public static void main(String[] args) {
        SpringApplication.run(ShopApplication.class, args);
    }
}

@SpringBootApplication에는 자동 설정과 컴포넌트 스캔을 활성화하는 구성이 포함된다. 기본적으로 메인 클래스가 속한 패키지와 하위 패키지를 탐색하므로 컨트롤러 위치가 중요하다.

.\gradlew.bat bootRun

브라우저에서 http://localhost:8080/api/status를 열면 running이 반환된다. 따로 설정하지 않았다면 기본 포트는 8080이다.

프로젝트 구조와 자주 발생하는 오류

src/main/java/       Java 애플리케이션 코드
src/main/resources/  설정 파일과 리소스
src/test/java/       테스트 코드
build/               Gradle 빌드 결과

Maven은 보통 pom.xml과 target/을 사용한다. 빌드 결과 디렉터리는 일반적으로 Git 관리 대상이 아니다.

  • 404: 컨트롤러의 URL과 컴포넌트 스캔 범위를 확인한다.
  • Port 8080 already in use: application.properties에 server.port=8081을 추가한다.
  • Unsupported class file major version: java -version, IDE의 Project SDK, Gradle JVM을 비교한다.
  • 옛날 코드에서 javax.servlet 오류: 최신 Jakarta 기반 프로젝트에는 API 패키지 및 의존성 변경이 필요하다. 단순히 JDK만 교체해서 해결되지 않는다.

참고 문서

핵심 정리

  • Spring Framework는 웹·객체 관리·AOP·트랜잭션의 기반 기능을 제공한다.
  • Spring Boot는 자동 설정과 실행 편의성을 제공한다.
  • @SpringBootApplication은 컴포넌트 탐색과 자동 설정의 출발점이다.
  • @RestController와 @GetMapping으로 기본 HTTP API를 만들 수 있다.
  • 옛 프로젝트의 Java 8 제약을 현재 Spring 전체의 요구사항으로 오해하면 안 된다.
  • 2026년 Boot 4 웹 MVC 프로젝트는 spring-boot-starter-webmvc를 고려한다.
profile
html_programming_language

0개의 댓글