[WEB] MVC 패턴을 쓰는 이유 | 모델1 vs 모델2

MVC 패턴은 매우 널리 사용되는 소프트웨어 디자인 패턴이다. MVC는 모델(Model), 뷰(View), 컨트롤러(Controller)를 의미한다. 각각은 비즈니스 로직과 프레젠테이션 로직, 데이터를 나누어서 처리한다. 쉽게 말해 연산을 하는 업무와 사용자가 보는 화면을 만드는 업무를 분리해서 처리하는 방식이라고 볼 수 있다. 이 패턴은 코드의 양이 많아져도 유지 보수가 편하고 확장 역시 용이한 장점이 있다. 컨트롤러로의 중앙화가 이루어지는 점도 주요 특징이다.

Model1 vs Model2

Model1

출처: javatpoint

웹 애플리케이션 개발 패턴은 크게 모델1과 모델2 두 가지다. 통상 교육과정을 통해 웹 프로그래밍을 배우면 모델1부터 배운다. 모델1은 구조가 비교적 간단하고 코드가 좀더 직관적으로 읽히기 때문인 거 같다.

 

모델1은 JSP에서 요청을 처리하고 뷰도 생성한다. 두 가지를 동시에 하기 때문에 JSP 파일 코드를 보면 HTML과 <% %> 표현식을 통한 자바 코드가 뒤섞인다. 이런 코드는 짧으면 직관적으로 보일 수도 있지만 길어질수록 가독성이 안드로메다로 가버리는 단점이 있다. 또 뷰를 변경하려고 하면 여러모로 손이 많이 간다. 유지 보수가 불편하다.

Model2

출처: javatpoint

앞서 언급했듯 MVC 패턴은 모델(M), 뷰(V), 컨트롤러(C)로 나뉘어 작업을 처리한다. MVC 패턴을 웹 애플리케이션 개발에 적용시킨 게 모델2다. 참고로 일각에서 모델1과 모델2 대신 MVC1, MVC2 등으로 용어를 사용하는 경우가 있는데(검색하면 블로그에 꽤 많이 나온다) 이는 잘못된 표현이다. MVC의 약자가 뭔지만 생각해봐도 그 뒤에 1, 2를 붙이는 게 이상하다는 걸 알 수 있다.

 

MVC 패턴은 컨트롤러에서 모든 요청(requests)을 처리하는 중앙화 방식으로 작동한다. 컨트롤러에서 요청을 처리하고 결과를 보여주는 JSP로 이동한다. 때문에 프로젝트 폴더 내에서도 Java 파일인 컨트롤러를 실행해야 처리 후 결과를 보여주는 JSP를 정상적으로 출력한다.

 

각각의 역할은 이렇다.

  • Controller : 뷰와 모델 사이에서 인터페이스의 역할을 한다. 모든 requests를 처리한다. 요청을 받으면 그에 맞는 모델을 수행한다.
  • Model : 프로그램의 데이터를 표현한다. 값을 저장하고 JSP로 반환해준다.
  • View : 사용자가 보는 화면을 만든다(JSP).

이처럼 비즈니스 로직과 프레젠테이션 로직, 데이터를 분리함으로써 코드 수정시에도 일부만 문제없이 바꿀 수 있는 환경이 마련된다. 코드 유지보수가 유리하다. 코드량이 많아질수록 효용이 높은 패턴이다.

왜 컨트롤러를 servlet으로 만들까?

컨트롤러는 서블릿으로 만든다. 서블릿이 웹 요청을 처리할 수 있기 때문이다. 컨트롤러 역할을 하는 클래스는 HttpServlet를 상속(extends) 받는다. HttpServlet에는 여러 메서드가 있는데, 그중 요청을 처리하는 doGet(request, response){}doPost(request, response){}가 핵심이다. 객체를 생성해주는 init() 역시 필수로 사용된다.

 

최초 요청시에는 init 메서드가 객체를 생성하고 요청 형태에 따라 doGet 또는 doPost 메서드가 수행된다. 객체가 한번 생성되고 난 이후에는 init()을 넘기고 곧장 요청을 수행한다.

 

서블릿은 mapping을 해줘야 한다. 서블릿 매핑은 클라이언트가 제공한 URL에 대해 Java 서블릿이 호출돼야 하는 웹 컨테이너를 지정하는 작업이다. 사용자가 요청을 했을 때 어떤 애플리케이션에 전달할지 결정한다. 매핑 방법은 두 가지다.

1. 어노테이션 활용

@WebServlet(urlPatterns = "/helloworld")

이처럼 컨트롤러 클래스에 코드를 작성한다. 위 코드는 URL 주소가 /helloworld로 끝나면 해당 서블릿 클래스가 동작한다는 의미다. 서블릿 어노테이션의 종류는 단순하게 URL 하나만 적는 것 외에도 여러 가지가 있다. 참고: Java Servlet @WebServlet Annotation Example

2. web.xml에 코드 삽입

<servlet>
    <servlet-name>이름</servelt-name>
    <servlet-class>서블릿 클래스명</servlet-class>
</servlet>

<servlet-mapping>
    <servlet-name>이름</servlet-name>
    <url-pattern>url패턴</url-pattern>
</servlet-mapping>

 

반응형

댓글

Designed by JB FACTORY