JAVA

MVC 패턴, MVC 패턴의 한계

yujin0517 2024. 2. 8. 13:20

목차

  1. MVC 패턴 등장 배경
  2. M, V, C의 역할
  3. 기본적인 동작
  4. MVC 패턴의 한계

 


 

MVC 패턴 등장 배경

서블릿과 JSP만으로 개발을 진행하면 비즈니스 로직과 뷰 화면 렌더링이 모두 하나의 코드에서 처리된다. 

결과적으로 코드의 유지 보수가 어려워진다. 

때문에 서블릿의 장점과 JSP의 장점을 살려 MVC 패턴이 등장했다. 

서블릿은 컨트롤러 역할을 담당하고, JSP는 뷰 역할을 담당한다. 

MVC 패턴을 사용함으로써 비즈니스 로직을 수정하는 일과 뷰 화면을 수정하는 일은 각각 다르게 발생하고, 서로에게 영향을 주지 않는다. 

 


 

Model, View, Controller 역할

  • Model

뷰에 전달할 데이터를 담아둔다.

  • View

JSP 역할, 모델에 담겨있는 데이터를 사용해서 화면을 그리는 역할을 한다. (HTML 생성)

  • Controller

서블릿 역할, 클라이언트 요청을 받아 파라미터를 검증하고, 비즈니스 로직을 실행한다. 뷰에 전달할 결과 데이터를 조회해서 모델에 담는다.

 


 

기본적인 동작

  1. 클라이언트가 컨트롤러 로직 호출
  2. 호출된 컨트롤러 로직은 비즈니스 로직의 서비스 계층에 요청을 전달
  3. 비즈니스 로직의 서비스 계층은 요청을 받아 레포지토리 계층으로부터 데이터 찾기
  4. 찾은 데이터는 다시 컨트롤러 로직에 전달
  5. 컨트롤러는 데이터를 모델에 전달
  6. 뷰 로직은 모델의 데이터 참조
  7. 뷰 로직은 화면으로 응답 

 

컨트롤러와 비즈니스 로직을 하나로 합쳐도 되지만, 그렇게 되면 컨트롤러의 역할이 너무 커진다. 컨트롤러의 역할을 줄여 본인의 작업에 집중하도록 하였다. 

비즈니스 로직도 서비스 계층과 레포지토리 계층으로 구분되어 있다. 컨트롤러는 서비스 계층을 호출하여 요청에 필요한 데이터를 요청한다. 

서비스 계층은 요청을 받아 레포지토리 계층에 데이터를 요청하고, 레포지토리 계층은 데이터베이스에서 해당 데이터를 가져와 서비스 계층에 반환한다.

이렇게 컨트롤러와 비즈니스 로직은 서로 데이터를 주고받기 때문에 비즈니스 로직 코드가 변경되면 컨트롤러 코드도 변경될 수 있다. 

 


 

MVC 패턴의 한계

MVC 패턴을 적용함으로써 컨트롤러의 역할과 뷰 화면의 역할을 구분할 수 있다. 

하지만 뷰 화면으로 이동하는 코드를 항상 호출해야 한다. 이 부분을 메소드로 공통화해도 되지만 이 메소드로 항상 호출해야 한다. 

RequestDispatcher dispatcher = request.getRequestDispatcher(viewPath);
dispatcher.forward(request, response); //다른 서블릿이나 jsp로 이동하는 메소드

viewPath도 경로가 중복되어 작성되는 경우가 많다. 뷰 코드의 확장자도 동적으로 변경할 수 있도록 경로를 작성해야 한다. 

String viewPath = "/WEB-INF/views/new-form.jsp"

/*
	new-form이라는 뷰 코드의 이름 말고는 고정적으로 사용 -> /WEB-INF/views/ 등의 경로는 반복적으로 적어줄 필요x
    jsp 코드로 뷰 화면을 작성하지 않을 수도 있기 때문에 동적으로 변경하도록 해야됨 
    위의 코드의 경우 뷰 화면 코드를 jsp가 아닌 thymeleaf로 변경할 경우, .jsp가 들어간 모든 코드를 수정해야됨
*/

그리고 요청에 대한 응답을 뷰 화면으로 하기 때문에 Response 객체를 사용하지 않는다. 하지만 service 메소드에서는 HttpResponse 객체를 파라미터 값으로 받고 있다. 

MVC 패턴의 한계 중에 가장 큰 문제는 공통 처리가 어렵다는 점이다. 

기능이 복잡해질수록 컨트롤러에서 공통 처리해야 할 코드가 많아진다. 공통 코드를 메소드로 처리할 수 있지만 계속 메소드를 호출해야 하고, 실수로 호출하지 않을 경우 기능이 제대로 작동하지 않는다. 

공통 처리 문제를 해결하기 위해서는 컨트롤러 호출 전에 먼저 공통 기능을 처리해야 한다. 즉, 수문장의 역할이 필요하고 프론트 컨트롤러(Front Controller) 패턴을 적용하여 이 문제를 해결할 수 있다. 

'JAVA' 카테고리의 다른 글

[Java] 인터페이스(Interface)  (0) 2024.02.13
JSP와 서블릿(Servlet) 그리고 MVC 패턴  (1) 2024.02.06
스레드 풀(Thread Pool)과 Executor  (0) 2024.01.31
스레드(Thread)  (1) 2024.01.27
소수 찾기, 구하기  (0) 2023.02.01