본문 바로가기

Spring Boot

MVC : Spring Boot 시작하기

Spring Boot의 시작

 

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

Spring Boot로 제너레이터를 설정하고, 언어를 Groovy로 바꿔준다

 

Spring Boot의 버전을 어떤것으로 할지 잘 확인할 뒤에 Lombok, Spring Web 의존성을 주입해준다!

 

 

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