spring framework

스프링 프레임워크 #5 Spring MVC 핵심 개념 (RequestMapping, 뷰 리졸버, 핸들러, 인터셉터)

letsDoDev 2023. 9. 17. 20:58

◎ 참고 서적  |  Mastering Spring 5 

 

준비 사항

  • 이클립스
  • 자바 8 이상
  • 메이븐 3 이상
  • 인터넷 연결

 

[ @RequestMapping ]

예1)

@Controller
public class UserController{
	@RequestMapping(value="/show-page", method=RequestMethod.GET)
    public String showPage(){
    /*코드 작성 부분*/
    }
}

==> shpw-page라는 값이 넘어오면 아래 메소드를 수행시킴

 

예2)

@Controller
@RequestMappin("/user")
public class UserController{
	@RequestMapping(value="/show-page", method=RequestMethod.GET)
    public String showPage(){
    /*코드 작성 부분*/
    }
}

==> 하나는 클래스에 매핑, 하나는 메소드에 매핑

==> 동작 ex) localhost:8090/user/show-page 일 때

 

[ @RequestMapping 의 리턴 타입 ]

  • ModelAndView 
    ex) public ModelAndView showPage(){ ~~~ return new ModelAndView("다음 뷰", 모델 객체)}
  • Model
    모델만 반환 뷰는 DefaultRequestToViewNameTranslator 를 사용하여 결정
  • Map
  • View
    암묵적으로 정의된 모델이 있는 뷰
  • String 
    뷰 이름에 대한 참조 이때까지 많이 사용했음 + 뷰 리졸버

[  뷰 리졸버  : JSP 뷰 리졸버 ]

뷰 리졸버란?(@RequestMapping 한 컨트롤러)컨트롤러 메소드에서 return "다음 뷰 논리적 주소" 형태로 다음 뷰를 결정할 때논리적 뷰를 물리적 뷰로 바꿔 url에 매핑해주는 역할ex) return "hello" ==> hello.jsp" 이런식으로 바꾸어 url로 매핑해준다.

 

뷰 리졸버 구성하는 방법 1 -jjsp 뷰 리졸버 방법

 	<bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
 		<property name="viewClass"
        	value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix">
 			<value>/WEB-INF/views/</value>
 		</property>
		
		<property name="suffix">
			<value>.jsp</value>
		</property> 		
 	</bean>

코드 구문을 *context.xml 에 추가한다.

 

2- 프리마커 방법

- 프리마커 템플릿

<bean id="freemarkerConfig"
  class="org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer">
  <property name = "templateLoaderPath" value="/WEB-INF/freemarker/"/>
 </bean>

- 프리마커 리졸버

<bean id="freemarkerViewResolver"
 class="org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver">
 	<property name="cache" value="true">
    <property name="prefix" value=""/>
    <property name="suffix" value=".ftl">
 </bean>

[ 핸들러 매핑 및 인터셉터 탐색 ]

스프링 2.5 이하 버전에서 url 과 컨트롤러 사이의 매핑이 필요했는데 이때 사용하던 핸들러 매팅 구형 방법 ▼

(현재는 어노테이션 사용으로 핸들퍼 매핑 불필요)

시기에 따른 종류

  • public boolean preHandler(HttpServletRequest, request, HttpServletResponse response, Object handler)
    핸들러 메소드 호출 전
  • public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
    핸들러 메소드 호출 후
  • public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
    요청 처리과 완료된 후 호출

핸들러 타이머 코드 예제

- 클래스 파일

public class HandlerTimerLogginInterceptor extends
HandlerInterceptorAdapter{
	@Override
    	public boolean preHandle(HttpServletRequest request, HttpServletResponse response,
        Object handler) throws Exception {
        request.setAttribute("startTime", System.currentTimeMillis());}

	@Override
    	public void postHandle(HttpServletRequest request, HttpServletResponse response,
        Object handler, ModelAndView modelAndView) throws Exception{
        	request.setAttribute("endTime", System.cuttrenTimeMillis());
        }
    
    @Override
    	public void afterCompletion(HttpServletRequest request, HttpServletResponse response,
        Object handler, Exception ex)
        throws Exception {
        long startTime = (Long) request.getAttribute("StartTime");
        long endTime - (Long) request.getAttribute("endTime");
        logger.info("Time Spent in Handler in ms : " +  (endTime - startTime));
}

- context.xml에 추가해야 할 내용

<mvc:interceptors>
	<mapping path="/**"/>
    <exclude-mapping path="/secure/**"/>
	<bean class="com.mastering.spring.springmvc.controller.interceptor
    .HandlerTimeLoggingInterceptor" />
</mvc:interceptors>

 └ ▶ /secure/로 시작하는 URI 매핑을 가진 핸들러를 제외한 모든 핸들러가 인터셉스 된다.