고래씌

[Spring] 7. Application 전역에 있는 데이터를 저장(Intercepter) 본문

Server/Spring

[Spring] 7. Application 전역에 있는 데이터를 저장(Intercepter)

고래씌 2024. 1. 24. 11:53

1. Intercepter

1) Application 전역에 boardType 리스트를 저장

 

☞ filter가 가장먼저 받고 다음 Dispatcher가 받음
Interceptor : 디스패처서블릿에서 컨트롤러에 요청내용을 전달할 때 인터셉터가 중간에 요청을 가로챈다.
스프링의 모든 빈객체에 접근이 가능하며 일반적으로 로그인체크, 권한체크, 프로그램실행시간체크, 로그확인시 사용된다.
컨트롤러에서 디스패처서블릿을 응답시킬때도 가로챔

 

 

 

▶ servelt-context.xml

 

 

 

▶ BoardTypeInterceptor

 

=> common 폴더아래 interceptor 폴더 생성후, BoardTypeInterceptor 클래스 파일 생성

=> HandlerInterceptor 안에 있는 preHandle 함수를 오버라이딩 하여 사용

 

☞ application scope에 boardType list를 저장
 항상저장시키는게 아니라 처음 한번만 저장할 예정(application에 boardType list가 없는 경우)
application객체 얻어오기

 

package com.kh.spring.common.interceptor;

import java.util.List;

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 com.kh.spring.board.model.dao.BoardDao;
import com.kh.spring.board.model.vo.BoardType;

public class BoardTypeInterceptor implements HandlerInterceptor{
	
	@Autowired
	private ServletContext application;  //application에 의존성 주입
	
	@Autowired
	private BoardDao boardDao;
	
	// 전처리(pre Handle) 함수 : 컨트롤러가 서블릿의 요청을 처리하기 "전"에 먼저 실행되는 함수
	@Override
	public boolean preHandle(HttpServletRequest req, HttpServletResponse res, Object handler) throws Exception {
		// Obejct handler, HttpServletResponse res 의미없는 코드임. 오버라이딩되어 매개변수를 일단 넘겨받아야하기 때문에 쓴 것임
		
		// application scope에 boardType list를 저장
		// 항상저장시키는게 아니라 처음 한번만 저장할 예정(application에 boardType list가 없는 경우)
		// application객체 얻어오기
		if(application.getAttribute("boardTypeList") == null) {
			
			// 어플리케이션 스코프에 boardTypeList로 된 데이터가 없는 경우, db에서 정보를 조회해서 application scope에 저장
			List<BoardType> boardTypeList = boardDao.selectBoardTypeList();
			
			application.setAttribute("boardTypeList", boardTypeList);
			
			application.setAttribute("contextPath", req.getContextPath()); 
			// /spring이라는 contextPath라는 정보를 application 전역에 contextPath라는 이름으로 저장한 것!
			// header.jsp에 contextPath 함수 선언한 것은 이제 지워도 된다! 왜냐하면 application 전역에 contextPath를 저장했기 때문
		}
		
		return true;  // 의미없는 코드. 반환값이 boolean이라서
	}
}

 

 

☞ /spring이라는 contextPath라는 정보를 application 전역에 contextPath라는 이름으로 저장한 것!
 header.jsp에 contextPath 함수 선언한 것은 이제 지워도 된다! 왜냐하면 application 전역에 contextPath를 저장했기 때문

 

header.jsp

 

=> header.jsp에서 contextPath 함수를 지정한것을 주석처리해도 contextPath를 사용할 수 있게된다.

 

▶ BoardDao.java

 

 

▶ BoardDaoImpl.java

 

 

▶ board-mapper.xml

	<!-- Application 전역에 boardType 가 담긴다! -->
	<select id="selectBoardTypeList" resultType='boardType'>
		SELECT *
		FROM BOARD_TYPE
		ORDER BY BOARD_CD
	</select>

 

 

▶ header.jsp

 

 

☞ DB에 자유게시판을 추가하면 자동으로 웹에도 자유게시판이 추가된다!

 

 

 

▶ boardListView.jsp

=> 해당하는 게시판의 이름이 자동으로 변경되도록 설정

 

 

 

▶ 결과