ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 MVC -간단한 코드로 보는 원리
    Web/Spring 2023. 3. 4. 15:44

    https://j-d-i.tistory.com/4

     

    스프링MVC -관심사의 분리

    스프링MVC패턴이란? 스프링 MVC패턴은 Model-View-Controller로 각각의 역할을 분담하여 요청을 처리하는 것을 의미한다. Model은 데이터, View는 화면, Controller는 model과 view사이 처리를 담당하여 클라이언

    j-d-i.tistory.com

    앞선 글에서 스프링MVC를 간단하게 살펴보았다. 위 글에서 다루지 않은 

    dispatcherServlet이 클라이언트 요청을 처음으로 받고 처리하는 과정

    특히, 요청을 받고 매핑된 메서드에 매개변수에 맞게 적절하게 자료형을 변환하는 과정등을 살펴보자

    스프링이 내부적으로 처리해주는 기능이긴 하지만, 알고나면 조금이나마 스프링을 이해하고 활용하는데 도움이 될 수도 있다. 

     

     

    *실습 전 

    -설정1  javac로 컴파일 했을 때, .class파일에 매개변수명이 그대로 등록되도록 처리해야 한다. (javac -parameter 옵션의 사용)

     

     sts에서 JRE를 java 1.8이상으로 업데이트 해야한다.

    -> pom.xml 파일을 설정하도록 하자 <java-version>과 maven-compiler-plugin의 <source>와 <target>

    ->업데이트 후에 sts preferences에 compiler에 Store information about method parameters 옵션을 켜주자

     

    -설정 2 @WebServlet을 사용하기 위해 프로젝트에 라이브러리를 추가해야한다. (혹은 pom파일 수정)

    프로젝트 - buildpath -> configure Build path ->Classpath -> addLibrary ->sever runtime ->apache tomcat 9.0

     

     

     

    -Dispatcher만들기 1

    자바코드로 dispatcherServlet을 간단하게 작성해 보았다. 

    여기서 dispatcherServlet의 기능은 다음과 같다.

     

    1. 클라이언트 호출에 따라 적절히 매핑된 컨트롤러와 메서드를 확인한다. 

         클라이언트 호출을 받은 것은 아니지만, 일단 basic1 컨트롤러로 요청이 왔다고 가정해보자

        -Class객체를 이용해서 basic1의 이름으로 작성된 컨트롤러의 정보를 담아왔다.

        -Reflection API를 사용해 basic1의 main메서드의 정보를 담아왔다.

     

    2. 모델 객체를 생성한다 

        Model의 구현체는 BindingAwareModelMap()이다.  

     

    3. 요청에 따라 메서드 매개변수에 요청받은 사항을 전달하고 viewname을 얻어온다.

        main.invoke메서드를 이용해 하드코딩으로 매개변수를 전달했다.

     

    4. 받은 view이름과 main메서드(컨트롤러)를 통해 꽉꽉 채워진 model을 이용해 출력작업을 한다.

     

     다음은 view메서드의 내부이다. 넘겨받은 view이름에 정확한 path를 적용해서 jsp파일을 불러온 뒤

    한 줄씩 읽고나서 Model에 key-value와  jsp EL을 적절히 교체하여 결과를 출력한다.

     

    다음은 콘솔에 출력된 결과이다.

    jsp의 내용에 model에 저장된 값이 적용된 결과가 잘 출력되었다. 

     

    아직 미흡한 점이 존재하는데 

    1. main메서드에 매개변수를 직접 입력함 

    2. 클라이언트 요청 - main의 매개변수 사이에서 변환 작업을 한 적 없다.

    3. 결과가 콘솔에 출력된다.

     

    이 중에 일단 먼저 1번과 2번을 해결해보자.

     

    -Dispatcher 만들기 2

    원래의 코드에서 

     

    1.Map을 이용해 요청을 받고 

     

    2. Parameter[]와 Objcet[]를 추가하여 main메서드의 매개변수배열과 최종으로 전달할 값을 담을 배열을 만들고

     

    3. for문을 돌면서 main메서드의 매개변수와 Map을 통해 요청받은 값을 비교              

       3.1 매개변수명이 Map에 key와 일치하는가? 

       3.2 매개변수로 Model이 있는가?

       3.2 매개변수 타입과 Map에 저장된 value의 타입이 일치하는가? 

     

    4. for문을 통해 적절히 변환된 요청 값이 담긴 배열 arr을 최종적으로 main메서드에 넘겨서 view이름을 얻어온다.

     

    convert메서드의 내용은 다음과 같다. 

    크게 어려운 내용은 없다. 타입이 일치한다면 value를 다시 내보내고 아니라면, 변환해서 내보내는 것이다. 

    우리가 MVC패턴 관심사의 분리에서 

    입력을 처리하기 위해 HttpServletRequest객체 대신 사용했던 이 간단한 한 줄을 위해 

    Dispatcher가 열심히 뛰고 있었다! 

     

    마지막 3번을 해결하기 위해  코드를 대폭 수정해보도록 하자.

     

    -Dispatcher 만들어보기 마지막 

     

    -결과

     

    @WebServlet으로 DispatcherServlet을 조금 구현해 보았다.

    대부분 비슷하지만, 브라우저에 결과를 보여주기 위해 여러가지 추가되었다.

     

    클래스가 HttpServlet을 상속받고,

    service()을 오버라이딩했으므로 고정적이다. 나머지 내용은 전과 크게 다르지 않은데

    다만 request.parameterMap()으로 전달받은 값은 request객체 내에서 value가 String[]으로 저장되는데,

    그 이유는 쿼리가 name=??&name=??&name=??등으로 같은 key에 여러 값이 요청될 수 있기 때문이다.

    따라서 main메서드의 매개변수와 타입을 확인하는 과정에서 value를 String[]으로 형변환하였다.

     

    또한, view의 path를 정확하게 얻어와야해서 getViewRealName()을 사용하였고, response를 사용해서 

    화면에 출력하기 전에 인코딩 방식과 contentType을 설정해주어야 해서 코드가 추가 되었다.

     

    이렇게 한번 dispatcherServlet을 만들어 보았다. 만드는 과정에서 그냥 MVC를 사용했을 때 보이지 않았던, 내부적인 처리 과정을 체험해 볼 수 있었다. 

     

     

     

     

     

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

     

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

     

    'Web > Spring' 카테고리의 다른 글

    Spring MVC01 - 스프링 동작 절차  (0) 2023.06.28
    Spring MVC01 - DB연결하기  (0) 2023.06.28
    Spring (1) - 기존 servlet-jsp와 차이점  (0) 2023.06.28
    스프링 - 간단 용어들 정리  (0) 2023.03.05
    스프링MVC -관심사의 분리  (0) 2023.03.04
Designed by Tistory.