설정의 무게를 내려놓고 다시 만나는 Spring
Hello Servlet (v0) 부터 REST API 게시판 (v∞) 까지 — 우리는 끝까지 갔습니다.
그런데 새 프로젝트를 시작하려고 하면 — 그 모든 설정을 처음부터 다시 써야 합니다. web.xml, servlet-context.xml, root-context.xml, pom.xml, ViewResolver, 인코딩 필터…
코드 한 줄도 짜기 전에 30분이 사라집니다.
사실상 복사-붙여넣기의 연속. 그런데 한 줄만 어긋나도 톰캣이 안 뜹니다.
파일 7개가 서로를 참조 합니다. 한 줄만 어긋나도 톰캣이 안 뜨고, 어느 파일이 원인인지 학생은 알 길이 없습니다.
<servlet>
<servlet-name>appServlet</servlet-name>
<servlet-class>...DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>servlet-context.xml</param-value>
</init-param>
</servlet>
<servlet-mapping>
<url-pattern>/</url-pattern>
</servlet-mapping>
web.xml 의 일부. 합치면 100줄을 넘습니다.
Legacy 시절의 pom.xml — 의존성마다 버전 번호를 일일이 손으로 적었습니다.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>5.2.8</version> <!-- ← 한 줄 어긋남 -->
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>2.0.6</version>
</dependency>
spring-jdbc 의 5.2.8 — 한 줄 어긋났을 뿐인데 톰캣이 안 뜹니다. 콘솔의 빨간 스택트레이스 앞에서 학생은 어디부터 봐야 할지 모릅니다.
검색해보면 「Spring 5.3 에는 mybatis-spring 2.1 이상이 필요합니다」 같은 답을 한참 뒤에야 발견. 코드 한 줄 짜기 전에 또 30분.
Spring 팀이 같은 고민을 했습니다. 99% 같은 설정이라면 — 기본값을 프레임워크가 미리 들고 있으면 되지 않을까?
사용자는 다른 1% 만 적으면 됩니다. 이게 SpringBoot 의 핵심 철학입니다.
이미 조립된 베이스 키트 위에서 출발하는 셈. Spring 자체가 사라진 게 아니라, 설정만 미리 깔아둔 Spring 입니다.
이 어노테이션 하나가 "클래스패스에 뭐가 있는지 보고, 알아서 필요한 빈을 등록" 합니다.
Legacy 에서 우리가 손으로 적던 XML — 그걸 SpringBoot 가 대신 적어줍니다.
웹 애플리케이션에 필요한 의존성을 이미 검증된 버전으로 묶어둔 세트.
버전 번호를 우리가 안 적습니다. SpringBoot 버전 하나 가 모든 하위 의존성의 호환 버전을 결정합니다.
Legacy 에서는 톰캣을 따로 설치 → war 를 톰캣에 배포 했습니다. SpringBoot 는 톰캣을 jar 안에 품고 있어서 — java -jar app.jar 한 줄로 실행됩니다.
IDE 에서도 마찬가지. 「Run on Server」 가 아니라 그냥 main() 실행.
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);
}
}
이 10줄짜리 파일 이 — Legacy 의 web.xml + servlet-context.xml + root-context.xml + 톰캣 설정을 전부 대체합니다.
@Controller
public class HelloController {
@GetMapping("/hello")
public String hello(Model model) {
model.addAttribute("msg", "안녕, SpringBoot!");
return "hello";
}
}
Controller 코드는 Legacy 와 100% 같습니다. @Controller, @GetMapping, Model — 우리가 v0 ~ v∞ 동안 익힌 모든 것이 그대로 살아있습니다.
바뀐 건 설정의 무게, 코어 사용법은 그대로.
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.20</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- ... 12개 더 ... -->
버전을 손으로 적고 충돌은 직접 해결. 의존성 12개 → 1개로 — 다음 슬라이드에서 Boot 가 같은 자리를 어떻게 적는지 봅니다.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
버전 번호가 사라졌습니다. SpringBoot 버전 하나 가 spring-webmvc · jstl · jackson · 톰캣까지 호환 버전을 전부 보증합니다.
의존성 12개 → 1개로 압축. 같은 화면이 같은 코드로 뜨는데, pom.xml 만 가벼워졌습니다.
server.port=8080
spring.datasource.url=jdbc:mysql://localhost:3306/myapp
spring.datasource.username=root
spring.datasource.password=secret
spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
mybatis.mapper-locations=classpath:mappers/*.xml
키 = 값 형식의 평범한 텍스트. XML 의 중첩 태그가 사라지고, Legacy 의 root-context.xml + ViewResolver + SqlSessionFactory 가 이 한 파일로 압축됩니다.
| 항목 | ⚠️ Spring Legacy | ✓ SpringBoot |
|---|---|---|
| web.xml | ~ 100 줄 직접 작성 | 0 줄 (자동) |
| Spring 설정 | servlet-context.xml + root-context.xml ~ 100 줄 | application.properties 1 파일 |
| pom.xml | ~ 50 줄 (버전 직접 지정) | ~ 5 줄 (버전 자동) |
| WAS | 톰캣 별도 설치 + war 배포 | 임베디드 톰캣 (jar 안) |
| 실행 | Eclipse Server 등록 → Add → Start | java -jar app.jar |
| 버전 충돌 | 직접 해결 (검색·시행착오) | SpringBoot 버전이 보증 |
| 코드 (Controller) | ↔ 동일 — @Controller, @GetMapping, Model 그대로 | |
학생이 첫날 만나는 "환경 세팅의 벽" 자체가 사라집니다.
SpringBoot 는 설정의 무게 만 줄여줍니다. 다음 것들은 여전히 우리 책임입니다:
이전 과정에서 익힌 「데이터 흐름」 사고는 100% 그대로 살아있습니다. 오히려 더 잘 보입니다.
다음 차시: SpringBoot 프로젝트 첫 실행 — Spring Initializr 로 5분 안에 Hello.