MVC 패턴 이해가기 쉽게 정리해 보자

지송·2023년 10월 17일
0

Java Spring

목록 보기
2/2

부제: 나는 MVC 패턴이 이해가 가질 않아서...

이 글은 제가 이해가 갈 때까지 모든 자료를 총동원해 정리할 예정입니다
생각의 흐름을 자유롭게 기술하고 이건 맞는 표현이었구나 이건 틀린 표현이었구나 첨언할 예정이기에 날것 그대로입니다!
지나가다 보면서 이건 틀렸어요~ 하는 게 있다면 자유롭게 남겨 주세요

MVC 패턴은 지금껏 스프링 프로젝트를 진행하며 매번 도입했었지만 막상 또 설명을 하고 분리를 하려니 어렵네요
원래라면 웹을 만들 때 API를 죄다 컨트롤러에 넣고는 했는데 이번에 다른 공부를 하게 되며 API가 없는 구조에서는 도대체 컨트롤러에는 어떤 코드를 넣는 건지 이해가 가질 않기 시작했습니다
그리고 깨달은 점이 바로... 나는 지금껏 비슷하게 정리된 걸 응용했을 뿐 주체적으로 분리를 하려는 노력은 하지 않은 것 같다는 생각이 들었습니다
사실 웹의 구조는 비슷하니까 적당히 다른 사람 코드를 참고하지 않았나...
그래서 시작하는 MVC 패턴 이해할 때까지 공부하는 지옥 시간 START

그래서 기본적인 개념은 뭔데?

구글링해서 가장 대표적인 그림을 갖고 왔지만 아직 궁금증이 남아있습니다
유저의 입력을 뷰가 받아서 컨트롤러에 넘기는 게 아닌가?
그런데 생각해 보면 뷰와 클라이언트를 혼동하고 있는 것 같은...
뷰와 모델은 어느정도 수립이 가능한데 사실 컨트롤러 개념이 명확하지 않아 글을 썼습니다
뷰와 모델을 중재하는 컨트롤러... 도대체 뭐지?

MVC 흐름 알아보기

(출처: 우아한 테크 유튜브)

  1. 사용자는 원하는 기능을 처리하기 위한 모든 요청을 컨트롤러에게 보낸다
  2. 컨트롤러는 모델을 사용하고 모델은 알맞는 비즈니스 로직을 수행한다
  3. 컨트롤러는 사용자에게 보여줄 뷰를 선택한다
  4. 선택한 뷰는 사용자에게 알맞는 결과 화면을 보여준다
    이때 사용자에게 보여줄 데이터는 컨트롤러를 통해서 전달 받는다

MVC 규칙 알아보기

(출처: 우아한 테크 유튜브)

  1. Model은 Controller 와 View에 의존하지 않아야 한다
  2. View는 Model에만 의존해야 하고 Controller에는 의존하면 안 된다
  3. View 가 Model로부터 데이터를 받을 때는 사용자마다 다르게 보여주어야 하는 데이터에 대해서만 받아야 한다
  4. Controller는 Model과 View에 의존해도 된다
  5. View가 Model로부터 데이터를 받을 때, 반드시 Controllle에서 받아야 한다

MVC 역할 알아보기

(출처: 우아한 테크 유튜브, 얄팍한 코딩 사전)

MODEL

값과 기능을 가지고 있는 객체
식료품 창고를 관리하고 음식을 요리하는 주방장! 즉 재료를 관리하고 요리?

VIEW

모델에 포함된 데이터의 시각화
주방장이 만든 음식을 플레이팅 하는 직원

CONTROLLER

모델 객체로의 데이터 흐름을 제어
뷰와 모델의 역할을 분리

분리를 어떤식으로 하는지 감이 안 온다 ㅠㅠ
데이터 흐름을 제어...? 어떤 식으로 하는 거죠?

가능한 가볍게 구현하라!
연결 역할만 하게 하라!

그럼 뷰에서 모델을 바로 갖고 오면 안 되는 것일까?
좀 더 명확한 이해가 필요해...

주문도 받고 서빙도 하는 매니저?

컨트롤러의 역할을 좀 더 알아보자~

  1. 입력 처리
  2. 모델 업데이트
  3. 뷰 선택
  4. 뷰와 모델 연결

즉 사용자의 요청이 진입하는 지점
요청에 따라 어떤 처리를 할지 결정을 Service에 넘긴다
그후 Service에서 실질적으로 처리한 내용을 View에 넘겨준다

그럼 Service는 MVC 패턴 중 어디에 해당할까?

서비스는 MVC 패턴에서 모델(Model)과 컨트롤러(Controller) 사이의 중간 역할을 하는데

네? ㅠㅠ
그러면 구조가
뷰 - 컨트롤러 - 서비스 - 모델 정도일까?


이렇다고 합니다~ 확실히 조금 더 이해가 되는 부분이 있네요
하지만 API를 처리하지 않는 컨트롤러는 어떤 역할을 하는지 다시 궁금해졌다

비웹 애플리케이션의 컨트롤러 역할:
비웹 애플리케이션에서도 컨트롤러의 역할은 비슷하지만 
웹 애플리케이션과는 다른 환경에서 동작합니다. 
예를 들어, 데스크톱 애플리케이션, 명령행 도구 또는 서버 애플리케이션의 경우에는 
다음과 같은 작업을 수행할 수 있습니다:

명령 처리: 사용자 또는 다른 시스템으로부터 받은 명령을 처리하고 그에 따른 작업을 수행합니다. 
예를 들어, 파일 처리, 데이터 동기화, 알림 전송 등의 작업을 수행할 수 있습니다.

데이터 처리: 데이터를 가져오고 수정하며, 데이터베이스 또는 외부 서비스와 상호작용하여 
데이터를 저장하거나 검색합니다.

비즈니스 로직 처리: 비즈니스 규칙 및 프로세스를 수행하며, 
모델을 조작하거나 데이터의 가공을 처리합니다.

응답 생성: 최종적으로 사용자 또는 다른 시스템에 대한 응답을 생성하고 반환합니다. 
이 응답은 파일, 메시지, 상태 업데이트 또는 다른 형식일 수 있습니다.

컨트롤러는 MVC 패턴에서 중요한 부분으로, 
입력 처리 및 비즈니스 로직 처리를 담당하며 모델과 뷰 간의 중재 역할을 합니다. 
그러므로 애플리케이션의 사용 사례와 환경에 따라 컨트롤러의 역할이 다양하게 변화할 수 있습니다.

챗 지피티와 토론을 해 보았습니다
답변을 들어서 조금 이해도 가는 것 같지만? 아직도 어려운 부분이 존재하네요
그래! 나는 각 구조의 명확한 차이점을 알고 싶었던 거구나!

빨리 설명해 줘

그러니까 각 객체가 될 수 있는 것들은 전부다 모델이 되는 게 아닐까?
예를 들어 사람 -> 키 몸무게 먹기 달리기 등은 모두 객체가 갖고 있어야 하는 정보인 것이다

컨트롤러는 입력을 받고...
이번에는 사람에게 과자를 먹이라는 지시를 받았으면 사람의 과자 먹이기 함수를 꺼내서 이행하는 역할을 해 주는 것 같다
이때 과자를 먹였으면 체중 증가가 이루어져야 하니 체중 증가 함수를 또 모델에서 갖고 오고 이런 식인 듯함

그렇다면 뷰는?
체중 증가한 사람이 살이 더 붙은 모습을 보여준다!
어느정도 이해가 된 듯함~

그럼 이제 다시 하던 코드 분석을 마저 하러 가보겠습니다
다시 이해가 안 되면 추가하러 올 수도

profile
💻 늘 공부하고 발전하는 개발자

0개의 댓글