Spring Boot의 시작
* IntelliJ에서 새 프로젝트를 생성할때 의존성을 주입해줄 수 있다


1. spring-boot-starter-web
Spring Boot에서 spring-boot-starter-web은 웹 애플리케이션 개발에 필요한 핵심 의존성들을 묶어놓은 스타터라고 함.
이 spring-boot-starter-web 의존성 모듈을 build.gradle에 추가해주면?
- Spring MVC 웹 프레임워크
- 내장 Tomcat 서버
- Jackson을 이용한 JSON 처리
- 정적 리소스 제공
- 예외 처리 자동화
를 모두 사용할 수 있다고 함!
// Spring Boot 프로젝트 생성시 만들어지는 build.gradle에다가 implement 해준다
implementation 'org.springframework.boot:spring-boot-starter-web'
주요 의존성들
| spring-web | Spring MVC 프레임워크의 핵심 기능 |
| spring-webmvc | DispatcherServlet, Controller, View 등 구성요소를 제공함 |
| jackson-databind | JSON 직렬화/역직렬화 지원 |
| validation-api, hibernate-validator | Bean Validation 지원 (???) |
| spring-boot-starter-tomcat | 내장 Tomcat 서버로 애플리케이션을 실행함 |
자동 설정되는 컴포넌트들
Spring Boot의 애너테이션인 @AutoConfiguration을 클래스 위에 사용하면?
- DispatcherServlet 등록 및 URL 맵핑 : Bean으로 사용할 수 있다
- @RestController, @RequestMapping 자동 인식 : Controller에서 써먹을 수 있다!
- MessageConverter 설정(JSON 변환기 등) : Java를 Json으로 변환해주는 그걸 말하는것 같다
- 예외 처리용 BasicErrorController 등록 : ??
- 정적 리소스 핸들링(CSS, JS, 이미지 등) : AutoConfiguration을 쓰면 정적 리소스에 활용할 수 있나보다.
@RestController
public class HelloController {
@GetMapping("/hello")
public String hello() {
return "Hello, Spring Boot Web!";
}
}
// 위의 @RestController, @GetMapping을 하나로 쓸 수 있다는것 아님?
@AutoConfiguration
public class HelloController { // 클래스나
public String hello() { // 메서드의 이름을 맵핑으로 따라가는 것 같고
return "Hello, Spring Boot Web!";
}
}
* spring-boot-starter-web은 spring-boot-starter에 포함되지 않으므로, 웹 애플리케이션이라면 명시적으로 추가해줘야한다.
저 둘은 다르다는 뜻같음.
* spring-boot-starter-web에는 Tomcat이 기본적으로 포함되므로, 다른 WAS를 쓰려면 exclusion 처리가 필요하다고 한다...
정리
spring-webmvc : DispatcherServlet과 MVC 핵심 구조를 제공한다
Jackson : JSON 변환을 지원해준다
Tomcat : 기본 내장 서버이다. (포트 8080)
AutoConfiguration : 별도 설정 없이 웹 애플리케이션을 구동할 수 있다.
2. 정적 리소스 설정
Spring Boot는 기본적으로 정적 리소스(HTML, CSS, JS, 이미지 등등..)를 아래의 위치에 두면 자동으로 제공해준다고 한다?
기본 정적 리소스 위치
/src/main/resources/static/
/src/main/resources/public/
/src/main/resources/resources/
/src/main/resources/META-INF/resources/
위의 폴더 중 하나에 index.html, style.css, script.js 등을 두면?
자동으로 / 또는 /style.css 같은 결로로 접근할 수 있다고 한다.
가령 /src/main/resources/static/ 폴더에 index.html, .css/style.css, js/app.js를 둔다고 한다면
index.html - > http://localhost:8080/
css/style.css - > http://localhost:8080/css/style.css
js/app.js - > http://localhost:8080/js/app.js
이런 경로로 접근할 수 있다고 한다
커스텀 정적 리소스 위치 설정
기본 위치가 아닌 경로를 사용하고 싶다면, application.yml 또는 application.properties 파일에서 설정할 수 있다.
spring:
web:
resources:
static-locations: classpath:/custom-static/
// 여러개의 정적 리소스 경로도 지정 가능하다.
spring:
web:
resources:
- classpath:/static/
- classpath:/assets/
// 등등..
위와 같이 설정해두고
src/main/resources/custom-static/logo.png
// http://localhost:8080/logo.png
위와 같이 접근할 수 있다고 한다.
* 이미지, JS, CSS같은 리소스는 static이나 public에 두는게 가장 일반적이라고 한다.
React, Vue 등 정적 빌드 결과물들을 /static에 넣어서 Spring Boot로 서빙할 수 있다.
정리
HTML, CSS, JS : /static, /public (두개가 가장 일반적), /resources
이미지 등 기타 정적 파일 : 위 3개의 디렉토리 내 어떤 파일로도 서빙할 수 있다
커스텀 위치 설정 : spring.web.resources.static-locations 사용하기
3. 간단한 예제
- 프로젝트 생성
https://start.spring.io/ 에서 spring-boot-starter-web을 선택하고 생성해도 되고, intelliJ를 통해서 생성해도 된다.
IDE에서 pom.xml(Maven)이나 build.gradle(Gradle)에 spring-boot-starter-web 의존성이 포함되었는지 확인한다.
* spring-boot-starter는 다른것이다.
- Application 클래스 작성
pacage 생략!
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication // 메인 클래스에 붙어야함
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
일종의 공식처럼 알아두면 될 것 같다.
* @SpringBootApplication이 붙은 메인 클래스를 실행하면,
내장 서버(Tomcat)가 포트를 열고(보통 포트8080) Spring MVC가 동작한다고 한다.
- Controller 작성
package 생략!.controller;
import ....Controller;
import ....GetMapping;
import ....ResponserBody;
@Controller // 컨트롤러에 적는 애너테이션
public class UserController {
@GetMapping("/hello") // html 이름이랑 맵핑해주는것 같다
@ResponseBody // ?
public String hello() {
return "Hello, World!";
}
}
* /hello 경로로 GET 요청이 들어온다면 "Hello, World!"를 응답으로 내려준다. 아~~~~~~~~~~~~~~~~~~~~~~
http://localhost:8080/hello 경로로 GET 요청이 들어오면 GET은 POST가 아니니까 조회해주는것이다.
조회를 해준다는 소리는 '보여준다' 는 의미이기 때문에 어쨌든 Controller는 '보여줘야한다'
따라서 보여주는 수단이 return인 것이고
정리하면 return 반환값에다가 GET 요청에 대한 값을 집어넣는다고 생각하면 되겠다.
POST, PATCH, PUT, DELETE도 비슷하게 생각하면 될 것 같다. return 반환값으로 응답하는 것이구나?
* @ResponseBody를 붙였으므로, 뷰 템플릿이 아닌 HTTP 바디(<Body> 를 말하는것 같다)로 직접 문자열을 반환한다.
- 정적 리소스 사용
src/main/resources/static 폴더를 만든 후에, index.html을 생성하고
<html>
<head>
<title>Welcome</title>
</head>
<body>
<h1>Hello, World!</h1>
</body>
</html>
* 브라우저에서 http://localhost:8080/index.html 로 접근하면 해당 페이지가 그대로 뜬다는데..?
* 별도의 컨트롤러 코드가 없어도 정적 파일로 바로 제공된다고 한다.
'Spring Boot' 카테고리의 다른 글
| REST : 제약조건 (0) | 2025.07.10 |
|---|---|
| REST : 탄생배경과 개념 (7) | 2025.07.10 |
| Spring MVC : 요청 처리 흐름 (8) | 2025.07.06 |
| Spring MVC의 컴포넌트 (0) | 2025.07.02 |
| Spring MVC (2) | 2025.07.02 |