📍 Interceptor : 요청, 응답을 가로채는 객체
Client <-> Filter <-> Dispatcher Servlet <-> Interceptor <-> Controller
- preHandle(전처리) : Dispatcher Servlet -> Controller 사이
- postHandle(후처리) : Controller -> Dispatcher Servlet 사이
- afterCompletion(뷰 완성 후) : View Resolver -> Dispatcher Servlet 사이
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 <-> Dispatcher Servlet <-> Interceptor <-> Controller
public class BoardTypeInterceptor implements HandlerInterceptor {
@Autowired
private BoardService service;
/*
* preHandle(전 처리) : Dispatcher Servlet -> Controller 사이
* postHandle(후 처리) : Controller -> Dispatcher Servlet 사이
* afterCompletion(뷰 완성 후) : View Resolver -> Dispatcher 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");
}
}
🔑 boardType관련 vo(dto)를 생성하지 않음
--> map으로 값을 전달할 때 getter의 형태 대신 컬럼명을 작성하면 된다
<?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>
❗ application scope에 boardTypeList를 저장
-> 서버가 켜진 상태에서 db를 수정해도 수정사항이 바로 반영되지 않는다 (서버 restart를 해야 함)