MVP 패턴
1. MVP 개념
- 모델-뷰-프레젠터(Model-View-Presenter)
- MVC(Model-View-Controller) 패턴의 변형
2. 왜 쓸까?
- 주로 사용자 인터페이스와 비즈니스 로직을 분리하여 코드의 유지보수성과 테스트 향상시키기 위해 사용
- MVC 패턴의 단점인
컨트롤러(Controller)
가 비즈니스 로직과 뷰의 역할을 동시에 담당하는 것을 보완
3. 어디에 쓰일까?
- 특히 안드로이드 앱 개발에 많이 사용
- 안드로이드에서는
액티비티(Activity)
가 뷰 역할을 하고, 프레젠터
는 비즈니스 로직과 뷰 간의 중개를 담당
- 이렇게 하면 안드로이드 앱의 구조를 더 잘 구성하고, 액티비티에서 비즈니스 로직을 분리하여 앱의 유지보수성과 테스트 용이성을 향상
4. MVP 주요 요소
- 모델(Model)
- 비즈니스 로직과 데이터를 담당하는 부분
- 데이터의 유효성 검증, 데이터베이스와의 상호작용, 네트워크 통신 등과 같은 업무를 수행
- 뷰와 직접적으로 상호작용하지 않으며, 인터페이스나 콜백을 통해
프레젠터
와 소통
- 뷰(View)
- 사용자 인터페이스를 담당하는 부분
- 사용자의 입력을 받고, 데이터를 표시하며, 화면을 업데이트하는 역할
- 모델과 직접적으로 상호작용하지 않으며,
프레젠터
에 의해 조작되어 데이터를 표시하고 업데이트합니다.
- 프레젠터(Presenter)
- 모델과 뷰 사이의
중개자
역할을 수행하는 부분
- 사용자 입력을 처리하고, 모델로부터 데이터를 가져와 뷰에 전달하며, 뷰로부터 사용자 액션을 수신하여 모델을 업데이트
- MVP 패턴에서 가장 핵심적인 부분으로, 비즈니스 로직과 뷰 간의 결합도를 낮추고 코드를 테스트하기 쉽게 만든다.
5. 그렇다면 예시는?
public class UserModel {
private String username;
private String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
public interface LoginView {
String getUsername();
String getPassword();
void showLoading();
void hideLoading();
void showLoginSuccessMessage();
void showLoginErrorMessage();
}
- 프레젠터(Presenter)
- 로그인 버튼이 클릭되면 사용자가 입력한 데이터를 받아와 모델의 데이터와 비교하고, 로그인 성공/실패 여부에 따라 뷰에 결과를 알려주는 역할
ublic class LoginPresenter {
private LoginView view;
private UserModel model;
public LoginPresenter(LoginView view) {
this.view = view;
this.model = new UserModel();
}
public void onLoginButtonClicked() {
String username = view.getUsername();
String password = view.getPassword();
if (username.equals("user123") && password.equals("password123")) {
view.showLoading();
view.hideLoading();
view.showLoginSuccessMessage();
} else {
view.showLoginErrorMessage();
}
}
}
6. 결론
- 안드로이드 앱 개발에 많이 사용되며, MVC의 Controller가 비즈니스 로직과 뷰의 역할을 동시에 담당하는 것을
프레젠터
로 바꿔 보완하여 코드의 재사용성과 유지보수성을 향상시킨 디자인 패턴
- 프레젠터를 통해 뷰와 모델이 서로 직접적으로 상호작용하지 않고, 중개자를 통해 통신하게 되므로 코드의 결합도가 낮아지고 테스트가 용이