[Design Pattern] 설명하기 쉽지 않은 MVC Pattern

zl존석동

·

2021. 12. 23. 23:03

 

뭔지 알아도 설명을 못한다는 건 모르는 거나 마찬가지이다.

기록을 해보며 알아갈 수 있도록 해보자!

 


Design Pattern?

MVC Pattern?

 

 

 

 

Design Pattern 이란?

 

소프트웨어 디자인 패턴은 소프트웨어 공학의 소프트웨어 디자인에서 특정 문맥에서 공통적으로 발생하는 문제에 대해 재사용 가능한 해결책이다. 

 

왜 있나?

뒤에서 알아볼 MVC와 웹 개발을 예를 들어 생각해봅시다.

 

웹 프로그래머들이 많은 웹 애플리케이션을 만들어오며 피드백에 따라 새로운 기능을 추가하거나 기능을 수정하기 위해 코드는 계속해서 추가되고 변경되게 됩니다.

 

B 라는 기능을 추가하는데 다른 A라는 부분이 바뀌어야 한다던가, 코드가 너무 복잡해져서 생산성이 떨어진다던가 하는 등 ..  유지보수에 어려움이 생기게 됩니다.  

 

그래서 고수들이 이런 문제들의 해결을 위해 많은 여러가지 새로운 시도와 삽질을 해보게 되고 디자인 패턴은 그로부터 나온 소프트 웨어 설계나 문제 해결에 대한 Best Practice 라고 할 수 있는 것입니다.

 

 

그래서 왜 있는지 요약해서 생각해보면

 

"소프트웨어 개발에서 BP로 만들어진 설계와 틀을 적절하게 접목함으로써 우리 햇병아리들이 삽질할 일 없이 낭비를 줄이고 유지보수를 쉽게 할 수 있게 해주기 위해서이다."

 

라는 것이라고 할 수 있지 않을까 생각합니다.

 

 

 

 

MVC Pattern이란?

 

그렇다면 MVC 패턴이란 무엇일까요?

 

디자인 패턴에서도 구조적인 관점에서의 패턴인 MVC는 웹 또는 앱 개발 구조의 근간이 되는 패턴이라고 합니다.

 

 

MVCModel , View , Controller 의 합성어로 간단하게 정의해보자면

 

"애플리케이션을 구성할 때 구성 요소를 Model , View , Controller 라는 세 개의 기능으로 분리해 개발하겠다"

 

라는 것입니다.

Model      :  데이터 + 데이터를 처리하는 로직
View        :  사용자에게 보여지는 UI
Controller :  Model 과 View 사이에서 사용자 요청을 받고 요청에 맞는 응답을 다시 View로 전달

 

 

 

간단하게 동작을 살펴보자

 

(1) 사용자가 View 에서 어떤 요청을 하게 된다. Controller 가 요청을 받는다.

 

(2) Controller가 요청이 데이터의 조회나 수정 등이 필요한지 확인하고 Model에게 요청한다.

 

(3)(4)(5) Model에서 요청에 맞는 기능을 수행하고 결과 데이터를 다시 Controller 에게 전달한다.

 

(6) Controller 는 요청에 대한 응답을 보여줄 View 로 전달한다.

 

 

 

 

어떻게 하면 MVC 구조를 잘 유지하면서 코드를 작성할 수 있을까??

 

좋은 유튜브 영상을 보고 정리해보았습니다.

 

 

 1. 모델은 컨트롤러와 뷰에 의존하지 않아야 한다.

 

모델 내부에 컨트롤러 라던가 뷰의 클래스를 import 해서 관련 코드를 사용하지 말자 라고 생각하면 될 것 같습니다.

 

모델에는 데이터와 데이터에 관련된 기능만 있어야 합니다.

 

 

 

2. 뷰는 모델에만 의존해야 하고 컨트롤러에는 의존하면 안된다.

 

 

띠용?? 무슨 소리죠?? 라고 생각이 된다면 쇼핑몰 사이트에서 카테고리 검색을 한다고 생각해 봅시다.

 

우리가 사이트의 에서 카테고리 검색란에 스포츠 라고 검색을 하면

 

상품이라는 데이터가 필요하겠죠? 그래서 컨트롤러모델에게 데이터를 요청하게 됩니다.

 

하지만 우리는 상품 중에서도 카테고리가 스포츠인 상품을 요구하고 있습니다.

 

그래서 모델에서는 모든 상품데이터에서 카테고리가 스포츠 인 데이터를 찾는 로직을 수행 할 것이고

 

이 결과로 얻은 데이터를 컨트롤러를 통해 뷰로 전달되고 스포츠 카테고리를 가진 모든 상품이 조회 될 것입니다.

 

 

 

결국 지금 과정에서 컨트롤러는 결국 요청/응답의 중간다리 역할만 했을 뿐이고

 

모델에서 발생한 로직의 영향으로 뷰에는 스포츠 카테고리의 상품들이 조회 된 것입니다.

 

즉 "뷰는 모델을 이용해 업데이트 한다." 라고 할 수 있는 것입니다.

 

 

그래서 이렇게도 MVC를 나타낼 수 있습니다.

https://ko.wikipedia.org/wiki/%EB%AA%A8%EB%8D%B8-%EB%B7%B0-%EC%BB%A8%ED%8A%B8%EB%A1%A4%EB%9F%AC

 

 

쉬운 예시를 하나 더 들어보면 우리가 어떤 웹 사이트에서의 회원인데 닉네임 변경을 한다고 생각해봅시다.

 

유저 모델에서 당신이라는 하나의 요소에서 닉네임이라는 값이 변경된 것이고 이 변경은

 

닉네임을 보여주는 뷰 부분이 있을 때 반영이 된다는 것입니다.

 

 

자바만을 활용한 간단한 예시로 이를 살펴봅시다!

// 모델

public class People{
	private String name;
	private int age;
    
    public People(String name , int age){
    	this.name = name;
        this.age = age;
    }
    public String getName(){
    	return this.name;
    }
    public void setName(String name){
    	this.name = name;
    }
}

public class PeopleModel{
	private static People[] allPeople = new People[2];
    
    static {
    	allPeople[0] = new People("김갑환",30);
        allPeople[1] = new People("최번개",25);
    }
    
    // 존재하는 모든 유저 조회!
    public static People[] findAll(){
    	return allPeople;
    }
}

 

DB People 테이블에 2개의 데이터가 있는 것으로 가정한다.

 

 

메인뷰에서 모든 People을 보여줘! 라는 요청을 했다고 생각해보자. 다음과 같이 요청이 컨트롤러로 전달 될 것이다.

// 뷰 
public class View {
	
    public static void requestAllPeople(){
    	PeopleController.responseAllPeople();
    }
    
    public static void main(String[] args){
    	requestAllPeople();
    }
}

 

 

컨트롤러에서는 요청에 대해 적절한 응답을 해야 한다.

 

모든 People 을 요구했으니 모델에게서 findAll() people 을 요청할 것이고 메소드 수행을 통해 얻게 된 데이터선택된 응답을 보여줄 뷰에서 보여지게 된다.

// 응답용 뷰
// 받은 데이터를 어떻게 이쁘게 보여줄지는 여기서 정하는거다.
public class PeopleView {
    private static final String NAME = "사용자 이름 : ";
    
    public static void printAllPeople(People[] peopleArr){
    	System.out.println(NAME + peopleArr.getName());
    }
}

// 컨트롤러
public class PeopleController {
	
    public static void responseAllPeople(){
    	// 요청에 대한 응답 데이터를 모델로 부터 전달 받음
    	People[] resultPeopleArr = PeopleModel.findAll();
        // 데이터를 적절한 뷰에서 같이 보여준다.
	printAllPeople(peopleArr);
    }
}

 

컨트롤러는 결국 데이터를 전달 받고 뷰로 전해주는 역할을 할 뿐인 것을 알 수 있다.

 

모든 사람 조회 라는 요청에 대해서

 

이름을 보여주는 부분을 수정하고 싶다면 응답용 뷰 부분을 수정하기만 하면 되고

 

만약 또 다른 요청으로 사람 데이터가 50명으로 늘어났거나 '김갑환' 이라는 이름을 가진 사람이 '장거한' 으로 개명했다면?? 

 

모든 사람 조회  라는 요청에 대한 응답에 그대로 반영될 것이다.

 

 

 

3. 사용자마다 다르게 보여져야 하는 데이터에 대해서만 모델로부터 뷰가 데이터를 받는다.

 

 요청에 대한 응답 시 모델 구조에 존재하는 데이터에 대한 것들만 모델로부터 받아와야 한다.

 

이름 : 김갑환

나이 : 30

 

여기서 사용자마다 다르게 보여져야 하는 데이터는 무슨 색깔일까? 

 

이름 :  같은 것들은 모두에게 공통적으로 보여지는 텍스트이기 때문에 굳이

 

모델 구조에 포함되어서 혼란과 더 많은 입출력을 줄 필요가 없고 뷰에 존재하면 된다.

 

 

4.  컨트롤러는 모델과 뷰에 의존할 수 있다.

 

모델구조가 바뀌면 뷰도 이를 의존하고 있기 때문에 변경될 수 있고 둘 사이에 있는 컨트롤러도 변경이 있을 수 있다는 말이 아닐까 생각한다.

 

대규모 프로그램에서 컨트롤러에 다수의 모델과 뷰가 복잡하게 연결되서 복잡하고 유지보수가 어려워 질 수 있는 문제점이 발생할 수 있다.

 

 

5. 뷰가 모델로부터 데이터를 받을 때는 반드시 컨트롤러에서 받아야 한다.

 

위의 코드에서 보았다.

 

 

 


마치며 

 

간략하게 MVC 패턴에 대해서 알아보았다.! 

 

잘못된 내용이 있으면 지적 부탁드립니다!

 

 

 

 

 

ref

 

 

 

 

[디자인 패턴] MVC, MVP, MVVM 기본 개념

MVC 패턴 Model + View + Controller Model : 데이터와 데이터를 처리하는 부분 View : UI Controller : 사용자의 입력(Action)을 받고 처리하는 부분 MVC 패턴의 동작 순서 Controller에 사용자의 입력(Action)을..

heegs.tistory.com

 

'Design pattern' 카테고리의 다른 글

[Design Pattern] Singleton 패턴이란  (0) 2021.12.31