Home > CS > 2024 > πŸ’Ύ [CS] MVC νŒ¨ν„΄.

πŸ’Ύ [CS] MVC νŒ¨ν„΄.
CS

πŸ’Ύ [CS] MVC νŒ¨ν„΄.

1️⃣ MVC νŒ¨ν„΄.

  • MVC νŒ¨ν„΄μ€ λͺ¨λΈ(Model), λ·°(View), 컨트둀러(Controller)둜 이루어진 λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€.

  • μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ ꡬ성 μš”μ†Œλ₯Ό μ„Έ 가지 μ—­ν• λ‘œ κ΅¬λΆ„ν•˜μ—¬ 개발 ν”„λ‘œμ„ΈμŠ€μ—μ„œ 각각의 ꡬ성 μš”μ†Œμ—λ§Œ μ§‘μ€‘ν•΄μ„œ κ°œλ°œν•  수 μžˆμŠ΅λ‹ˆλ‹€.
  • μž¬μ‚¬μš©μ„±κ³Ό ν™•μž₯성이 μš©μ΄ν•˜λ‹€λŠ” μž₯점이 있고, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ΄ λ³΅μž‘ν•΄μ§ˆμˆ˜λ‘ λͺ¨λΈκ³Ό 뷰의 관계가 λ³΅μž‘ν•΄μ§€λŠ” 단점이 μžˆμŠ΅λ‹ˆλ‹€.

Model(λͺ¨λΈ)

  • λͺ¨λΈ(model)은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 데이터인 λ°μ΄ν„°λ² μ΄μŠ€, μƒμˆ˜, λ³€μˆ˜ 등을 λœ»ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ μ‚¬κ°ν˜• λͺ¨μ–‘μ˜ λ°•μŠ€ μ•ˆμ— κΈ€μžκ°€ λ“€μ–΄ μžˆλ‹€λ©΄ κ·Έ μ‚¬κ°ν˜• λͺ¨μ–‘μ˜ λ°•μŠ€ μœ„μΉ˜ 정보, κΈ€μž λ‚΄μš©, κΈ€μž μœ„μΉ˜, κΈ€μž 포맷(utf-8 λ“±)에 κ΄€ν•œ 정보λ₯Ό λͺ¨λ‘ 가지고 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • λ·°μ—μ„œ 데이터λ₯Ό μƒμ„±ν•˜κ±°λ‚˜ μˆ˜μ •ν•˜λ©΄ 컨트둀러λ₯Ό 톡해 λͺ¨λΈμ„ μƒμ„±ν•˜κ±°λ‚˜ κ°±μ‹ ν•©λ‹ˆλ‹€.

View(λ·°)

  • λ·°(View)λŠ” Inputbox, checkbox, textarea λ“± μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€ μš”μ†Œλ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • 즉, λͺ¨λΈμ„ 기반으둜 μ‚¬μš©μžκ°€ λ³Ό 수 μžˆλŠ” 화면을 λœ»ν•©λ‹ˆλ‹€.
  • λͺ¨λΈμ΄ 가지고 μžˆλŠ” 정보λ₯Ό λ”°λ‘œ μ €μž₯ν•˜μ§€ μ•Šμ•„μ•Ό ν•˜λ©° λ‹¨μˆœνžˆ μ‚¬κ°ν˜• λͺ¨μ–‘ λ“± 화면에 ν‘œμ‹œν•˜λŠ” μ •λ³΄λ§Œ 가지고 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  • λ˜ν•œ, 변경이 μΌμ–΄λ‚˜λ©΄ μ»¨νŠΈλ‘€λŸ¬μ— 이λ₯Ό 전달해야 ν•©λ‹ˆλ‹€.

Controller(컨트둀러)

  • 컨트둀러(Controller)λŠ” ν•˜λ‚˜ μ΄μƒμ˜ λͺ¨λΈκ³Ό ν•˜λ‚˜ μ΄μƒμ˜ λ·°λ₯Ό μž‡λŠ” 닀리 역할을 ν•˜λ©° 이벀트 λ“± 메인 λ‘œμ§μ„ λ‹΄λ‹Ήν•©λ‹ˆλ‹€.
  • λ˜ν•œ, λͺ¨λΈκ³Ό 뷰의 생λͺ…주기도 κ΄€λ¦¬ν•˜λ©°, λͺ¨λΈμ΄λ‚˜ 뷰의 λ³€κ²½ 톡지λ₯Ό λ°›μœΌλ©΄ 이λ₯Ό ν•΄μ„ν•˜μ—¬ 각각의 ꡬ성 μš”μ†Œμ— ν•΄λ‹Ή λ‚΄μš©μ— λŒ€ν•΄ μ•Œλ €μ€λ‹ˆλ‹€.

2️⃣ MVC νŒ¨ν„΄μ˜ 예 λ¦¬μ•‘νŠΈ.

  • MVC νŒ¨ν„΄μ„ μ΄μš©ν•œ λŒ€ν‘œμ μΈ ν”„λ ˆμž„μ›Œν¬λ‘œλŠ” μžλ°” ν”Œλž«νΌμ„ μœ„ν•œ μ˜€ν”ˆ μ†ŒμŠ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜ ν”„λ ˆμž„μ›Œν¬μΈ μŠ€ν”„λ§(Spring)이 μžˆμŠ΅λ‹ˆλ‹€.
  • Spring의 WEB MVCλŠ” μ›Ή μ„œλΉ„μŠ€λ₯Ό κ΅¬μΆ•ν•˜λŠ” 데 νŽΈλ¦¬ν•œ κΈ°λŠ₯듀을 많이 μ œκ³΅ν•©λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ @RequestParam, @RequestHaader, @PathVariable λ“±μ˜ μ• λ„ˆν…Œμ΄μ…˜μ„ 기반으둜 μ‚¬μš©μžμ˜ μš”μ²­ 값듀을 μ‰½κ²Œ 뢄석할 수 있으며 μ‚¬μš©μžμ˜ μ–΄λ– ν•œ μš”μ²­μ΄ μœ νš¨ν•œ μš”μ²­μΈμ§€ μ‰½κ²Œ κ±°λ₯Ό 수 μžˆμŠ΅λ‹ˆλ‹€.
  • 예λ₯Ό λ“€μ–΄ 숫자λ₯Ό μž…λ ₯ν•΄μ•Ό ν•˜λŠ”λ° 문자λ₯Ό μž…λ ₯ν•˜λŠ” 사둀 같은 것 말이죠.
  • λ˜ν•œ μž¬μ‚¬μš© κ°€λŠ₯ν•œ μ½”λ“œ, ν…ŒμŠ€νŠΈ, μ‰½κ²Œ λ¦¬λ””λ ‰μ…˜ν•  수 있게 ν•˜λŠ” λ“±μ˜ μž₯점이 μžˆμŠ΅λ‹ˆλ‹€.

3️⃣ μžλ°”μ—μ„œμ˜ MVC νŒ¨ν„΄.

  • μžλ°”μ—μ„œμ˜ MVC νŒ¨ν„΄(Model-View-Contorller) 은 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜ κ°œλ°œμ—μ„œ 널리 μ‚¬μš©λ˜λŠ” μ†Œν”„νŠΈμ›¨μ–΄ λ””μžμΈ νŒ¨ν„΄μž…λ‹ˆλ‹€.
  • 이 νŒ¨ν„΄μ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λͺ¨λΈ(Model), λ·°(View), 컨트둀러(Controller)둜 λΆ„λ¦¬ν•˜μ—¬ μ½”λ“œμ˜ μœ μ§€λ³΄μˆ˜μ„±κ³Ό ν™•μž₯성을 λ†’μ΄λŠ” ꡬ쑰λ₯Ό μ œκ³΅ν•©λ‹ˆλ‹€.

MVC νŒ¨ν„΄μ˜ ꡬ성 μš”μ†Œ.

1. Model(λͺ¨λΈ)

  • μ—­ν•  : μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ 데이터와 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 을 μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • κΈ°λŠ₯ :
    • λ°μ΄ν„°λ² μ΄μŠ€μ™€μ˜ μƒν˜Έμž‘μš©.
    • 데이터 μ €μž₯, μˆ˜μ •, μ‚­μ œμ™€ 같은 λΉ„μ¦ˆλ‹ˆμŠ€ 둜직 처리.
    • 데이터λ₯Ό κ°€κ³΅ν•˜μ—¬ 제곡.
  • 예 : λ°μ΄ν„°λ² μ΄μŠ€ μ—”ν‹°ν‹°, DAO, μ„œλΉ„μŠ€ 클래슀.
  • μ˜ˆμ‹œ μ½”λ“œ :
    public class User {
      private String username;
      private String email;
        
      // Getter and Setter
    }
    

2. View(λ·°)

  • μ—­ν•  : μ‚¬μš©μžκ°€ λ³΄λŠ” UI(μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€) λ₯Ό λ‹΄λ‹Ήν•©λ‹ˆλ‹€. λͺ¨λΈλ‘œλΆ€ν„° 데이터λ₯Ό λ°›μ•„μ™€μ„œ μ‚¬μš©μžμ—κ²Œ λ³΄μ—¬μ€λ‹ˆλ‹€.
  • κΈ°λŠ₯ :
    • HTML, JSP, Thymeleaf 같은 ν…œν”Œλ¦Ώ 엔진을 μ‚¬μš©ν•˜μ—¬ μ‚¬μš©μžμ—κ²Œ 데이터λ₯Ό λ Œλ”λ§
    • 데이터 μž…λ ₯, 좜λ ₯ 및 이벀트 처리.
  • 예 : JSP, Thymeleaf, HTML 파일.
  • μ˜ˆμ‹œμ½”λ“œ(Thymeleaf)
    ```java

User List


#### 3. Controller(컨트둀러)
- **μ—­ν•  :** μ‚¬μš©μžμ˜ μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³ , ν•„μš”ν•œ 데이터λ₯Ό λͺ¨λΈμ—μ„œ κ°€μ Έμ™€μ„œ 뷰에 μ „λ‹¬ν•˜λŠ” 역할을 ν•©λ‹ˆλ‹€.
- **κΈ°λŠ₯ :**
    - μ‚¬μš©μž μž…λ ₯을 λ°›κ³ , 이λ₯Ό μ²˜λ¦¬ν•  μ μ ˆν•œ 둜직(λͺ¨λΈ)으둜 전달
    - λͺ¨λΈλ‘œλΆ€ν„° 데이터λ₯Ό λ°›μ•„μ„œ μ μ ˆν•œ 뷰둜 λ°˜ν™˜.
    - HTTP μš”μ²­μ„ μ²˜λ¦¬ν•˜κ³ , κ²°κ³Όλ₯Ό 뷰에 반영.
- **예 :** Spring MVC의 `@Controller` 클래슀.
- **μ˜ˆμ‹œμ½”λ“œ (Spring Boot)**
```java
@Controller
public class UserController {
    @Autowired
    private UserService userService;
    
    @GetMapping("/users")
    public String listUsers(Model model) {
        List<User> users = userService.getAllUsers();
        model.addAttribute("users", users);
        return "userList"; // userList.html둜 λ°˜ν™˜
    }
}

MVC νŒ¨ν„΄μ˜ 흐름.

  • 1. μ‚¬μš©μžμ˜ μš”μ²­
    • μ‚¬μš©μžκ°€ λΈŒλΌμš°μ €μ—μ„œ URL을 μž…λ ₯ν•˜κ±°λ‚˜ λ²„νŠΌμ„ ν΄λ¦­ν•˜λŠ” λ“±μ˜ λ™μž‘μ„ 톡해 컨트둀러둜 μš”μ²­μ΄ μ „λ‹¬λ©λ‹ˆλ‹€.
  • 2. 컨트둀러의 처리
    • μ»¨νŠΈλ‘€λŸ¬λŠ” μ‚¬μš©μžμ˜ μš”μ²­μ„ λ°›κ³ , λΉ„μ¦ˆλ‹ˆμŠ€ 둜직이 ν•„μš”ν•œ 경우 λͺ¨λΈμ„ ν˜ΈμΆœν•˜μ—¬ 데이터λ₯Ό μ²˜λ¦¬ν•˜κ±°λ‚˜ κ°€μ Έμ˜΅λ‹ˆλ‹€.
  • 3. λͺ¨λΈμ˜ 처리
    • λͺ¨λΈμ€ λ°μ΄ν„°λ² μ΄μŠ€μ™€ μƒν˜Έμž‘μš©ν•˜μ—¬ 데이터λ₯Ό 읽고, μˆ˜μ •ν•˜κ±°λ‚˜ μΆ”κ°€/μ‚­μ œν•œ ν›„, 컨트둀러둜 κ²°κ³Όλ₯Ό λ°˜ν™˜ν•©λ‹ˆλ‹€.
  • 4. 뷰에 데이터 전달
    • μ»¨νŠΈλ‘€λŸ¬λŠ” λͺ¨λΈμ—μ„œ 받은 데이터λ₯Ό 뷰둜 μ „λ‹¬ν•˜κ³ , ν•΄λ‹Ή λ·°κ°€ μ‚¬μš©μžμ—κ²Œ 보여지도둝 응닡을 μƒμ„±ν•©λ‹ˆλ‹€.
  • 5. κ²°κ³Ό λ°˜ν™˜
    • μ΅œμ’…μ μœΌλ‘œ μ‚¬μš©μžλŠ” λΈŒλΌμš°μ €μ—μ„œ μ»¨νŠΈλ‘€λŸ¬κ°€ μ²˜λ¦¬ν•œ κ²°κ³Όλ₯Ό λ³Ό 수 μžˆμŠ΅λ‹ˆλ‹€.

μžλ°”μ—μ„œ MVC νŒ¨ν„΄μ„ μ‚¬μš©ν•˜λŠ” 예.

  • μžλ°”μ—μ„œλŠ” Spring MVC ν”„λ ˆμž„μ›Œν¬λ₯Ό μ‚¬μš©ν•˜μš” MVC νŒ¨ν„΄μ„ κ΅¬ν˜„ν•˜λŠ” 것이 μΌλ°˜μ μž…λ‹ˆλ‹€.
  • Spring MVCλŠ” 컨트둀러, λͺ¨λΈ, 뷰의 역할을 λΆ„λ¦¬ν•˜μ—¬ μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ κ°œλ°œν•  수 있게 ν•΄μ€λ‹ˆλ‹€.

Spring MVC의 κΈ°λ³Έ 흐름.

  • 1. DispatcherServler
    • λͺ¨λ“  μš”μ²­μ€ λ¨Όμ € DispatcherServlet으둜 μ „λ‹¬λ©λ‹ˆλ‹€.
    • 이것은 Front Controllerλ‘œμ„œ, μš”μ²­μ„ μ μ ˆν•œ 컨트둀러둜 λΌμš°νŒ…ν•©λ‹ˆλ‹€.
  • 2. Controller
    • DispatcherServler은 μš”μ²­μ„ μ²˜λ¦¬ν•  μ μ ˆν•œ 컨트둀러 λ©”μ„œλ“œλ₯Ό ν˜ΈμΆœν•©λ‹ˆλ‹€.
  • 3. Model
    • μ»¨νŠΈλ‘€λŸ¬λŠ” ν•„μš”ν•œ 경우 λͺ¨λΈκ³Ό μƒν˜Έμž‘μš©ν•˜μ—¬ 데이터λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
  • 4. View
    • μ»¨νŠΈλ‘€λŸ¬λŠ” λͺ¨λΈμ—μ„œ 처리된 데이터λ₯Ό 뷰에 μ „λ‹¬ν•©λ‹ˆλ‹€.
  • 5. View Resolver
    • λ·° 리쑸버(View Resolver)κ°€ HTML, JSP, Thymeleaf ν…œν”Œλ¦Ώ λ“±κ³Ό 같은 λ·°λ₯Ό λ Œλ”λ§ν•˜μ—¬ ν΄λΌμ΄μ–ΈνŠΈμ—κ²Œ 응닡을 λ³΄λƒ…λ‹ˆλ‹€.

Spring MVC μ½”λ“œ μ˜ˆμ‹œ.

  • 1. Controller
    @Controller
    public class ProductController {
        
      @Autowired
      private ProductService productService;
        
      @GetMapping("/products")
      public String getAllProducts(Model model) {
          List<Product> products = productService.getAllProducts();
          model.addAttribute("products", products);
          return "productList"; // productList.html둜 λ°˜ν™˜
      }
    }
    
  • 2. Model(Service & Entity)
    ```java
    @Service
    public class ProductService {

    @Autowired
    private ProductRepository productRepository;

    public List getAllProducts() { return productRepository.findAll(); } }

@Entity
public class Product {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private double price;

// Getter and Setters } ```
  • 3. View(Thymeleaf ν…œν”Œλ¦Ώ)
    ```html
    <!DOCTYPE html>
Product List

Product List

  • Product Name - Price

```

MVC νŒ¨ν„΄μ˜ μž₯점.

  • 1. μœ μ§€λ³΄μˆ˜μ„± ν–₯상.
    • λΉ„μ¦ˆλ‹ˆμŠ€ 둜직(Model)κ³Ό μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€(View)λ₯Ό λΆ„λ¦¬ν•¨μœΌλ‘œμ¨ μ½”λ“œλ₯Ό μ‰½κ²Œ μœ μ§€λ³΄μˆ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
    • UIλ₯Ό μˆ˜μ •ν•΄λ„ λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ—λŠ” 영ν–₯을 λ―ΈμΉ˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€.
  • 2. ν™•μž₯μ„±.
    • 각 λΆ€λΆ„(Model, View, Controller)을 λ…λ¦½μ μœΌλ‘œ ν™•μž₯ν•  수 μžˆμ–΄ ν™•μž₯성이 λ›°μ–΄λ‚©λ‹ˆλ‹€.
  • 3. ν…ŒμŠ€νŠΈ μš©μ΄μ„±.
    • λΉ„μ¦ˆλ‹ˆμŠ€ 둜직과 UIκ°€ λΆ„λ¦¬λ˜μ–΄ μžˆμ–΄, 각각의 뢀뢄을 λ…λ¦½μ μœΌλ‘œ ν…ŒμŠ€νŠΈν•  수 μžˆμŠ΅λ‹ˆλ‹€.

4️⃣ κ²°λ‘ .

  • MVC νŒ¨ν„΄μ€ μžλ°” 기반 μ›Ή μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ€‘μš”ν•œ λ””μžμΈ νŒ¨ν„΄μœΌλ‘œ, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ λͺ¨λΈ, λ·°, 컨트둀러둜 λΆ„λ¦¬ν•˜μ—¬ ꡬ쑰λ₯Ό λͺ…ν™•ν•˜κ²Œ μœ μ§€ν•˜κ³  μ½”λ“œμ˜ μž¬μ‚¬μš©μ„±μ„ λ†’μ΄λŠ” 데 κΈ°μ—¬ν•©λ‹ˆλ‹€.
  • Spring MVCλŠ” 이λ₯Ό μžλ°”μ—μ„œ μ‰½κ²Œ κ΅¬ν˜„ν•  수 μžˆλŠ” λŒ€ν‘œμ μΈ ν”„λ ˆμž„μ›Œν¬λ‘œ, λ§Žμ€ μžλ°” κ°œλ°œμžλ“€μ΄ μ‚¬μš©ν•˜λŠ” λ°©μ‹μž…λ‹ˆλ‹€.