
/* Interceptor : 요청/응답을 가로채는 객체(Spring 지원)
*
* Client <-> Filter <-> Dispatcher Servlet <-> Interceptor <-> Controller ...
*
* * HandlerInterceptor 인터페이스를 상속 받아서 구현해야 한다.
*
* - preHandle (전처리) : Dispatcher Servlet -> Controller 사이 수행
*
* - postHandle (후처리) : Controller -> Dispatcher Servlet 사이 수행
*
* - afterCompletion (뷰 완성(forward 코드 해석) 후) : View Resolver -> Dispatcher Servlet 사이 수행
*
*/
@Slf4j
public class BoardTypeInterceptor implements HandlerInterceptor {
// BoardService 의존성 주입
// (Cofing 파일 생성 시 BoardTypeInterceptor 기본 생성자를 써야 하기 때문에 필드에 선언)
@Autowired
private BoardService service;
// 전처리
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// application scope : 서버 종료 시까지 유지되는 Servlet 내장 객체
// - 서버 내에 딱 한 개만 존재!
// -> 모든 클라언트가 공용으로 사용
// application scope 객체 얻어오기
ServletContext application = request.getServletContext();
// application scope에 "boardTypeList"가 없을 경우
if(application.getAttribute("boardTypeList") == null) {
log.info("BoardTypeInterceptor - preHandle(전처리) 동작 실행");
// boardTypeList 조회 서비스 호출
List<Map<String, Object>> boardTypeList = service.selectBoardTypeList();
// 조회 결과를 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);
}
}
// 인터셉터가 어떤 요청을 가로챌지 설정하는 클래스
@Configuration // 서버가 켜지면 내부 메서드를 모두 실행
public class InterceptorConfig implements WebMvcConfigurer {
// 인터셉터 클래스 Bean 등록
@Bean // 개발자가 만들어서 반환하는 객체를 Bean 등록
// -> 관리는 Spring Container가 수행
public BoardTypeInterceptor boardTypeInterceptor() {
return new BoardTypeInterceptor();
}
// 동작할 인터셉터 객체를 추가하는 메서드
@Override
public void addInterceptors(InterceptorRegistry registry) {
// Bean으로 등록된 BoardTypeInterceptor를 얻어와서 매개변수로 전달
registry.addInterceptor(boardTypeInterceptor())
.addPathPatterns("/**") // 가로챌 요청 주소를 지정
// '/**' : / 이하 모든 요청 주소
// 가로채지 않을 주소 지정
.excludePathPatterns("/css/**",
"/js/**",
"/images/**",
"/favicon.ico");
}
}
// * 게시판 종류 조회
@Override
public List<Map<String, Object>> selectBoardTypeList() {
return mapper.selectBoardTypeList();
}
<!-- resultType 미작성할 수 있는 조건
- mapper 메서드의 반환형이 별칭으로 등록되어 있을 때
-->
<!-- 게시판 종류 조회 -->
<select id="selectBoardTypeList">
SELECT BOARD_CODE "boardCode", BOARD_NAME "boardName"
FROM "BOARD_TYPE"
ORDER BY BOARD_CODE
</select>
{boardCode : 1,
boardName : 공지게시판}
-> Map 형식으로 application.setAttribute("boardTypeList", boardTypeList); 를 얻어서 사용 가능