본문 바로가기

프로그래밍/Java

일반 뷰 Controller를 ajax로 데이터만 받아서 쓰기 (Interceptor 사용)

반응형

현재 시스템에서 사용 중인 Spring 3.2.9 기준으로 작성하였음.


전통적인 Servlet/JSP 기반의 시스템에서는 Controller의 역할이 많다. 사용자의 요청을 받아서 데이터 처리하는 부분을 호출하고 결과를 다시 사용자에게 돌려주는데, 이 때 일반적으로 JSP 템플릿을 뷰로 사용한다.


예컨대 다음과 같은 평범하디 평범한 API가 있다고 하자.

	@RequestMapping(value = "/abcList.do")
	public String selectItfindIctList(@ModelAttribute("abcVO") AbcVO abcVO, ModelMap model) throws Exception {
		
		//뭔가 조회
		List result = abcService.selectList(abcVO);
		
		//조회된 값을 jsp로
		model.addAttribute("resultList",result);
		model.addAttribute("itfind", itfindVo);
		
		return "abc/efg/abc_list";
	}


ModelMap이나 ModelAndView 등에 데이터를 담고 jsp 뷰와 함께 리턴한다.

클라이언트가 abcList.do를 호출하면 JSTL/EL로 데이터를 그린 화면이 리턴될 것이다.


그런데 사용자 요구사항에 의해 프론트엔드를 전면 개편해야할 일이 생겼다.

그.러.나. 인력이 매우 부족하다. 나 혼자 ㅠㅠㅠㅠ 서버사이드까지 정리하기에 절대적으로 시간이 부족한 상황이어서 꼼수를 생각해냈다.


Interceptor를 사용해서 리턴하는 뷰를 변조하는 것이다.


Spring Interceptor

Interceptor에 대한 설명이나 만드는 법은 다른 블로그를 참조하는 것이 좋다...간단하게 말하면 컨트롤러 전후 포인트에서 작업을 해주는 것인데

preHandle, postHandle, afterCompletion 세 개의 메소드를 override하여 사용한다. 실행 순서는 다음과 같다.


preHandle > 컨트롤러 작업 > postHandle > 컨트롤러 작업 완료 > afterCompletion 


여기서 나는 postHandle에서 특정 파라미터가 있을 경우 리턴하는 viewName만 세팅해주었다.


ViewNameInterceptor.java

public class ViewNameInterceptor extends HandlerInterceptorAdapter

{

@Override

public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,

ModelAndView modelAndView) throws Exception

{

String dataType = request.getParameter("dataType");

if("json".equals(dataType)){

modelAndView.setViewName("ajaxView");

}

super.postHandle(request, response, handler, modelAndView);

}

}


설정파일에 Interceptor Bean 등록

<mvc:interceptors>

    <mvc:interceptor>

     <mvc:mapping path="/**"/>

     <bean class="egovframework.com.cmm.intercepter.ViewNameInterception"/>

    </mvc:interceptor>

(...다른 Interceptor 정보들)

</mvc:interceptors>

평소처럼 호출하면 JSP 화면을 리턴하고, 해당 파라미터를 붙여 전송하면 json을 리턴한다.

예)  /abcList.do?dataType=json


잘 된다.

반응형

개발자가 그리는 인스타툰 팔로우하세요!