본문 바로가기

Android/note

[Android] MVP 디자인 패턴에서 View 와 Presenter 는 왜 꼭 1:1로 대응되어야 할까?

디자인 패턴을 공부할때면 MVP 패턴에는 항상 View 와 Presenter 가 1:1로 대응되어야 한다고 설명이 되어있는 것을 볼 수 있다.

그런데 왜? 왜 1:1로 대응되어야 하는지, 1:1이 아니면 어떻게 되는지에 대해서는 설명을 잘 보지 못했던 것 같다.

실제로 안드로이드 면접을 봤을 때 이와 관련해서 질문을 하셨었다.

MVP는 View 와 Presenter 가 1:1로 대응되어야 한다고 하셨는데, 왜 1:1로 대응되어야 하는걸까요?
1:1로 대응되지 않으면 안되는걸까요?

 

공부했던대로 MVP는 1:1로 대응되어야합니다~ 라고 대답만 드렸었지 1:1이 되면 안되는 부분에 대해서는 생각해보지 않았기 때문에 답변을 못했었다.

 

 

그 이유를 About 프로젝트를 하면서 조금은 알 것 같았다.


about 프로젝트를 진행하면서 생각 조회 화면을 개발하는 중이었다.

내가 지금까지 만들었던 화면은 (1) 주제 목록 화면 (2) 생각 목록 화면 이었다.

그리고 주제/생각에 대해 저장/수정/삭제에 관한 액션들은 다이얼로그로 만들어놨었기 때문에 관련해서 presenter 를 더 만들지는 않았었다.

 

기존에 만들었었던 presenter

(1) 주제 목록 화면과 관련이 있는 presenter 로는 Topic Presenter 

(2) 생각 목록 화면과 관련이 있는 presenter 로는 Think Presenter

 

문제 발생(착각의 시작점?)

해당 생각에 대해 코멘트를 남길 수 있는 생각 조회 화면을 만들었는데, 여기서 조금 어려움이 있었다.

그리고 나는 'View 와 Presenter 에는 1:1 으로 대응이 되어야 한다.' 라는 조건을 잊고 있었다. 

 

생각 조회 화면이니

 

 

(1) 생각 관련해서는 Think Presenter 로 생각 데이터를 관리하고

(2) Comment Presenter 를 통해 코멘트 관련 데이터를 핸들링해야지! 하고 생각했었다.

 

 

근데 이렇게 되면 위의 사진과 같이 생각 조회 View 에 대해서 Think Presenter / Comment Presenter 를 사용하는 것이므로 1:1 의 조건을 지키지 못하게 된다. 1:2가 되어버림;

 

View : Presenter 가 1:2 이면 안되는 이유?

그래서 왜 1:1 대응을 해야하는지에 대해서 생각을 해보았다.

 

아래 사진은 생각/코멘트 Presenter 인터페이스에 정의한 함수들이다.

 

 

(1) 불필요한 기능에 접근이 가능하다.

생각 조회 화면에서는 Think Presenter 에 정의되어 있는 getAllThinkList 가 필요 없다.

생각 목록을 가져올 필요가 없으니까.

또한 생각을 등록하는 기능도 필요가 없는데 접근이 가능하다.

당연히 생각 조회 화면이라 등록할 수가 없음. 당연함.

 

(2) 해당 Presenter 와 관련된 View 인터페이스도 2번 구현해야 한다. 

현재 (1) 생각 삭제 (2) 코멘트 등록/삭제 한 경우에 토스트를 통해 사용자에게 결과를 알려주고 있다.

생각이 삭제되었다면 -> 생각이 삭제되었습니다.

코멘트를 등록하였다면 -> 코멘트가 등록/삭제되었습니다.

 

 

그렇기 때문에 각 View 인터페이스에는 토스트를 보여줄 수 있는 showToast() 를 정의해놓았는데, 이렇게 되면 생각 조회 화면에서 각각 View 를 구현해주어야 한다.

같은 기능을 하는 건데도 ...!

 

아무튼 정리해보자면,  View 와 Presenter 가 1:1 대응이 되지 않았을 때 생기는 2가지 문제점을 찾았다.

(1) 해당 View 에서는 사용할 일이 없는 불필요한 기능에 접근 가능

(2) 중복된 View 인터페이스 구현

 

그리고 네이밍도 잘못된 것 같아 각각의 화면과 관련된 일을하게끔 Presenter 의 이름도 변경해주었다.

- 주제 목록 화면 -> TopicListPresenter

- 생각 목록 화면 -> ThinkListPresenter

- 생각 조회 화면 -> ThinkPresenter

 

그런데 또 하나의 고민이 있다.

조회 화면을 그냥 Think 라고 지어도되는걸지? ThinkDetail 이라고 적어야할지 ..?

 

아무튼! 하나의 뷰에는 하나의 프레젠트가 ..

하뷰하프 ..

어쨋던  ... 이런 문제때문에 그런거 아닌데 ...! 싶으면 댓글 부탁드립니다 ..

감사합니다 ...