Spring 을 공부하다 보면은 MVC 패턴을 빠트릴 수 없다.
MVC 는 Model , View , Controller
이렇게 구성요소를 3가지의 역할로 구분한 것 이라는데..대다수의 개발자가 mvc 패턴을 강조하며 패턴대로 설계하라. 라는 말을 많이 들어봤을 것이다!
하지만 실제로 mvc 가 어떤건지는 대충 알지만 자세히는 알지못해 mvc 패턴을 어기는 일이 태반이라고 말한다.
(물론 나를 뜻하는 말 이다..)
따라서
자세히 알아보는 시간을 가져보도록 하자.
과거 개발자들은 정말 수천만, 수억개의 코드의 줄을 장황하게 보며,
유지보수를 했다고 한다.
그렇게 하나하나 스크롤 내려가며 버그를 찾고 수정해 가는 날을 이기지못하고,
조금이라도 편하게 유지보수 하는 방법을 찾다가
어? 이렇게 폴더 구조 나누고 기능 나누는게 진짜 괜찮네? 라는 방법론을 찾게되고
논문을 발표해 탄생하게 된 디자인 패턴이 바로 MVC 패턴이란다!
앞서 말했듯
M : model
V : View
C : controller
프로젝트 디자인을 (큰 맥락을) , 3가지의 역할로 구분한 것이다.
네? 역할이요? 그럼 각각 담당해야하는 일이 있는건가요?
물론이다! MVC 패턴이 나온 이유이다!
그럼 각각의 역할이 무엇인지.
내가 MVC 패턴을 쓰겠다고 마음먹었으면, 어떤식으로 코드를 짜야만 하는지 !
그걸 간단하게 알아보자!
데이터를 가지고 관리하는 객체의 역할을 한다.
모델은 다음과 같은 규칙을 가지고 있다.
View나 Controller에 대한 어떠한 코드도 받으면 안된다.
사용자한테 고정적으로 보여지는 부분의 역할을 한다. (입출력)
뷰의 규칙이다.
➡ View 안에는 Model에 데이터를 받을 순 있지만 컨트롤러와 관련된 코드는 있으면 안된다!
➡ 위에서 Model의 데이터를 받더라도 저장은 금물!
➡ 고정적으로 보여지는 부분은 반드시 View 에서 처리해야만 한다.
데이터와 사용자인터페이스 요소들을 잇는 중개자 역할을 한다.
컨트롤러 또한 다음과 같은 규칙이 있다.
중개자 역할을 하기 때문에, model, view 둘 다 에게서 받아올 수 있다.
생각보다 규칙과 제약사항이 많네요...?
이걸 막상 구현할 때 잘 지킬 수 있을까요..?
물론 쉽지만은 않을 것 이다! 하지만, 여러 예시를 보일테니,
코드를 보면 조금은 감을 잡을 수 있을 것 이다.
잘 지킨 예시와 잘못된 예시를 섞어가며 보일테니 감을 익혀보자!
원하는 결과 예시
이름과 나이를 말씀해주세요.
홍길똥
25
제 이름은 홍길똥 이구요. 나이는 25살 입니다.
이름과 나이를 말씀해주세요.
김모씨
32
제 이름은 김모씨 이구요. 나이는 32살 입니다.
이름과 나이를 말씀해주세요.
칠공육
24
제 이름은 칠공육 이구요. 나이는 24살 입니다.
...
Model 부터 보도록 하자!
1. Model은 사용자가 편집하길 원하는 모든 데이터를 가지고 있어야 한다.
2. Model 은 Controller 와 View 에 의존하면 안된다.
(View나 Controller에 대한 어떠한 코드도 받으면 안된다.)
규칙을 위반한 Model 코드
위 코드는 2가지 모두를 어긴 사례이다.
사용자 이름과 나이는 외부에서 받기를 원하지만,
해당 Student 는 외부에서 받는 내용이 존재하지 않으므로
1번에 위배되었다.
또한 View에 대한 어떠한 코드도 받으면 안되는데, 내부에 View 를 생성함으로서
2번이 위배되었다.
수정해보자!
사용자가 편집을 원하는 데이터를 가졌을 뿐더러
어떠한 View 와 Controller 의 내용도 들어가있지 않으므로
1,2번의 규칙에 들어왔다!
- View는 Model에만 의존하고 Controller는 의존하면 안된다.
➡ View 안에는 Model에 데이터를 받을 순 있지만 컨트롤러와 관련된 코드는 있으면 안된다!- 다만, View 는 Model이 가지고 있는 정보를 따로 저장해서는 안된다.
➡ 위에서 Model의 데이터를 받더라도 저장은 금물!- View는 Model로부터 데이터를 받을 때, 사용자마다 모두 다르게 보여지는 데이터만 받아야 한다!
➡ 고정적으로 보여지는 부분은 반드시 View 에서 처리해야만 한다.- View가 Model로 부터 데이터를 받을 때 반드시 Controller에서 받아야만 한다.
어렵지 않다 !
규칙위배 View 코드 (1)
View 는 사실 1번 덕분에 Model 에서 데이터를 받을 수 있다! (의존 가능하다)
하지만 그 정보를 절대로 따로 저장시켜서는 안된다! (2번 규칙 위배)
또한 View 는 Model(Student) 의 정보를 받을 때, Controller 안에서 받아야 하지만
이 코드는 직접 내부에서 생성하고, View 안에서 데이터를 받았기 때문에
규칙 4번이 위배된다.
올바른 View 코드
1,2번의 규칙으로 외부에서 Model (Student) 가져왔지만 저장시키지는 않았다!
또한 고정적으로 반복되는 글씨는 View 에서 처리했기 때문에
3번또한 만족시켰다.
4번에서 만족시키기 위해선 Model(Student)을 Contoller 에서 받았는가가 중요할 것이다 !
1. Controller는 Model이나 View에 대해서 의존 가능하다.
중개자 역할을 하기 때문에, model, view 둘 다 에게서 받아올 수 있다.
사실 Controller 는 이제 Model 과 View 를 이어주는 중개자 역할이기 때문에
비교적 자유롭다!
올바른 Controller 코드
1번의 규칙인 Model 과 View 를 Controller 에서 받았고,
동시에 View 의 4번 규칙인
View가 Model로 부터 데이터를 받을 때 반드시 Controller에서 받아야만 한다.
또한 만족시켰기 때문에
올바른 코드라고 말할 수 있겠다!
사실 개발을 할수록, 코드가 복잡해질수록 디자인 패턴을 지켜가면서
개발을 해 나가기는 참 힘든 것 같다.
하지만 지속적으로 고민하고, 또 고민해가며
개발을 이어나간다면, 분명 깔끔하고 아름다운 코드가
완성될 것 이다!
성공적인 개발자를 위해! Cheers! 🍻