Home > CS > 2024 > ๐Ÿ’พ [CS] MVP ํŒจํ„ด.

๐Ÿ’พ [CS] MVP ํŒจํ„ด.
CS

๐Ÿ’พ [CS] MVP ํŒจํ„ด.

1๏ธโƒฃ MVP ํŒจํ„ด.

  • MVP ํŒจํ„ด์€ MVC ํŒจํ„ด์œผ๋กœ๋ถ€ํ„ฐ ํŒŒ์ƒ๋˜์—ˆ์œผ๋ฉฐ MVC์—์„œ C์— ํ•ด๋‹นํ•˜๋Š” ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ํ”„๋ ˆ์  ํ„ฐ(Presenter)๋กœ ๊ต์ฒด๋œ ํŒจํ„ด์ž…๋‹ˆ๋‹ค.

  • ๋ทฐ์™€ ํ”„๋ ˆ์  ํ„ฐ๋Š” ์ผ๋Œ€์ผ ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— MVC ํŒจํ„ด๋ณด๋‹ค ๋” ๊ฐ•ํ•œ ๊ฒฐํ•ฉ์„ ์ง€๋‹Œ ๋””์ž์ธ ํŒจํ„ด์ด๋ผ๊ณ  ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2๏ธโƒฃ ์ž๋ฐ”์—์„œ์˜ MVP ํŒจํ„ด.

  • ์ž๋ฐ”์—์„œ์˜ MVP ํŒจํ„ด์€ ์ฃผ๋กœ, ๋ฐ์Šคํฌํƒ‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(JavaFX, Swing) ๋˜๋Š” ์•ˆ๋“œ๋กœ์ด๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•  ๋•Œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ์ž๋ฐ”์—์„œ๋Š” ์ฃผ๋กœ MVC ํŒจํ„ด์ด ๋งŽ์ด ์‚ฌ์šฉ๋˜์ง€๋งŒ, MVP ํŒจํ„ด์€ UI์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋”์šฑ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ƒํ™ฉ์— ๋”ฐ๋ผ ๋” ์ ํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

3๏ธโƒฃ MVP ํŒจํ„ด์˜ ๊ตฌ์กฐ.

  • MVP๋Š” Model-View-Presenter์˜ ์•ฝ์ž๋กœ, ์•„๋ž˜์™€ ๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ์ฃผ์š” ๊ตฌ์„ฑ ์š”์†Œ๋กœ ๋‚˜๋‰ฉ๋‹ˆ๋‹ค.
  • 1. Model(๋ชจ๋ธ)
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ฐ์ดํ„ฐ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•˜๋Š” ์—ญํ• ์„ ๋‹ด๋‹นํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ, API ํ˜ธ์ถœ, ๋ฐ์ดํ„ฐ ๊ฐ€๊ณต.
  • 2. View(๋ทฐ)
    • ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ๋‹ด๋‹นํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ํ™”๋ฉด์„ ํ‘œ์‹œํ•˜๊ณ  ์ž…๋ ฅ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค.
    • View๋Š” Presenter์— ์˜์กดํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์š”์ฒญํ•˜๊ณ , ๊ทธ ๋ฐ์ดํ„ฐ๋ฅผ ํ‘œ์‹œํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์˜ˆ: ์ž๋ฐ”์˜ JPanel, JFrame(Swing) ๋˜๋Š” Activity, Fragment(์•ˆ๋“œ๋กœ์ด๋“œ)
  • 3. Presenter(ํ”„๋ ˆ์  ํ„ฐ)
    • View์™€ Model๊ฐ„์˜ ์ค‘์žฌ์ž ์—ญํ• ์„ ํ•˜๋ฉฐ, ๋ทฐ์—์„œ ๋ฐœ์ƒํ•œ ์‚ฌ์šฉ์ž ์ƒํ˜ธ์ž‘์šฉ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ชจ๋ธ์—์„œ ๊ฐ€์ ธ์™€ ๋ทฐ์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ, View์™€ Model์„ ์ง์ ‘ ์—ฐ๊ฒฐํ•˜์ง€ ์•Š๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • Presenter๋Š” View ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ํ†ตํ•ด View์™€ ํ†ต์‹ ํ•˜๊ณ , ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅํ•œ ๊ตฌ์กฐ๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

4๏ธโƒฃ ๋ฐฑ์—”๋“œ๋ฅผ Java๋กœ ๊ตฌํ˜„์‹œ MVP ํŒจํ„ด์ด ์‚ฌ์šฉ๋˜๋‚˜์š”?

  • ์ผ๋ฐ˜์ ์œผ๋กœ MVPํŒจํ„ด(Model-View-Presenter) ์€ ์ฃผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๋˜๋Š” UI ์ค‘์‹ฌ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • MVP ํŒจํ„ด์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ์ค‘์ ์„ ๋‘๊ธฐ ๋•Œ๋ฌธ์—, ๋ฐ์Šคํฌํƒ‘ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(JavaFX, Swing)์ด๋‚˜ ๋ชจ๋ฐ”์ผ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜(์•ˆ๋“œ๋กœ์ด๋“œ)์—์„œ ๋งŽ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ ๋ฐฑ์—”๋“œ ์• ํ”๋ฆฌ์ผ€์ด์…˜์„ Java๋กœ ๊ตฌํ˜„ํ•  ๋•Œ๋Š” MVP ํŒจํ„ด์ด ๊ฑฐ์˜ ์‚ฌ์šฉ๋˜์ง€ ์•Š์œผ๋ฉฐ, ๊ทธ ๋Œ€์‹  ๋‹ค๋ฅธ ๋””์ž์ธ ํŒจํ„ด์ด ์ฃผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

1. MVP ํŒจํ„ด์˜ ๋ชฉ์ .

  • MVP ํŒจํ„ด์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค(UI)๋ฅผ ์ค‘์‹ฌ์œผ๋กœ View์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง(Presenter) ์„ ๋ถ„๋ฆฌํ•˜๋Š” ๋ฐ ๋ชฉ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ๋ฐฑ์—”๋“œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์•„๋‹Œ ์„œ๋ฒ„ ์ธก ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ, API ์ œ๊ณต ๋“ฑ์„ ๋‹ค๋ฃจ๊ธฐ ๋•Œ๋ฌธ์—, UI ์š”์†Œ๊ฐ€ ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ๋”ฐ๋ผ์„œ View ๋ผ๋Š” ๊ฐœ๋…์ด ๋ฐฑ์—”๋“œ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

2. ๋ฐฑ์—”๋“œ์—์„œ๋Š” MVC ํŒจํ„ด์ด ๋” ์ ํ•ฉ.

  • Java ๊ธฐ๋ฐ˜ ๋ฐฑ์—”ํŠธ ๊ฐœ๋ฐœ์—์„œ๋Š” MVC(Model-View-Controller) ํŒจํ„ด ์ด๋‚˜ ์„œ๋น„์Šค ๊ณ„์ธต ํŒจํ„ด ๊ณผ ๊ฐ™์€ ๊ตฌ์กฐ๊ฐ€ ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.
  • ํŠนํžˆ, Spring Framework ๊ฐ™์€ ์ธ๊ธฐ ์žˆ๋Š” ๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ๋Š” MVC ํŒจํ„ด์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • ๋ฐฑ์—”๋“œ์—์„œ ์ปจํŠธ๋กค๋Ÿฌ(Controller) ๊ฐ€ ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ชจ๋ธ(Model) ์ด ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ์™€ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ๋ทฐ(View) ๋Š” API ์‘๋‹ต(JSON, XML ๋“ฑ)์„ ์ƒ์„ฑํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐฑ์—”๋“œ์—์„œ ์ž์ฃผ ์‚ฌ์šฉ๋˜๋Š” ๋””์ž์ธ ํŒจํ„ด.

  • 1. MVC ํŒจํ„ด(Model-View-Controller)
    • ์„œ๋ฒ„ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋ฉฐ, API ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
  • 2. ์„œ๋น„์Šค ๊ณ„์ธต ํŒจํ„ด
    • ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์„œ๋น„์Šค ๊ณ„์ธต์œผ๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์„ ๋†’์ด๋Š” ํŒจํ„ด์ž…๋‹ˆ๋‹ค.
  • 3. Repository ํŒจํ„ด
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์•ก์„ธ์Šค ๋กœ์ง์„ ์ถ”์ƒํ™”ํ•˜์—ฌ, ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง๊ณผ ๋ฐ์ดํ„ฐ ์•ก์„ธ์Šค๋ฅผ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • 4. Command ํŒจํ„ด
    • ์‚ฌ์šฉ์ž์˜ ์š”์ฒญ์ด๋‚˜ ๋ช…๋ น์„ ๊ฐ์ฒด๋กœ ๋ณ€ํ™˜ํ•˜์—ฌ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ, ์—ฌ๋Ÿฌ ์š”์ฒญ์„ ๊ด€๋ฆฌํ•˜๋Š”๋ฐ ์œ ๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
  • 5. Observer ํŒจํ„ด
    • ์ƒํƒœ ๋ณ€ํ™”๋ฅผ ์—ฌ๋Ÿฌ ๊ฐ์ฒด๊ฐ€ ๊ตฌ๋…ํ•˜๊ณ  ๋ฐ˜์‘ํ•˜๋Š” ํŒจํ„ด์œผ๋กœ, ์ด๋ฒคํŠธ ๊ธฐ๋ฐ˜ ์‹œ์Šคํ…œ์— ์ž์ฃผ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

3. ๋ฐฑ์—”๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋Š” ๋””์ž์ธ ํŒจํ„ด์˜ ์˜ˆ์‹œ.

  • 1. Spring MVC ํŒจํ„ด
    • Spring์—์„œ๋Š” Controller๊ฐ€ HTTP ์š”์ฒญ์„ ๋ฐ›๊ณ , Service์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•œ ๋’ค, Model์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๊ณ  View๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ์ „ํ˜•์ ์ธ MVC ํŒจํ„ด์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ์—ฌ๊ธฐ์„œ View๋Š” HTML ๋˜๋Š” JSON, XML๊ณผ ๊ฐ™์€ ์‘๋‹ต ํฌ๋งท์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
@Controller
public class UserController {
    
    @Autowired
    private UserService userService;
    
    @GetMapping("/users/{id}")
    public ResponseEntity<User> getUser(@PathVariable Long id) {
        User user = userService.findUserById(id);
        return new ResponseEntity<>(user, HttpStatus.OK);
    }
}
  • Controller ๋Š” ํด๋ผ์ด์–ธํŠธ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๊ณตํ•œ ํ›„ ์‘๋‹ตํ•ฉ๋‹ˆ๋‹ค.
  • Service ๋Š” ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ์ฒ˜๋ฆฌํ•˜๋Š” ์ค‘๊ฐ„ ๊ณ„์ธต ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • Repository ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์™€ ์ƒํ˜ธ์ž‘์šฉํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

  • 2. ์„œ๋น„์Šค ๊ณ„์ธต ํŒจํ„ด
    • ์„œ๋น„์Šค ๊ณ„์ธต์„ ์‚ฌ์šฉํ•˜๋ฉด ์ปจํŠธ๋กค๋Ÿฌ๊ฐ€ ์ง์ ‘ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง์„ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ , ์„œ๋น„์Šค ํด๋ž˜์Šค๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
    • ์ด๋กœ ์ธํ•ด ์ฝ”๋“œ๊ฐ€ ๋” ๊ตฌ์กฐ์ ์œผ๋กœ ๊ด€๋ฆฌ๋˜๊ณ  ํ…Œ์ŠคํŠธ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•„์ง‘๋‹ˆ๋‹ค.
      ```java
      @Service
      public class UserService {
      @Autowired
      private UserRepository userRepository;

    public User findUserById(Long id) {
    return userRepository.findById(id).orElseThrow(() -> new UserNotFoundException(id));
    }
    }
    ```

  • 3. Repository ํŒจํ„ด
    • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ด€๋ จ ๋กœ์ง์„ ๋ณ„๋„์˜ Repository ์ธํ„ฐํŽ˜์ด์Šค๋กœ ๋ถ„๋ฆฌํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค๋ฅผ ์‰ฝ๊ฒŒ ๊ด€๋ฆฌํ•˜๊ณ  ์ถ”์ƒํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
@Repository
public interface UserRepository extends JpaRepository<User, Long> {
    // ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ ‘๊ทผ ๋กœ์ง์„ ์ถ”์ƒํ™”
}

4. MVP ํŒจํ„ด์ด ๋ฐฑ์—”๋“œ์—์„œ ์ ํ•ฉํ•˜์ง€ ์•Š์€ ์ด์œ .

  • View์— ๋Œ€ํ•œ ์˜์กด์„ฑ.
    • MVP ํŒจํ„ด์˜ ํ•ต์‹ฌ ์š”์†Œ๋Š” View ์ด๋ฉฐ, ๋ฐฑ์—”๋“œ์—๋Š” UI๋ฅผ ๋‹ค๋ฃจ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— View์˜ ์—ญํ• ์ด ์กด์žฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
    • ๋ฐฑ์—”๋“œ๋Š” ์‚ฌ์šฉ์ž ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ Œ๋”๋งํ•˜๊ฑฐ๋‚˜ ๋‹ค๋ฃจ์ง€ ์•Š๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ๋Š” ์‘๋‹ต์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋ถ„๋ฆฌ๋œ ๋กœ์ง.
    • ๋ฐฑ์—”๋“œ๋Š” ํด๋ผ์ด์–ธํŠธ์™€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฃผ๊ณ ๋ฐ›์œผ๋ฉฐ, ์ด ๊ณผ์ •์—์„œ ๋น„์ฆˆ๋‹ˆ์Šค ๋กœ์ง, ๋ฐ์ดํ„ฐ ์—‘์„ธ์Šค, API ์‘๋‹ต ์ƒ์„ฑ ๋“ฑ๊ณผ ๊ฐ™์€ ๋ณต์žกํ•œ ์ฒ˜๋ฆฌ๊ฐ€ ์ด๋ฃจ์–ด ์ง‘๋‹ˆ๋‹ค.
    • ์ด๋Ÿฌํ•œ ์ž‘์—…์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ๋Š” MVC ํŒจํ„ด ์ด๋‚˜ ๋ ˆ์ด์–ด๋“œ ์•„ํ‚คํ…์ฒ˜ ๊ฐ€ ๋” ์ ํ•ฉํ•ฉ๋‹ˆ๋‹ค.