1. MVC란?
MVC는 디자인 패턴이다. 디자인 패턴이란 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 그 방법에 이름을 붙여서 이후에 재사용하기 좋은 형태로 특정 규약을 만들어서 정리한 것을 의미합니다. 즉 과거의 노하우를 통해 발견해낸 "효율적인 코드를 만들기 위한 방법론"을 의미합니다.
Model은 데이터와 관련된 일(데이터를 가져오고 설정하는 등)을 처리합니다. 데이터베이스가 아니라 프로세스가 동작중일 때 메모리 안에 데이터가 있는 상태를 의미합니다.
Controller는 Model과 View의 중개자 역할을 한다. 뷰와 모델을 변경시키는 로직들이 들어갑니다.
View는 사용자한테 보여지는 부분(HTML, CSS 등)을 담당합니다.
이처럼 기능 별로 코드를 분리하여, 하나의 파일에 코드가 모이는 것을 방지하여 가독성과 코드 재사용성이 증가하여 유지보수에 용이합니다. 또한 여러 디자인 패턴 중에서 단순한 편이라 많이 쓰이는 방식입니다. 다만 컨트롤러에 소스코드가 집중되는 경향이 있어 프로젝트 규모가 커진다면 컨트롤러가 비대해지는 문제가 발생할 수 있습니다. 뷰와 모델의 의존성이 다른 디자인패턴에 비해서 높은 편이라 이 부분에 대한 유지보수가 어렵다는 문제가 발생할 수 있습니다.
이러한 MVC는 크게 MVC1과 MVC2로 구분됩니다.
1-1. MVC1
MVC 모델 1은 뷰와 컨트롤러의 역할이 합쳐져 있다.
흔히 웹 개발을 하면 Jsp가 뷰 역할을 하는데, MVC 1에서 Jsp는 뷰와 컨트롤러의 역할을 모두 감당한다.
위와 같이 Jsp가 뷰와 컨트롤러 역할을 모두 수행하면, Jsp에 Java 코드와 Html, css 등의 코드가 섞여 있어, 소스가 복잡해지고 읽기가 어려워져 유지보수가 힘들어 진다.
하지만 상대적으로 설계가 간단하여 개발 속도가 빠르고 작은 프로젝트에 알맞다.
1-2. MVC 모델 2
MVC 모델 2은 모델 1에서 유지보수가 힘들다는 단점을 보완하기 위해 나온 모델이다.
기존에 뷰와 컨트롤러의 역할을 모두 수행하던 JSP는 뷰의 역할만 하게 하고, 대신 컨트롤러 역할을 Servlet이 수행한다.
모델은 기존 MVC 1 방식과 동일하다.
MVC 1에서는 Jsp가 사용자의 호출을 받아줬는데 MVC 2에서는 컨트롤러 역할을 수행하는 Servlet이 요청을 받아준다.
Servlet이 비즈니스 로직을 수행하며 모델을 호출하여 데이터를 요청하며, 최종적으로 뷰 역할인 Jsp를 제어하여 화면을 출력한다.
MVC 2로 개발하게 되면 Controller역할과 View 역할이 분리되어 확장에 용이하고 유지보수가 수월해진다.
Jsp는 Java 코드를 안 쓰는 대신 JSTL(자바코드를 html태그형식으로 간편하게 사용하기 위해 나온 라이브러리)을 사용하여 결과 화면을 보여준다.
하지만 초기 설계단계에 비용이 많이 들어 개발 시간이 오래 걸린다는 단점이 있다.
이러한 MVC2 패턴을 기반으로 Spring MVC가 등장한다.
2. Spring MVC 기본 구조
전체 흐름은 다음과 같다.
2-1. 사용자가 URL을 통해서 Request를 전송한다.
2-2. DispatcherServlet은 Request를 처리하기 위한 Controller를 HandlerMapping 빈 객체에게 검색 요청 한다.
2-3. HandlerMapping은 Client의 URL을 이용해서 이를 처리할 Controller 빈 객체를 DispathcerServlet에게 return한다.
2-4. DispathcerServlet은 Controller 객체를 처리 할 수 있는 HandlerAdapter 빈에게 요청 처리를 위임한다.
2-5. HandlerAdapter는 Controller에게 알맞은 method를 호출한다(Controller 실행).
2-6. Controller는 비즈니스 로직을 수행 한 후 처리 결과를 HandlerAdapter에게 return 한다.
2-7. HandlerAdapter는 DispatcherServlet에게 Controller의 실행 결과를 ModelAndView 객체로 변환 하여 return 한다.
2-8. DispatcherServlet은 결과를 보여줄 View를 검색하기 위해 ViewResolver 빈 객체에게 ModelAndView안의 해당 View를 검색 요청한다.
2-9. ViewResolver는 ModelAndView안의 View 이름에 해당하는 View객체를 찾거나 생성해서 return 한다.
2-10. DispatcherServlet은 ViewResolver가 return한 View 객체에게 request result 생성을 요청한다.
2-11. View 객체는 JSP를 사용하는 경우 JSP를 실행하여 result를 Rendering한 후 Client에게 Rendering된 View를 응답한다.
3. MVC를 잘 지키면서 코딩하는 방법
3-1. Model은 View와 Controller에 의존해서는 안된다. 즉, Model내부에 View와 Controller에 대한 내용이 존재해서는 안된다.
3-2. View는 Model에만 의존해야하고 Controller에는 의존하면 안된다.
3-3. View가 Model로부터 데이터를 받을때는 사용자마다 다르게 보여줘야 하는 데이터만 받아야한다. 즉, View는 사용자마다 일관되게 보여줘야 하는 UI(View가 자체적으로 가지고 있는)와 다르게 보여줘야하는 Model의 합과 같다.
3-4. Controller는 Model과 View에 의존할 수 있다. 둘의 중개자니깐.
3-5. View가 Model로부터 데이터를 받을때는 반드시 Controller를 통해서만 받는다.
참고: https://velog.io/@gillog/Spring-MVC-%EA%B5%AC%EC%A1%B0
'웹 > 스프링' 카테고리의 다른 글
AOP란? 프록시 패턴이란? 스프링 AOP란? @Transactional 원리 (0) | 2022.06.03 |
---|---|
IOC란? IOC 컨테이너란? DI란? DI 방법 (0) | 2022.06.02 |
RedisTemplate 사용해서 Redis 이용하기 (0) | 2022.04.18 |
Spring Boot에서 통합 테스트코드 구현하기(JUnit5 + Mockito) (0) | 2022.04.17 |
SQL이란? MVC란? (0) | 2022.02.06 |