본 게시물은 김영한님의 “스프링 입문 - 코드로 배우는 스프링 부트, 웹 MVC, DB 접근 기술” 강의를 바탕으로 작성했습니다.
스프링 웹 개발 기초
정적 컨텐츠
정적 컨텐츠는 src/main/resources/static 폴더에 html 코드를 작성하면 페이지에서 보여줍니다.
정적 컨텐츠 실행
위 폴더에 hello-static.html 파일을 생성하고 아래와 같이 작성합니다.
<!DOCTYPE HTML>
<html>
<head>
<title>static content</title>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
</head>
<body>
정적 컨텐츠 입니다.
</body>
</html>
- 스프링 부트를 재실행하고 http://localhost:8080/hello-static.html 접속하면 아래 사진과 같이 뜨는 것을 확인할 수 있습니다.
- static 폴더에는 정적인 컨텐츠만 가능하고 코드를 통한 변화는 반영할 수 없습니다.

정적 컨텐츠 원리

- 웹 브라우저에서 접속하면 내장 톰캣 서버가 요청을 받습니다.
- 스프링 부트가 hello-static 관련 컨트롤러가 있는지 확인합니다.
- 해당 컨트롤러가 없음이 확인되면 hello-static이라는 이름의 html 파일을 찾습니다.
- html 파일이 있으면 이 파일을 웹 브라우저에서 보여줍니다.
스프링 부트 정적 컨텐츠 기능: https://docs.spring.io/spring-boot/docs/2.3.1.RELEASE/reference/html/spring-boot- features.html#boot-features-spring-mvc-static-content
MVC와 템플릿 엔진
템플릿 엔진은 html을 서버에서 동적으로 프로그래밍해서 웹 브라우저로 내보내줍니다. 템플릿 엔진을 사용하기 위한 Model, View, Controller를 줄여 MVC라고 합니다.
MVC와 템플릿 엔진 기초
Controller부터 작성하겠습니다. 이전에 만들었던 HelloController에 코드를 추가합니다.
@Controller
public class HelloController {
@GetMapping("hello-mvc")
public String helloMvc(@RequestParam("name") String name, Model model) {
model.addAttribute("name", name);
return "hello-template";
}
}
- @RequestParam 애노테이션으로 “name” 이라는 값을 name 변수로 받습니다.
- model에 key는 “name” , value는 name 으로 넘겨줍니다.
View를 만들어보겠습니다. src/main/resources/templates/hello-template.html 을 만들고 아래 코드를 작성합니다.
hello! empty
- Controller에서 “hello-template” 으로 넘겨준 model을 통해 name에 값이 들어가게 됩니다.
스프링 부트를 재실행하고 웹 브라우저에서 http://localhost:8080/hello-mvc에 접속하여 결과를 확인해봅니다.

- 에러가 발생하는 이유는 위에서 작성한 @RequestParam 애노테이션의 required 속성 기본값이 true 이기 때문입니다. 한 마디로 name 파라미터를 받기로 해놓고 안 받았기 때문입니다.
- 다시 한 번 웹 브라우저에서 http://localhost:8080/hello-mvc?name=spring!!!! 으로 접속합니다.

- 파라미터는 ?key=value 형태로 작성합니다. Controller로 들어온 파라미터가 Model을 통해 View로 전달되어 ${name}에 대치됩니다.
MVC, 템플릿 엔진 원리

- 웹 브라우저에서 접속하면 내장 톰캣 서버가 요청을 받습니다.
- 스프링 부트가 hello-mvc가 mapping되어 있는 컨트롤러가 있는지 확인합니다.
- 컨트롤러에서 받은 파라미터를 모델을 통해 "hello-template"로 보냅니다.
- viewResolver가 hello-template과 동일한 이름의 html을 thymeleaf라는 템플릿 엔진을 통해 처리하여 HTML로 변환 후 웹 브라우저에 보여줍니다.
API
JSON 데이터 구조 포맷으로 클라이언트로 데이터를 전달하는 방식을 API라고 합니다. 또한 서버끼리 데이터를 주고 받을 때도 API를 사용합니다.
@ResponseBody 문자 반환
HelloController.java에 아래와 같이 hello-string을 mapping하는 새로운 함수를 만들고 스프링 부트를 재시작합니다.
@Controller
public class HelloController {
@GetMapping("hello-string")
@ResponseBody
public String helloString(@RequestParam("name") String name) {
return "hello " + name;
}
}
- Model을 사용하지 않고 문자열 자체를 return합니다.
- @ResponseBody 애노테이션은 viewResolver를 사용하지 않고 HTTP의 BODY에 문자 내용을 직접 반환합니다.
- 웹 브라우저에서 http://localhost:8080/hello-string?name=spring!!!!에 접속하면 아래와 같은 화면이 뜹니다.

- F12를 눌러 보면 아래와 같이 그냥 문자열이 반환된 것을 볼 수 있습니다.

@ResponseBody 객체 반환
HelloController.java에 아래와 같이 hello-api를 mapping하는 새로운 함수를 만들고 스프링 부트를 재시작합니다.
@Controller
public class HelloController {
@GetMapping("hello-api")
@ResponseBody
public Hello helloApi(@RequestParam("name") String name) {
Hello hello = new Hello();
hello.setName(name);
return hello;
}
static class Hello {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
}
- @ResponseBody 애노테이션을 사용하고 객체를 반환하면 JSON 형식으로 변환됩니다.
- 객체를 만들 때는 Getter와 Setter가 있는데 객체 내에서 [⌘N → Getter and Setter]를 선택하고 확인을 누르면 Spring 표준 Getter와 Setter를 작성해줍니다.
- http://localhost:8080/hello-api?name=spring!!!!에 접속하면 아래와 같이 객체가 JSON 형식으로 변환되어 반환된 것을 볼 수 있습니다.

@ResponseBody 원리

- 웹 브라우저에서 접속하면 내장 톰캣 서버가 요청을 받습니다.
- 스프링 부트가 hello-api가 mapping되어 있는 컨트롤러가 있는지 확인합니다.
- @ResponseBody 애노테이션으로 아래 작업을 수행합니다.
- HTTP의 BODY에 문자 내용을 직접 반환합니다.
- viewResolver 대신에 HttpMessageConverter 가 동작합니다.
- 기본 문자(String) 처리는 StringHttpMessageConverter 가 동작합니다.
- 기본 객체(Object) 처리는 MappingJackson2HttpMessageConverter 가 동작합니다.
- byte 처리 등 기타 여러 HttpMessageConverter 가 기본으로 등록되어 있습니다.
- 클라이언트의 HTTP Accept 헤더와 서버의 컨트롤러 반환 타입 정보 둘을 조합해서 HttpMessageConverter 가 선택됩니다.
'Development > Spring' 카테고리의 다른 글
| [Spring] 스프링 입문 - 강의 정리 6 (0) | 2026.02.08 |
|---|---|
| [Spring] 스프링 입문 - 강의 정리 5 (0) | 2026.02.08 |
| [Spring] 스프링 입문 - 강의 정리 4 (0) | 2026.02.08 |
| [Spring] 스프링 입문 - 강의 정리 3 (0) | 2026.02.08 |
| [Spring] 스프링 입문 - 강의 정리 1 (0) | 2026.02.08 |