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 νŒ¨ν„΄ μ΄λ‚˜ λ ˆμ΄μ–΄λ“œ μ•„ν‚€ν…μ²˜ κ°€ 더 μ ν•©ν•©λ‹ˆλ‹€.