BlueNyang
[멀티캠퍼스] 풀스택 개발자 아카데미 (25) - Spring Boot(1)
Java 풀스택 아카데미
· 멀티캠퍼스 JAVA 풀스택 개발자 아카데미 6회차 (25편)

[멀티캠퍼스] 풀스택 개발자 아카데미 (25) - Spring Boot(1)

BlueNyangBlueNyang
·
·
약 8분
·
# 부트캠프후기# 멀티캠퍼스it부트캠프# [현대이지웰] JAVA 풀스택 개발자 아카데미 6회차# spring-boot# auto-configuration# embedded-was
시리즈·멀티캠퍼스 JAVA 풀스택 개발자 아카데미 6회차(30개의 글)
  • ···
  • 24.[멀티캠퍼스] 풀스택 개발자 아카데미 (24) - Spring Framework(4)
  • 25.[멀티캠퍼스] 풀스택 개발자 아카데미 (25) - Spring Boot(1)현재
  • 26.[멀티캠퍼스] 풀스택 개발자 아카데미 (26) - Spring Boot(2)
  • ···

1. 설정의 시대를 끝내다

앞선 글까지 우리는 STS 3.9 기반의 '레거시(Legacy) Spring MVC' 프로젝트를 다루었다. DispatcherServlet을 중심으로 HandlerMapping, ViewResolver 등의 컴포넌트가 동작하는 원리를 파악하고, MyBatis를 연동하여 데이터베이스 작업을 처리하는 방법, Ajax와 @ResponseBody를 이용한 비동기 통신까지 경험했다.

하지만 이 과정에서 우리는 수많은 XML 설정 파일(web.xml, root-context.xml, servlet-context.xml)과 씨름해야 했다. 어떤 빈을 등록할지, 어떤 어노테이션을 스캔할지, 트랜잭션은 어떻게 관리할지 등 모든 것을 개발자가 명시적으로 설정해야 했다. 또한, pom.xml에 필요한 라이브러리들을 추가할 때마다 버전 충돌을 걱정해야 했고, 코드를 실행하기 위해서는 별도로 설치된 톰캣(WAS)에 프로젝트를 배포(Deploy)하는 과정을 거쳐야 했다.

이러한 복잡성은 Spring 프레임워크 자체의 강력함에도 불구하고, 개발의 초기 진입 장벽을 높이고 생산성을 저해하는 주요 원인이었다.

이번 글에서는 이 모든 번거로움과 설정의 시대를 끝내기 위해 등장한 Spring Boot에 첫발을 내딛는다. 스프링 부트가 무엇이며, 어떤 핵심 특징으로 Spring 개발을 혁명적으로 변화시켰는지 알아본다. 또한, Spring Initializr를 통해 프로젝트를 생성하고, JSP를 뷰(View)로 사용하기 위한 설정 방법을 실습을 통해 익힌다.


2. 스프링 부트(Spring Boot)란 무엇인가?

스프링 부트(Spring Boot)는 새로운 프레임워크가 아니라, 기존의 스프링 프레임워크를 더 쉽고 빠르게 사용할 수 있도록 도와주는 서브프로젝트이다. 스프링 부트의 핵심 목표는 개발자가 복잡한 설정에 시간을 낭비하지 않고, 애플리케이션 개발(비즈니스 로직)에만 집중할 수 있는 환경을 제공하는 것이다.

즉, "Just Run(그냥 실행하면 됨)"이라는 철학 아래, 최소한의 설정만으로도 독립적으로 실행 가능한(Stand-alone), 상용화 수준(Production-grade)의 스프링 기반 애플리케이션을 매우 간편하게 구축할 수 있게 해준다.


3. 스프링 부트의 3가지 핵심 특징

스프링 부트가 어떻게 복잡한 설정을 단순화했는지는 다음 세 가지 핵심 특징으로 요약할 수 있다.

3.1. 의존성 관리의 단순화 (Starter Dependencies)

레거시 Spring 프로젝트에서는 spring-webmvc, spring-jdbc, jackson-databind, hibernate-validator 등 수많은 라이브러리를 pom.xml에 직접 추가하고, 이들 간의 버전 호환성을 개발자가 일일이 맞춰야 했다.

스프링 부트는 '스타터(Starter)' 라는 개념을 도입하여 이 문제를 해결했다. 스타터는 특정 기능(예: 웹 개발, DB 연동, 보안)에 필요한 의존성 라이브러리들의 묶음이다.

  • spring-boot-starter-web: 웹 애플리케이션 개발에 필요한 spring-webmvc, 내장 톰캣(tomcat-embed-core), jackson 등을 한 번에 가져온다.
  • spring-boot-starter-data-jpa: JPA(데이터 접근)에 필요한 spring-data-jpa, hibernate, spring-tx 등을 가져온다.
  • spring-boot-starter-mybatis: (공식 스타터는 아니지만) MyBatis 연동에 필요한 mybatis-spring-boot-autoconfigure, mybatis 등을 가져온다.

개발자는 이제 "웹 개발이 필요해"라는 의미로 spring-boot-starter-web 하나만 추가하면, 스프링 부트가 검증된 버전의 관련 라이브러리들을 알아서 모두 가져온다.

Spring-Boot-Starter-의존성-개념도
Spring-Boot-Starter-의존성-개념도

3.2. 자동 설정 (Auto-Configuration)

레거시 Spring에서는 ViewResolver 빈, DataSource 빈, SqlSessionFactory 빈, <context:component-scan> 태그 등 모든 것을 XML에 명시적으로 설정해야 했다.

스프링 부트는 '자동 설정' 기능을 통해 개발자의 클래스패스(classpath)를 스캔하여, 현재 프로젝트에 포함된 라이브러리들을 기반으로 "개발자가 이런 설정을 하겠구나"라고 예측하여 관련 빈(Bean)들을 자동으로 등록해준다.

  • spring-boot-starter-web이 있다면? → DispatcherServlet, InternalResourceViewResolver (또는 ContentNegotiatingViewResolver), JacksonHttpMessageConverter 등을 자동으로 빈으로 등록한다.
  • spring-boot-starter-data-jpah2database가 있다면? → 별도 설정 없이도 인메모리(In-memory) DB에 연결된 DataSourceEntityManagerFactory를 자동으로 빈으로 등록한다.

개발자는 이 자동 설정을 그대로 사용하거나, application.properties(또는 application.yaml) 파일을 통해 필요한 부분만 간단히 덮어쓸 수 있다.

Spring-Boot-Auto-Configuration-동작-개념도
Spring-Boot-Auto-Configuration-동작-개념도

3.3. 내장 WAS (Embedded WAS)

레거시 Spring 프로젝트는 개발자가 별도로 톰캣(Tomcat)과 같은 WAS(Web Application Server)를 설치하고, 프로젝트를 .war 파일로 빌드하여 해당 WAS에 배포(Deploy)해야 하는 번거로움이 있었다.

스프링 부트는 내장 WAS 개념을 도입했다. spring-boot-starter-web에는 톰캣 서버가 라이브러리 형태로 내장되어 있다. 따라서 스프링 부트 애플리케이션은 외장 WAS가 필요 없이, main 메소드를 실행하는 것만으로 내장 톰캣을 스스로 실행시키며 웹 서비스를 시작할 수 있다.

이로 인해 프로젝트를 .war 파일이 아닌, 모든 의존성과 서버를 포함하는 실행 가능한 .jar 파일로 패키징할 수 있게 되었으며, java -jar myapp.jar라는 간단한 명령어로 어디서든 애플리케이션을 배포하고 실행할 수 있게 되었다.

실행-가능한-JAR와-내장-톰캣-개념도
실행-가능한-JAR와-내장-톰캣-개념도

4. Legacy Spring vs Spring Boot

레거시 Spring MVC와 Spring Boot의 주요 차이점을 표로 정리하면 다음과 같다 .

항목Legacy Spring MVC (STS 3.9)Spring Boot (STS 4 / IntelliJ)
설정web.xml, root-context.xml, servlet-context.xmlXML 중심의 명시적 설정application.properties 또는 application.yml 중심의 약속 기반 자동 설정
의존성pom.xml에 필요한 라이브러리와 버전을 개별적으로 관리spring-boot-starter-* 의존성만 추가하면 관련 라이브러리 자동 관리
서버(WAS)외장 WAS (Tomcat 등) 별도 설치 및 설정 필요내장 WAS (Tomcat 등)가 기본. 별도 설치 불필요
배포.war 파일로 빌드하여 외장 WAS에 배포.jar 파일로 빌드하여 java -jar 명령어로 단독 실행 (기본)
시작점web.xmlContextLoaderListenerDispatcherServlet@SpringBootApplication 어노테이션이 붙은 클래스의 main 메소드
JSP기본 뷰(View) 기술로 사용기본 뷰로 권장되지 않음 (Thymeleaf 선호). 별도 설정 필요
Legacy-XML-설정과-Boot-properties-설정-비교
Legacy-XML-설정과-Boot-properties-설정-비교

5. Spring Initializr로 프로젝트 생성하기

Spring Boot 프로젝트는 Spring Initializr라는 웹 도구(또는 IntelliJ IDEA에 내장된 기능)를 통해 매우 쉽게 생성할 수 있다.

웹사이트(https://start.spring.io) 기준:

  1. Project: Maven Project 선택
  2. Language: Java
  3. Spring Boot: 최신 안정화 버전 (예: 3.2.x) 선택
  4. Project Metadata:

    • Group: com.example (보통 회사 도메인)
    • Artifact: my-boot-project (프로젝트 이름)
    • Package name: com.example.project (자동 완성)
  5. Packaging: war 선택. (JSP를 사용하기 위해 .jar 대신 .war를 선택한다. .war로 패키징해도 내장 톰캣으로 실행 가능하다.)
  6. Java: 17 또는 21 선택 (Spring Boot 3.x는 Java 17 이상 필요)
  7. Dependencies:

    • Spring Web: Spring MVC, REST, 내장 톰캣 포함
    • Spring Boot DevTools: 코드 변경 시 자동 재시작 등 개발 편의 기능
    • (JSP를 위한 의존성은 6.2에서 별도 추가)
Spring-Initializr-웹사이트-설정-화면
Spring-Initializr-웹사이트-설정-화면

설정 완료 후 'GENERATE' 버튼을 눌러 .zip 파일을 다운로드하고, 압축을 해제한 뒤 IntelliJ IDEA에서 pom.xml 파일을 열어 프로젝트를 로드한다.


6. 프로젝트 기본 구조 및 JSP 연동 실습

프로젝트를 열면 레거시 프로젝트보다 구조가 훨씬 단순함을 알 수 있다.

6.1. 기본 구조 분석

  • [ProjectName]Application.java: (예: MyBootProjectApplication.java)

    • main 메소드를 포함하는 애플리케이션의 시작점이다.
    • @SpringBootApplication 어노테이션 하나가 @Configuration, @EnableAutoConfiguration, @ComponentScan의 세 가지 핵심 기능을 모두 수행한다.
  • src/main/resources/application.properties:

    • 모든 설정을 담당하는 핵심 파일. XML 파일을 완전히 대체한다. 여기에 서버 포트, DB 접속 정보, 뷰 리졸버 설정 등을 작성한다.
  • src/main/resources/static:

    • CSS, JavaScript, 이미지 등 정적 리소스를 위치시키는 폴더이다.
  • src/main/webapp: (존재하지 않음)

    • .jar 패키징이 기본이라 webapp 폴더가 없지만, .war 패키징을 선택하고 JSP를 사용하려면 이 폴더를 직접 생성해야 한다.

6.2. Spring Boot에서 JSP View 설정하기

스프링 부트는 JSP를 기본 뷰 템플릿으로 권장하지 않으므로, JSP를 사용하려면 몇 가지 의존성을 추가하고 application.properties를 설정해야 한다.

1. pom.xml 의존성 추가

JSP 파일을 서블릿으로 변환하고 컴파일하는 jasper(JSP 엔진)와 JSTL 라이브러리가 필요하다.

xml
<dependencies>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-jasper</artifactId>
        <scope>provided</scope>
    </dependency>

        <dependency>
        <groupId>org.glassfish.web</groupId>
        <artifactId>jakarta.servlet.jsp.jstl</artifactId>
        <version>3.0.1</version>
    </dependency>
</dependencies>
Note
Jakarta EE vs. Java EE (javax): JDK 11 기반의 Spring Boot 2.x까지는 javax.servlet 네임스페이스와 jstl (1.2) 의존성을 사용했다. 하지만 Spring Boot 3.x부터는 Jakarta EE 9+를 기반으로 하므로, jakarta.servlet 네임스페이스와 위 코드의 jakarta.servlet.jsp.jstl-api 의존성을 사용해야 한다. 이는 교육 과정에서 다룬 javax와 현재 실습 환경의 차이를 보여주는 중요한 지점이다.

2. application.properties 설정 (ViewResolver 설정)

servlet-context.xmlInternalResourceViewResolver 빈 설정을 properties 파일에 다음과 같이 간단하게 작성한다.

ini
# src/main/resources/application.properties

# 뷰 리졸버(ViewResolver) 설정
# prefix: JSP 파일이 위치할 기본 경로
spring.mvc.view.prefix=/WEB-INF/views/
# suffix: 컨트롤러가 반환하는 뷰 이름 뒤에 붙일 확장자
spring.mvc.view.suffix=.jsp

3. JSP 폴더 및 파일 생성

설정에 맞춰 src/main/ 디렉터리 아래에 webapp/WEB-INF/views 폴더를 직접 생성한다.

Spring-Boot-JSP-프로젝트-폴더-구조
Spring-Boot-JSP-프로젝트-폴더-구조

src/main/webapp/WEB-INF/views/hello.jsp 파일을 생성한다.

jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
  <head>
    <title>Hello JSP in Spring Boot</title>
  </head>
  <body>
    <h2>${message}</h2>
  </body>
</html>

4. 컨트롤러 작성 및 테스트

com.example.project 패키지 아래에 controller 패키지를 만들고 HelloController.java를 작성한다.

java
package com.example.project.controller;

import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;

@Controller
public class HelloController {

    @GetMapping("/hello-jsp")
    public String helloJsp(Model model) {
        model.addAttribute("message", "Hello, Spring Boot with JSP!");
        return "hello"; // ViewResolver가 "/WEB-INF/views/hello.jsp"로 조합
    }
}

이제 [ProjectName]Application.javamain 메소드를 실행(Run As > Spring Boot App)한 뒤, 웹 브라우저에서 http://localhost:8080/hello-jsp로 접속하면 JSP 페이지가 정상적으로 렌더링되는 것을 확인할 수 있다. (포트 번호 8080은 기본값이며, application.properties에서 server.port=8081 등으로 변경할 수 있다.)

스프링-부트로-실행된-JSP-결과-화면
스프링-부트로-실행된-JSP-결과-화면

7. 결론 및 평가

이번 편에서는 스프링 부트가 스타터(Starter), 자동 설정(Auto-Configuration), 내장 WAS(Embedded WAS) 라는 세 가지 핵심 무기를 통해 어떻게 레거시 스프링의 복잡한 XML 설정 시대를 끝내고 개발 생산성을 극대화했는지 알아보았다.

스프링 부트는 현대 자바 애플리케이션 개발의 표준이 되었다. 복잡한 기반 설정을 프레임워크에 위임하고 개발자가 비즈니스 로직에만 집중할 수 있게 해준다는 점(IoC의 극대화)은 엄청난 혁신이다. 비록 JSP 연동을 위해 몇 가지 추가 설정이 필요했지만, 레거시 Spring MVC의 복잡한 XML 설정 과정에 비하면 매우 간결해졌음을 알 수 있다. javax에서 jakarta로의 네임스페이스 변화는 Spring Boot 3.x(Java 17+) 환경으로 넘어오면서 반드시 인지해야 할 중요한 변화이다.

다음 글에서는 XML 설정이 완전히 사라진 Spring Boot 환경에서 MVC 패턴을 어떻게 구성하는지(@ComponentScan, @MapperScan), WebConfig 클래스를 통해 정적 리소스를 관리하는 방법, 그리고 application.properties를 활용한 MyBatis 연동 간소화 방법 등 'Spring Boot 스타일'의 웹 개발에 대해 더 깊이 알아볼 것이다.

BlueNyang
작성자BlueNyang
라이선스
CC BY NC
BlueNyang

BlueNyang

BlueNyang의 개발 log

카테고리

  • Development
  • Framework
  • Language
  • Dev Tools
  • DevOps & Infra
  • Studies

페이지

© 2026 BlueNyang. All rights reserved.

Made with Nuxt.js and Directus