MVC

-
Model-View-Controller의 약자로, 소프트웨어 디자인 패턴 중 하나
-
Model
- 데이터와 비즈니스 로직을 담당.
- DB와 연동하여 데이터를 저장하고 불러오는 작업을 함.
-
View
-
Controller
- 모델과 뷰사이의 상호작용을 조정하고 제어
- 유저의 입력을 받아 모델에 전달, 결과를 바탕으로 View 업데이트
-
코드 재사용성을 높이고, 협업을 용이하게 한다.
Spring MVC
- 'Spring 에서 MVC 패턴을 적용하여 HTTP 요청을 효율적으로 처리한다.'
- Servlet (서블릿)은 자바를 사용하여 웹 페이지를 동적으로 생성하는 서버 측 프로그램 혹은 그 사양


DispatcherServlet (Front Controller)

- Client 의 HTTP 요청이 들어오면 DispatcherServlet 객체가 헤더부분의 요청을 분석.
- DispatcherServlet 객체는 데이터를 토대로 Mapping 된 Controller 를 찾아 요청전달

- 직접 Servlet 객체를 구현하지 않아도 요청처리 메소드를 수행한다.
- Controller → DispathcerServlet
- 요청 처리에대한 결과(데이터'Model', 'View' 정보)를 전달
- DispatcherServlet → Client
- ViewResolver 통해 View에 Model을 적용하여 View를 Client에게 응답으로 전달
Controller
@Controller
@RequestMapping("/api")
public class HllowController {
@GetMapping("/hello")
@ResponseBody
public String hello() {
return "Hello World!!";
}
@GetMapping("/get")
@ResponseBody
public String get() {
return "get 메소드 요청!";
}
- 중복되는 URL 경로를 Class 하위메소드들에게 묶어주어서 중복되는 경로를 처리한다.
Servlet VS Controller
- Servlet :
- Spring이 개발되기전 Java WAS를 통한 동적 웹을 만들기위해 개발된 도구.
- 개발자가 직접 관리하거나 사용하기가 어려워 사용 난이도가 높음
(URL 마다 서블릿을 생성해서 사용했다.)
- Controller :
- Spring이 개발되고 MVC 패턴과 좀 더 높은 추상화를 위해 생겨난 도구
- 그중에 사용자의 요청을 받고 서블릿 앞단에서 서블릿을 좀더 편하게 사용 가능하며 그냥 응답을 보내는것이 아닌 뷰를 이용하여 응답을 진행.
- 유사한 성격의 API를 하나의 컨트롤러만으로 URL을 관리가능하다.
Controller vs Service
- Controller 자체에 비즈니스로직을 둘수는 있지만 이는 객체지향관점에서 컨트롤러가 너무많은 책임을 가짐.
- Controller 는 비즈니스로직이 알맞는 서비스를 호출만 하는 역할을 담당.

참조 : https://velog.io/@dbsrud9126/Spring-MVC
정적페이지 vs 동적페이지

정적페이지
- html파일 요청시 해당 html 파일을
static 폴더에서 찾아서 반환
- Controller 를 통해 반환이 가능은 하지만 굳이..?
- 의존성 주석화
implementation 'org.springframework.boot:spring-boot-starter-thymeleaf’
해당 dependency를 주석 처리.
thymeleaf 는 동적 페이지를 위한 템플릿 엔진임.
- 해당 코드를 없앨시 static 폴더에서 html을 찾아 반환한다.
@GetMapping("/static-hello")
public String hello() {
return "hello.html";
}
- Redirect
- 템플릿 엔진을 사용하면서 Controller 통해 처리하고싶을시 사용.
- Redirect 요청을 문자열로 반환하면 요청이 재수행되며 static 폴더 파일을 반환한다.

@GetMapping("/html/redirect")
public String htmlStatic() {
return "redirect:/hello.html";
}
- Template engine 에 View 전달
- Template 폴더에 정적 html 파일을 추가하고 해당 html의
파일 명 인 hello 문자열을 반환하여 처리 (형식자는 생략가능!)
@GetMapping("/html/templates")
public String htmlTemplates() {
return "hello";
}
동적 페이지
- Client 의 요청을 Controller에서 Model 로 처리
- Template engine(Thymeleaf) 에게 View, Model 전달
- View: 동적 HTML 파일
- Model: View 에 적용할 정보들
- View에 Model을 적용 → 동적 웹페이지 생성
- Client(브라우저)에게 View(동적 웹 페이지, 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>