본문 바로가기

Java/Spring

스프링의 MVC 구조와 기본 개념

이 문서의 내용

    더보기

    MVC는 웹 애플리케이션을 개발할 때 사용하는 디자인 패턴입니다.

    애플리케이션의 개발 영역을 크게 모델(Model) 뷰(View) 컨트롤러(Controller)로 구분하고 각 역할에 맞는 개발을 요구합니다.

    MVC 패턴을 도입했을 때의 가장 큰 장점은 UI와 도메인(비즈니스 로직) 영역을 독립적으로 개발 할 수 있다는 점입니다.

    모델(Model)

    Spring MVC 기반의 웹 애플리케이션은 클라이언트의 요청이 들어오면 비즈니스 로직을 수행합니다.

    이때 클라이언트에게 알려주기 위한 로직의 수행 결과를 저장하는 데이터를 모델이라고 부릅니다.

    뷰(View)

    모델을 사용하여 웹 브라우저에서 처럼 눈에 보이는 리소스(Resource)를 제공하는 역할을 합니다.

    Spring MVC에서는 다음과 같은 뷰 기술이 포함됩니다.

    • HTML 페이지 출력
    • PDF, Excel 등의 문서 포멧으로의 출력
    • XML, JSON 등의 데이터 전송 포멧으로의 변환 등

    컨트롤러(Controller)

    클라이언트의 요청을 직접적으로 수신하는 앤드 포인트(Endpoint)입니다.

    따라서 요청에 대한 비즈니스 로직을 수행하고 모델을 생성뷰에 전달하는 중간 다리 역할을 합니다.

    MVC1과 MVC2

    지금의 MVC 디자인 패턴은 MVC1 그리고 MVC2에서 발전된 형태입니다.

    초기의 MVC1 디자인 패턴은 클라이언트의 요청이 들어오면 모델 객체(자바 빈)를 뷰(JSP)에 담아서 응답하는 형태였습니다.

    MVC1에서는 JSP가 뷰와 컨트롤러 역할을 동시에 수행해 JSP 페이지에서 너무 많은 코드가 관리되었습니다.

    이는 가독성, 생산성을 저하시키고 유지 보수 비용이 높아지는 문제가 있었습니다.

    이러한 점을 보안한 것이 서블릿(Servlet)을 사용한 MVC2입니다.

    더보기

    서블릿은 자바에서 클라이언트 요청 처리를 위해 특정 규칙으로 작성된 클래스 파일입니다.

    웹 페이지의 다양한 요청과 그에 따른 응답을 쉽게 구현하고, 응답 과정에서 동적 웹 페이지(Dynamic web page)를 구성할 수 있도록 도와줍니다.

    MVC2에서는 컨트롤러 역할을 분리하고 서블릿이 이를 대신하는 형태로 발전합니다.

    컨트롤러(서블릿)는 비즈니스 로직을 처리하고 이를 JSP에 반영합니다.

    스프링 MVC

    MVC2를 더 발전시킨 형태가 스프링 프레임워크에서의 스프링 MVC입니다.

    스프링 MVC에서는 프론트 컨트롤러(Front controller) 개념이 추가되었습니다.

    프론트 컨트롤러는 클라이언트의 요청을 최우선적으로 수신하며 실제 요청을 처리하기 위한 별도의 컨트롤러로 요청을 분배합니다.

    이때 실제 요청이 분배되어 비즈니스 로직을 수행하는 컨트롤러를 핸들러(Handler)라고 부릅니다.

    단계 비고
    1 핸들로 조회 핸들러 매핑을 통해 URL에 매핑된 핸들러(컨트롤러)를 조회합니다.
    2 핸들러 어댑터 조회 핸들러를 실행하는 핸들러 어댑터를 조회합니다.
    3 핸들러 어댑터 호출 핸들러 어댑터를 실행합니다.
    4 핸들러 호출 핸들러 어댑터에 의해서 실제 핸들러(컨트롤러)가 실행됩니다.
    5 ModelAndView 반환 핸들러 어댑터에 의해서 실제 핸들러(컨트롤러)가 반환한 정보를 ModelAndView로 변환하여 반환합니다.
    6 뷰 리졸버 호출 뷰 리졸버를 찾고 실행합니다.
    7 뷰 반환 뷰 리졸버에 의해서 뷰의 논리 이름을 물리 이름으로 변환하고 뷰 객체를 반환합니다.
    8 뷰 렌더링 뷰를 렌더링합니다.
    더보기

    ModelAndView는 핸들러(컨트롤러)에 의해서 반환되며 모델(Model)과 뷰(View)가 래핑(Wrapping)된 객체입니다.