형광펜 부분이 Interceptor 객체가 응답과 요청을 가로 채는 부분이다
Interceptor 객체을 사용하기 위해서는 HandlerInterceptor 인터페이스를 상속 받아야한다.
HandlerInterceptor 인터페이스는 추상 메소드의 접근제한자가 defualt로 구현 되어있어 impelments 했을 시 오류가 생기지 않는다.
이때 alt+shift+s누르고
"Override/implements method" 클릭하면
HandlerInterceptor 인터페이스 안에 모든 추상 메소드를 가져올수 있다!
prehandle(전처리) : dispacher Servlet -> Controller 사이
postHandle(후처리) : Controller -> Dispatchar Servlet 사이
afterCompletion (뷰가 완성 후) : View Resolver -> Dispacher Servlet 사이
게시판의 종류가 수시로 변경 될 수 있어 코드의 유지 보수를 위해 자주 사용하는 방법이라고 한다!
1) HandlerInterceptor 인터페이스 상속 -> implements
2) 추상메소드 오버라이딩
3) application 내장객체 얻어오기ServletContext application = request.getServletContext()4) System.out.println(boardTypeList); 아래와 같이 출력됨
[{BOARD_NAME=공지사항, BOARD_CODE=1}, {BOARD_NAME=자유 게시판, BOARD_CODE=2}, {BOARD_NAME=테스트 게시판, BOARD_CODE=3}, {BOARD_NAME=질문 게시판, BOARD_CODE=4}, {BOARD_NAME=점심 게시판, BOARD_CODE=5}]
package edu.kh.project.common.interceptor;
import java.util.List;
import java.util.Map;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import edu.kh.project.board.model.service.BoardService;
// Interceptor : 요청/ 응답을 가로채는 객체
// Client <-> Filter <-> Dispather Servlet <-> Interceptor <-> Controller
public class BoardTypeInterceptor implements HandlerInterceptor {
@Autowired
private BoardService service;
/*
* preHandle(전처리) : Dispatcher Servlet -> Controller 사이
* postHandle(후처리) : Controller -> Dispatcher Servlet 사이
* afterCompletion (뷰가 완성 후): View Resolver -> Dispacher Servlet 사이
*
* */
// 전처리
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// application scope 내장객체 얻어오기
ServletContext application = request.getServletContext();
// application scope에 BOARD_TYPE이 조회 되어 세팅이 되지 않았다면
// -> 서버가 시작되고 난 후 누구도 요청 한 적이 없을 경우
if(application.getAttribute("boardTypeList")== null) {
//조회 서비스 호출
System.out.println("BOARD_TYPE 조회 서비스 호출");
List<Map<String, Object>> boardTypeList = service.selectBoardTypeList();
System.out.println(boardTypeList);
//application scope에 세팅
application.setAttribute("boardTypeList", boardTypeList);
}
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
package edu.kh.project.board.model.service;
import java.util.List;
import java.util.Map;
public interface BoardService {
/** 게시판 종류 목록 조회
* @return boardTypeList
*/
List<Map<String, Object>> selectBoardTypeList();
}
package edu.kh.project.board.model.service;
import java.util.List;
import java.util.Map;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import edu.kh.project.board.model.dao.BoardDao;
@Service
public class BoardServiceImpl implements BoardService{
@Autowired
private BoardDao dao;
//게시판 종류 목록 조회
@Override
public List<Map<String, Object>> selectBoardTypeList() {
return dao.selectBoardTypeList();
}
}
package edu.kh.project.board.model.dao;
import java.util.List;
import java.util.Map;
import org.mybatis.spring.SqlSessionTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
@Repository
public class BoardDao {
@Autowired
private SqlSessionTemplate sqlSession;
/** 게시판 종류목록 조회
* @return boardTypeList
*/
public List<Map<String, Object>> selectBoardTypeList() {
return sqlSession.selectList("boardMapper.selectBoardTypeList");
}
}
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="boardMapper">
<!-- resultType이 "map"인 경우
K: 컬럼 명 (BOARD_CODE , BOARD_NAME)
V: 컬럼 값 ( 1 , 공지사항 )
-->
<!-- 게시판 종류목록 조회 -->
<select id="selectBoardTypeList" resultType="map">
SELECT * FROM BOARD_TYPE ORDER BY 1
</select>
</mapper>