
MVC(Model-View-Controller)는 소프트웨어 디자인 패턴 중 하나로,\
애플리케이션을 Model, View, Controller로 분리하여 역할을 나누는
구조입니다.
Spring Web MVC는 Servlet API 기반 웹 프레임워크입니다.\
중앙에서 모든 요청을 처리하는 DispatcherServlet을 사용합니다.
→ Front Controller 패턴 적용
공식 문서 요약:\
DispatcherServlet이 중앙에서 HTTP 요청을 처리하며, Front Controller
패턴으로 설계됨.
Servlet(서블릿) 은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양을 말합니다.

❗ 문제점: API마다 Servlet 클래스를 생성해야 함 → 비효율

GET /api/hello → HelloController.hello()\
GET /user/login → UserController.login()\
POST /user/signup → UserController.registerUser()
@WebServlet(urlPatterns = "/user/login")
public class UserLoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) {
// ...
}
}
API마다 클래스 필요 → 관리 어려움
@Controller
@RequestMapping("/user")
public class UserController {
@GetMapping("/login")
public String login() { }
@GetMapping("/logout")
public String logout() { }
@GetMapping("/signup")
public String signup() { }
@PostMapping("/signup")
public String registerUser(SignupRequestDto requestDto) { }
}
✔ 하나의 Controller에서 관련 API 관리 가능\
✔ 메서드 이름 자유롭게 설정 가능
@GetMapping("/api/get")
@ResponseBody
public String get() {
return "GET Method 요청";
}
@PostMapping("/api/post")
@ResponseBody
public String post() {
return "POST Method 요청";
}
@PutMapping("/api/put")
@ResponseBody
public String put() {
return "PUT Method 요청";
}
@DeleteMapping("/api/delete")
@ResponseBody
public String delete() {
return "DELETE Method 요청";
}
공통 URL 경로를 묶어 중복 제거
@Controller
@RequestMapping("/api")
public class HelloController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello World!";
}
}
📁 위치\
resources/static/hello.html
🌐 접속\
http://localhost:8080/hello.html
Spring Boot는 static 폴더의 파일을 자동 반환합니다.
@GetMapping("/static-hello")
public String hello() {
return "hello.html";
}
⚠ thymeleaf dependency가 있으면 templates 경로를 먼저 찾음
@GetMapping("/html/redirect")
public String htmlStatic() {
return "redirect:/hello.html";
}
redirect: 접두어 → 클라이언트 재요청 발생
기본 설정
prefix: classpath:/templates/\
suffix: .html
@GetMapping("/html/templates")
public String htmlTemplates() {
return "hello";
}
→ resources/templates/hello.html 반환
private static long visitCount = 0;
@GetMapping("/html/dynamic")
public String htmlDynamic(Model model) {
visitCount++;
model.addAttribute("visits", visitCount);
return "hello-visit";
}
<div>
(방문자 수: <span th:text="${visits}"></span>)
</div>
구분 Static Dynamic
위치 static templates
Controller 필요 ❌ ✅
데이터 바인딩 불가 가능