MVC란?
MVC란 Model, View, Controller의 약자이다.
Application이 서비스하는 디자인 패턴 중 하나이다.
Spring Boot 또한 MVC 디자인 패턴을 사용한다.
Model
- DB와 Controller 사이에서 데이터를 전달하는 역할을 한다.
- Application이 포함해야 될 데이터가 무엇인지 정의한다.
- View 또는 Controller에 대한 정보를 알면 안된다.
why ?
Model이 독립적이고 재사용 가능한 데이터를 담는 역할을 하기 때문에 뷰와 컨트롤러의 구체적인 구현에 의존하지 않도록 하기 위해서이다.
Model의 예시 코드
package com.example.demo.model;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
@Entity //JPA 엔티티를 정의
public class User {
@Id // Primary Key를 지정
@GeneratedValue(strategy = GenerationType.IDENTITY) //자동으로 증가하는 값 생성
private Long id;
private String name; // 사용자의 이름
private String email; // 사용자의 이메일
// Getter 및 Setter 메소드
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
}
View
- 사용자에게 보여지는 최종 화면을 구성하고, HTML, CSS, JavaScript 등을 사용하여 페이지의 레이아웃과 디자인을 처리한다.
- View는 Model에서 전달된 데이터를 사용하여 사용자에게 표시할 정보를 형식화하고 렌더링하는 역할을 한다.
- Controller로부터 전달된 Model 데이터를 받아와서 이를 화면에 표시한다.
- 데이터와 화면 표시만 담당하며 Model이나 Controller의 구체적인 로직에 대해 알 필요는 없다.
- 대표적으로 JSP, Thymeleaf, Groovy 등의 Template 엔진이 있다. HTML을 동적으로 생성하는 템플릿 엔진임.
View의 예시 코드(Thymeleaf 사용)
<!-- src/main/resources/templates/user.html -->
<!DOCTYPE html>
<html xmlns:th="http://www.thymeleaf.org">
<head>
<title>User Details</title> <!-- 페이지 제목 -->
</head>
<body>
<h1>User Details</h1> <!-- 제목 -->
<!-- 사용자의 이름을 표시 -->
<p>Name: <span th:text="${user.name}"></span></p>
<!-- 사용자의 이메일을 표시 -->
<p>Email: <span th:text="${user.email}"></span></p>
</body>
</html>
Controller
- 사용자의 요청을 처리하고 비즈니스 로직을 실행하여 Model에 데이터를 추가한 후, 어떤 View를 사용할지 결정하여 View와 Model을 연결한다.
- Controller는 Model에 담길 데이터와 어떤 View를 사용할지에 대한 정보를 알고 있어야 사용자 요청에 맞는 적절한 응답을 생성할 수 있다.
- 사용자가 입력한 데이터를 처리하고 그에 따른 Model의 상태를 업데이트하며 적절한 View를 반환한다.
Controller 예시 코드
package com.example.demo.controller;
import com.example.demo.model.User;
import com.example.demo.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller // 이 클래스가 컨트롤러 역할을 함을 나타냄
@RequestMapping("/users") // 기본 URL 경로
public class UserController {
@Autowired
private UserRepository userRepository; // UserRepository를 자동을 주입
@GetMapping("/{id}") // GET 요청을 처리하고 URL 경로에서 {id}를 변수로 사용
public String getUser(@PathVariable Long id, Model model) {
//주어진 ID로 사용자를 조회하고, 없으면 예외를 던짐
User user = userRepository.findById(id).orElseThrow(() -> new IllegalArgumentException("Invalid user Id:" + id));
model.addAttribute("user", user); //모델에 사용자 정보 추가
return "user"; // Thymeleaf 템플릿 파일 이름 (user.html) 반환
}
}
Spring MVC 요청 처리 과정
1. 사용자 요청:
- 사용자가 웹 애플리케이션에 HTTP 요청을 보낸다.
- 예를 들어, 웹 브라우저에서 특정 URL을 입력하거나 버튼을 클릭하여 요청을 보낸다.
2. DispatcherServlet 수신:
- Spring의 DispatcherServlet이 이 HTTP 요청을 수신한다.
- DispatcherServlet은 Spring MVC의 프론트 컨트롤러로서 요청을 처리할 적절한 컨트롤러로 전달하는 역할을 한다.
3. Controller 호출:
- DispatcherServlet은 요청을 적절한 Controller로 전달한다. Controller는 비즈니스 로직을 처리하며 요청에 대한 데이터를 준비한다.
4. 비즈니스 로직 처리:
- Controller는 필요한 비즈니스 로직을 실행하고, 데이터베이스와 상호작용하여 필요한 데이터를 조회한다.
- 이 데이터는 Model 객체에 담긴다.
- Model은 데이터와 정보를 담는 컨테이너 역할을 한다.
5. View 이름 결정:
- Controller는 처리 결과를 기반으로 결정한다.
- 이 View의 이름이 View Name으로 설정된다.
- View Name은 실제로 화면을 구성할 템플릿의 이름.
6. ModelAndView 생성:
- Model과 View Name을 하나의 객체로 묶어 ModelAndView 객체를 생성한다.
- ModelAndView는 데이터와 뷰의 정보를 포함한다.
7. View Resolver:
- DispatcherServlet은 ModelAndView 객체를 View Resolver에 전달한다.
- View Resolver는 View Name을 기반으로 실제 View 객체를 찾고, Model 데이터를 이 View에 적용한다.
8. View 렌더링:
- View가 Model 데이터를 사용하여 최종적으로 사용자에게 보여질 HTML을 생성한다.
- 이 과정에서 데이터가 화면에 표시될 형태로 변환된다.
9. 최종 응답 반환:
- 최종적으로 생성된 HTML View는 DispatcherServlet을 통해 클라이언트(사용자)에게 반환된다.
- 사용자는 웹 브라우저를 통해 이 HTML 페이지를 확인하게 된다.
최종 요약
사용자 요청
v
DispatcherServlet이 요청을 받아 Controller에 전달
v
Controller가 비즈니스 로직을 처리하고 Model에 데이터 추가
v
Controller가 사용할 View의 이름 결정(어떤 View를 사용할지)
v
Model과 View Name을 묶어서 ModelAndView 생성
v
View Name을 통해 실제 View를 찾고 Model 데이터 적용
v
View가 HTML 생성
v
응답 반환
사용자 요청 > DispatcherServlet > Controller > View 이름 결정 > ModelAndView > View Resolver > View 렌더링 > 응답
'Backend > Spring Boot' 카테고리의 다른 글
[Spring] 스프링 빈(Bean)이란? (0) | 2024.09.10 |
---|---|
lombok이란? (1) | 2024.09.03 |
spring-boot-devtools 라이브러리를 통한 핫 리로드 활성화 (35) | 2024.07.24 |
Maven과 Gradle (18) | 2024.06.19 |
스프링부트와 aws 활용한 게시판 구축과 배포 -2 (28) | 2024.05.29 |