ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링MVC -관심사의 분리
    Web/Spring 2023. 3. 4. 12:53

     

     

    스프링MVC패턴이란?

     

    스프링 MVC패턴은 Model-View-Controller로 각각의 역할을 분담하여 요청을 처리하는 것을 의미한다.

    Model은 데이터, View는 화면, Controller는 model과 view사이 처리를 담당하여 클라이언트 요청을 처리하게된다.

    출처:클라우드 스터딩 https://cloudstudying.kr/lectures/235

    그렇다면 어떤 기준으로 MVC패턴을 만드는 것 일까? 

    먼저 간단한 코드를 통해 관심사에 따라 전체 코드를 분리해서 생각해보도록 하자.  

    여기서 관심사는 각 코드 혹은 메서드등이  처리해야할 일이다. 크게 입력, 처리, 출력 나누어 생각해 볼 수 있다.

     

    *관심사의 분리는 객체지향 설계 SOLID원칙의  S(SRP)에 따라  담당하는 기능을 기준으로 클래스(객체)를 분리하여 프로그램의 유지보수성을 높이기 위한 기법에서 나온 것이다.  단일책임원칙에 의하면, 관심사나 중복코드 등을 기준으로 클래스를 분리한다. 

     

    아래코드를 보자

     

    url에 쿼리스트링으로 이름과 나이와 하고싶은말 정도를 치면, 띠를 계산해서 화면에 출력해주는 간단한 코드이다.

    위 코드를 보면 컨트롤러로 등록된 하나의 클래스의 main메서드에서  3개의 관심사를 모두 처리하는 것을 볼 수 있다.

    이제 이 코드를 입력,처리, 출력으로 분리해보자

     

    -입력

    HttpServletRequest객체로 받아와서 사용에 알맞게 변환했던 것과 다르게, 이처럼 URL호출에서 전달받을 매개변수를 입력해 둘 수 있다. 

    이러한 입력의 과정이 가능한 이유는 스프링이 dispatcherServlet을 이용하여 제공하는 하나의 기능때문이다. 

    스프링이 제공해주는 기능에 의해 처음과 비교해보면, 컨트롤러에서 따로 입력을 처리하기 위한 코드를 제거할 수 있게 되었다!

     

    *이러한 입력이 가능한 이유와 매개변수를 자동으로 변환해주는 과정은 추후에 살펴볼 것이다.  

     

    -처리  

    이제 컨트롤러는 들어온 입력에 대한 변환등과 같은 과정없이, 적당하게 처리만 해면 된다. 

     

    -출력 

    출력을 위한 jsp페이지
    기존 출력을 위한 부분은 이제 필요없다 주석처리

    출력의 부분을 jsp문서로 만들었다. 이 jsp페이지가 화면 출력을 담당할 것이다. 컨트롤러에서 입력받고 처리한 변수들을 ${여기}(EL)에 담아서 화면에 출력할 것이다.  

     

    근데 여기서 문제가 하나 있다. jsp페이지와 controller는 한 클래스 파일에 적혀있는 것이아니라 물리적으로 분리되어있다. 

    (jsp페이지의 저장위치는 sts 기본설정을 기준으로 src/main/webapp/WEB-INF/views이다 )

    그렇다면 어떻게 jsp페이지에서 controller에 한 메서드의 지역변수를 사용할 수 있는 것일까?

    그 이유는 Model 덕분이다.

    view와 controller 사이에서  Model은 controller에서 입력받은 데이터나, 처리한 데이터 등등을 view에 전달하는 역할을 수행한다.

     

    다음을 살펴보자

    모델은 map의 형태로 데이터를 저장한다. 위와 같이 컨트롤러에서 모델에 데이터를 담아서 뷰에 전달하는 것이다.

    처음 main함수와는 다르게 main함수의 리턴값이 view의 이름인데, 이렇게 지정해두면 스프링이 이를 보고 view를 찾아준다. 

     

    *Model은 dispatcherServlet영역에서 객체를 생성해서 컨트롤러의 매개변수로 넘겨주기 때문에 컨트롤러는 view이름만 return하면 된다. 

    처음 코드와 비교했을 때, 훨씬 깔끔해진 모습이다. 아주 간단한 코드임에도 불구하고 MVC패턴이 가진 강점을 한 눈에 볼 수 있다.

     

    이처럼 메서드의 코드를 관심사에 따라 분리는 과정을 따라가다보니 Model과 View그리고 Controller를 사용하게 되었다. 

    MVC의 개념은 그리 대단히 어려운 것은 아니다. 단지 하나의 web app을 작성하는 과정에서

    1. 중복코드를 제거하고 

    2. 비지니스 로직과 UI로직을 분리하여 유지보수를 독립적으로 수행할 수 있도록 하여 유지보수성을 높이고

    3. 유연하고 확장성을 높이는 애플리케이션의 개발 

    등의 노력의 산물로 탄생한 것이다. 

     

     

     

     

    출처: http://wiki.gurubee.net/display/DEVSTUDY/01.DispatcherServlet

    다음은 스프링에서 mvc패턴의 흐름을 한 눈에 볼 수 있는 그림이다.

     

    1 -요청이 오면 dispatcherServlet이 입력을 받는다.

    2- 요청된 URL에 따라 클라이언트 요청을 처리할 controller를 mapping하고 

    3- 받은 요청을 매핑된 메서드의 매개변수의 타입등을 고려하여 적절하게 변환과정을 처리한 후 요청을 넘겨준다.

    4- 컨트롤러 내부에서 적절한 처리를 수행한 뒤에 모델의 그 결과를 담아서 다시 view이름과 함께 

    dispatcherServlet에 넘겨준다.

    5- dispatcherServlet은 넘겨받은 view이름을 ViewResolver에게 전달해서 정확한 view의 경로를 다시 전달 받고, 

    view를 찾아간다.

    6-view는 전달받은 model의 데이터를 이용해 적절한 출력을 처리해서 클라이언트에게 응답한다.

     

     

    *참고 viewResolver는 sts기준(기본설정) src/main/webapp/WEB-INF/spring/servlet-context.xml에서 찾아 볼 수 있다.

    매핑된 메서드가 view이름을 return하면 적절한 접두사와 접미사를 설정해주는 것을 볼 수 있다!  

     

     

     

     

     

    **남궁성님의 spring강의를 듣고 제 나름대로 정리한 내용입니다. 예제 코드등은 강의 내용과 다릅니다.

     

    **나중에 다시 보기 위해서 + 기록하는 습관을 기르기 위해 적어둔 내용입니다. 

Designed by Tistory.