MVC 구조를 이용한다.


먼저 Spring Framework의 생명주기, 쉽게 말하면 돌아가는 순서를 알아야한다.



이미지 출처 : https://terasolunaorg.github.io/guideline/1.0.1.RELEASE/en/Overview/SpringMVCOverview.html



위 그림을 Spring Framework의 생명주기라고 하는데


쉽게 말해서 그냥 돌아가는 구조를 말한다.


간단하게 Client(사용자) - Dispatcher Servlet - Controller - Service - Dao 순서로 흘러간다.


그리고 중간에 Dispatcher Servlet은 Handler Mapping의 도움을 받아 해당하는 Controller(맵핑주소)를 찾고


Controller는 DB를 조회하던 무었이던 설정해둔 코딩 그대로 역할을 하고


View로 사용자에게 결과를 리턴해준다.


해당하는 View를 찾아주는 기능은 View Resolver라고 한다.





큰 틀은 Client(사용자) - Dispatcher Servlet - Controller - Service - Dao 순서로 돌아가는데


그 외의 도움을 주는 기능들 Dispatcher Servlet, Handler Mapping, View Resolver 등을 우리가


XML 설정 파일을 이용해 설정해두어야 정상적으로 작동한다.







먼저 Java 파일의 소스를 살펴보자.


맨 처음 프로젝트를 생성 했을 때 있는 HomeController.java 파일이다.


import java.text.DateFormat;
import java.util.Date;
import java.util.Locale;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;

@Controller
public class HomeController {
   
    private static final Logger logger = LoggerFactory.getLogger(HomeController.class);
   
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String home(Locale locale, Model model) {
        logger.info("Welcome home! The client locale is {}.", locale);
       
        Date date = new Date();
        DateFormat dateFormat = DateFormat.getDateTimeInstance(DateFormat.LONG, DateFormat.LONG, locale);
       
        String formattedDate = dateFormat.format(date);
       
        model.addAttribute("serverTime", formattedDate );
       
        return "home";
    }
   
}


Logger 부분은 로그 남기는 부분으로 나중에 따로 게시



먼저 @, 어노테이션을 보자.


@Controller = Spring Framework가 이 파일이 Controller인지 알기 위한 어노테이션


@RequestMapping = 핸들러 맵핑이 @RequestMapping가 써있는 메소드를 미리 찾아 value에 명시한 키워드를 기억하고 있다가


요청이 들어오면 연결시켜 준다.





보통 @RequestMapping는 뒤에 value와 method 인자를 갖고있고 (예 : (value = "/", method = RequestMethod.GET))


value 자리에는 맵핑 주소


method는 GET 방식 전달인지 POST방식 전달인지 정한다.


이 예제는 요청 주소가 '/'라면 GET 방식으로 값을 받아 동작하는 컨트롤러라는 의미이다.


함수명은 마음대로 사용해도 된다.





여기서 리턴 값은 home이라는 문자열이다.


이 리턴값을 이용해 View Resoler가 해당 페이지를 연결시켜 준다.


설정해둔 접두사 + 리턴값 + 접미사 형태로 합쳐져 url을 완성시킨다.


이 설정은 XML 파일에서 확인할 수 있다.


관련 xml 파일 : web.xml, ***-servlet.xml






web.xml 파일을 열어보면 중간에


    <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>/WEB-INF/config/action-servlet.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
       
    <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>



라고 Servlet 설정을 해두었다.


여기서 url-pattern이 /인 경우 /WEB-INF/config/action-servlet.xml 파일의 설정을 이용한다는 의미이고


action-servlet.xml을 열어보면




    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
   
    <context:component-scan base-package="com.kh.tsp" />




라는 구문으로 등록되어 있다.


beans:bean 태그에서 InternalResourceViewResolver 클래스를 이용(ViewResolver)


접두사 : /WEB-INF/views/


접미사 : .jsp


로 설정하고


Controller는 com.kh.tsp 패키지 경로 아래의 파일들을 모두 스캔한다.






아까 위의 HomeController를 이용해서 home이라는 문자열을 리턴받았다.


그렇다면 view resolver는 다음과 같은 결과로 url를 만든다.


"/WEB-INF/views/" + "home" + ".jsp"


"/WEB-INF/views/home.jsp"







이러한 원리로 Spring Framework에서는


Dispatcher Servlet과 Handler Mapping, Controller가 상호작용하여


작동하게 된다.







+ Recent posts