YJ의 새벽

Spring 15 ( interceptor ) , 게시판 페이지 목록 본문

Spring/Spring

Spring 15 ( interceptor ) , 게시판 페이지 목록

YJDawn 2023. 5. 1. 17:15

 

 

 

 

 

 

 

 

-- interceptors  :  인터셉터를 모아둔 태그 ,   (  servlet-context.xml  ) 에작성

 -- interceptor  :  요청이 Dispatcher Servlet 에서 Controller 에 도달하지 전, 또는 후에

                            요청 / 응답 객체 (req,resp ) 를 가로채서 사용할 수 있는 객체 .

   --mapping : 가로챌 요청의 패턴을 지정

   --beans:bean  :  인터셉터 역할을 수행할 클래스를 찾아서 bean 으로 등록 .

 

-- servlet-context.xml 에 인터셉터 빈 추가 .

	<interceptors>
		<interceptor>
			<!-- 가로챌요청의 패턴 지정 -->
			<mapping path="/**"/>
			<!-- 클래스 찾아 bean 등록 -->
			<beans:bean id="boardTypeInterceptor" class="edu.kh.comm.common.interceptor.BoardTypeInterceptor"/>
		</interceptor>
	</interceptors>

 

 

 

 

 

-- 인터셉터가 요청을 가로채는 시기    

  1. preHandle  ( 전처리  )   :  컨트롤러 수행 전

  2. postHandle ( 후처리 )   :  컨트롤러 수행 후   ( 컨트롤러 수행 결과 참조 가능 )

  3. afterCompletion   ( View단 처리 후 )  :  보통 자원 잔환 ( close() ) 수행 .

-- 단, 비동기 요청 (자바내부의 별도 쓰레드요청)  은 가로채지 않음 .

 

 

package edu.kh.comm.common.interceptor;

@Slf4j
public class BoardTypeInterceptor implements HandlerInterceptor{

	@Autowired
	private BoardService boardService;
	
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		log.info("전처리 수행");
		
		//application scope 에 "boardTypeList" 가 없을 경우
		//  이를 조회하는 Service 호출 후 결과를 세팅
		
		//application scope 객체 얻어오기.
		ServletContext application = request.getServletContext();
		if ( application.getAttribute("boardTypeList") == null ) {
			List<BoardType> boardTypeList =  boardService.selectBoardType();
		
			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 {
		
		log.info("후처리 수행");
		
		HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
		
		log.info("View 처리 완료 후 수행");
		
		HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
	}
}

*** Interceptor 로 "boardTypeList" 를 뽑아 

  -- application scope에  미리 저장 . 

   -- 저장된 "boardTypeList" 로 값 받아

     -- Get 요청 실행.

 

 

 

 

 

---mybatis-config.xml 파일에 추가

 

	<!-- SqlSessionTemplate 관련 설정 -->
	<settings>
		<setting name="jdbcTypeForNull" value="NULL"/>
	</settings>
		
	<!-- 별칭 작성 부분 -->
	<typeAliases>
		<typeAlias type="edu.kh.comm.member.model.vo.Member" alias="member"/>
		<typeAlias type="edu.kh.comm.board.model.vo.Board"  		alias="board"/>
		<typeAlias type="edu.kh.comm.board.model.vo.BoardDetail"  	alias="detail"/>
		<typeAlias type="edu.kh.comm.board.model.vo.BoardImage"  	alias="boardImage"/>
		<typeAlias type="edu.kh.comm.board.model.vo.BoardType"  	alias="boardType"/>
	</typeAliases>
	
	
	<!-- SQL이 작성되는 mapper 파일 위치를 등록 -->
	<mappers>
		<mapper resource="/mappers/member-mapper.xml"/>
		<mapper resource="/mappers/myPage-mapper.xml"/>
		<mapper resource="/mappers/board-mapper.xml"/>
	</mappers>

 

 

 

 

 

 

 

-- BoardService .   서비스클래스 .

 

--- BoardDAO  .   DB 접근 클래스

 

 

 

--- board-mapper.xml   쿼리문 . 

 

--- 콘솔로그 확인 ~!   

 

----------------------------------------------------------------------------------------------------------------------------------------------------------------

 

 

게시판 글 띄어보자 .         

--- 인터셉터로 application scope 에 "boardTypeList" 를 미리 저장해놨다 . 

--- DB에 저장된 값으로 ,   '공지사항' , '자유게시판 ' , '질문게시판' 을 띄운다.

 

 

--- header.jsp 에서,  jstl 지시자 추가 , 

   

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"  %>

 

 

 

 

--- BoardController . 컨트롤러 클래스 .

package edu.kh.comm.board.controller;

@Controller
@RequestMapping("/board")
public class BoardController {

	@Autowired
	private BoardService service;
	
	//게시글 목록 조회
	//@PathVariable ( "value" )  :  URL 경로에 포함되어있는 값을 변수로 사용할수 있게하는역할
	//         --> 자동으로 request scope에 등록됨 --> jsp ${value} EL 작성가능.
	
	@GetMapping("/list/{boardCode}")
	public String boardList( @PathVariable("boardCode") int boardCode,
						@RequestParam(value="cp", required = false, defaultValue = "1") int cp,
						Model model ) {
		// 게시글 목록조회 서비스 호출
		// 1) 게시판 이름 조회 . 
		// 2) 페이지네이션 객체 생성
		// 3) 게시글 목록 조회 
		
		Map<String,Object> map = null;
		
		map = service.selectBoardList(cp,boardCode);
		
		model.addAttribute("map",map);
		
		return "board/boardList";
	}
}

 

--- BoardService .   서비스 클래스  

 

 

--- BoardDAO  클래스 ,  DB접근 클래스

 

--- board-mapper .xml  에  추가 !

	<!-- 게시글 목록용 resultMap -->
	<resultMap type="board" id="board_rm">
		<id property="boardNo" column="BOARD_NO" />
		<result property="boardTitle" column="BOARD_TITLE" />
		<result property="createDate" column="CREATE_DT" />
		<result property="readCount" column="READ_COUNT" />
		<result property="memberNickname" column="MEMBER_NICK" />
		<result property="thumbnail" column="THUMBNAIL" />
	</resultMap>
 
 	<!-- 특정게시판 전체 게시글수 조회  -->
	<select id="getListCount" resultType="_int">
		SELECT COUNT(*) FROM BOARD
		WHERE BOARD_CD = ${boardCode}
		AND BOARD_ST = 'N'
	</select>
	
	<!--  -->
	<!-- 게시글 목록 조회 -->
	<select id="selectBoardList" resultMap="board_rm">
		SELECT BOARD_NO,
		BOARD_TITLE, MEMBER_NICK, READ_COUNT,
		CASE WHEN SYSDATE - CREATE_DT &lt; 1
		THEN TO_CHAR(CREATE_DT, 'HH:MI')
		ELSE TO_CHAR(CREATE_DT, 'YYYY-MM-DD')
		END CREATE_DT,

		(SELECT IMG_RENAME FROM BOARD_IMG
		WHERE BOARD.BOARD_NO = BOARD_IMG.BOARD_NO
		AND IMG_LEVEL = 0) THUMBNAIL

		FROM BOARD
		JOIN BOARD_TYPE USING(BOARD_CD)
		JOIN MEMBER_S USING(MEMBER_NO)
		WHERE BOARD_ST = 'N'
		AND BOARD_CD = ${boardCode}
		ORDER BY BOARD_NO DESC
	</select>

 

 

 

--- boardList.jsp   가서 수정. 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Comments