08_Spring_240422(월)_68일차(1) - ★BoardProject★ - Interceptor - 10. 게시판 - 게시판 종류 조회(boardCode, boardName)

soowagger·2024년 4월 22일

8_Spring

목록 보기
24/38

Filter(Servlet Spec) vs Interceptor(Spring Spec)

📌 config / interceptor 설정

common.interceptor.BoardTypeInterceptor

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

common.config.InterceptorConfig

// 인터셉터가 어떤 요청을 가로챌지 설정하는 클래스

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

10-1) 게시판 종류 조회

boardServiceImpl

// * 게시판 종류 조회
@Override
public List<Map<String, Object>> selectBoardTypeList() {
	
	return mapper.selectBoardTypeList();
}

board-mapper.xml

<!-- 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); 를 얻어서 사용 가능

profile

0개의 댓글