국비 87 - interceptor (스프링)

냐아암·2023년 8월 21일
0

국비

목록 보기
100/114

📍 Interceptor : 요청, 응답을 가로채는 객체

Client <-> Filter <-> Dispatcher Servlet <-> Interceptor <-> Controller

  • preHandle(전처리) : Dispatcher Servlet -> Controller 사이
  • postHandle(후처리) : Controller -> Dispatcher Servlet 사이
  • afterCompletion(뷰 완성 후) : View Resolver -> Dispatcher Servlet 사이

Interceptor

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);
	}
	
	

}

Service

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();

}

ServiceImpl

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();
	}

}

DAO

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의 형태 대신 컬럼명을 작성하면 된다

sql

<?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를 해야 함)

profile
개발 일지

0개의 댓글