2 ๋ถ„ ์†Œ์š”

๐Ÿ“š SPRING


๐Ÿ“š Interceptor

Interceptor ๋ž€

Interceptor๋ž€ ๋‚š์•„์ฑ„๋‹ค๋ผ๋Š” ์˜๋ฏธ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค.
Client์—์„œ Server๋กœ ๋“ค์–ด์˜จ Request ๊ฐ์ฒด๋ฅผ Controller์˜ Handler๋กœ ๋„๋‹ฌํ•˜๊ธฐ ์ „์— ๊ฐ€๋กœ์ฑ„์„œ ์›ํ•˜๋Š” ์ถ”๊ฐ€ ์ž‘์—…์ด๋‚˜ ๋กœ์ง์„ ์ˆ˜ํ–‰ ํ•œ ํ›„ Handler๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ๋Š” Module์ด๋‹ค.
Controller๊ฐ€ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์ „/ํ›„์— ์ฒ˜๋ฆฌํ•œ๋‹ค.

Interceptor ๊ตฌํ˜„ ์ˆ˜๋‹จ

  • HandlerInterceptor ์ธํ„ฐํŽ˜์ด์Šค
    ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ƒ์†๋ฐ›์•„ ๋ฉ”์„œ๋“œ ์‚ฌ์šฉ
  • HandlerInterceptorAdapter ์ถ”์ƒ ํด๋ž˜์Šค ( HandlerInterceptor Interface๋ฅผ ์ƒ์† ๋ฐ›์•˜๋‹ค. )
    ์ถ”์ƒ ํด๋ž˜์Šค๋ฅผ ์˜ค๋ฒ„๋ผ์ด๋”ฉ ํ•จ์œผ๋กœ์จ ์ž์‹ ๋งŒ์˜ ์ธํ„ฐ์…‰ํ„ฐ ๋งŒ๋“ค์–ด ์‚ฌ์šฉ

Interceptor ์„ค์ •

servlet-context.xml ์— ์„ค์ •์„ ํ•œ๋‹ค.

<interceptors>
		<interceptor>
        <!-- ์ ์šฉ URL -->
			<mapping path="/*"/>
        <!-- Interceptor class ์œ„์น˜ -->
			<beans:bean class="com.test.sample.AInterceptor"/>
		</interceptor>
</interceptors>


์—ฌ๋Ÿฌ๊ฐœ์˜ Interceptor ๋“ฑ๋ก

<interceptors>
		<interceptor>
			<mapping path="/*"/>
			<beans:bean class="com.test.sample.AInterceptor"/>
		</interceptor>
        <interceptor>
			<mapping path="/*"/>
			<beans:bean class="com.test.sample.BInterceptor"/>
		</interceptor>
</interceptors>

Interceptor ์ˆ˜ํ–‰ ๊ณผ์ •


DispatcherServlet์€ HandlerMapping์—๊ฒŒ Client Request๋ฅผ ์ˆ˜ํ–‰ํ•  Handler๋ฅผ ์ฐพ๋„๋ก ์š”์ฒญ์„ ๋ณด๋‚ธ๋‹ค.

์ด๋•Œ HandlerExecutionChain ( ํ•ธ๋“ค๋Ÿฌ ์‹คํ–‰ ์ฒด์ธ ) ์ด ๋™์ž‘ํ•˜๋Š”๋ฐ, ์ด ๊ฒƒ์€ ํ•˜๋‚˜ ์ด์ƒ์˜ HandlerInterceptor ๋ฅผ ๊ฑฐ์ณ Controller๊ฐ€ ์‹คํ–‰๋˜๋„๋ก ๊ตฌ์„ฑ๋˜์–ด ์žˆ๋‹ค.
HandlerInterceptor๋ฅผ ๋“ฑ๋กํ•˜์ง€ ์•Š์•˜์„ ๋•Œ๋Š” ๋ฐ”๋กœ Controller๋ฅผ ์‹คํ–‰ํ•œ๋‹ค.

HandlerInterceptor๋ฅผ ๊ฑฐ์ณ Request์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ์ž‘์—…, ๋กœ์ง์„ ์ˆ˜ํ–‰ํ•œ ํ›„ Controller๋กœ Request ๊ฐ์ฒด๋ฅผ ์ „๋‹ฌํ•œ๋‹ค.
์ฃผ๋กœ ๋กœํ‚น, ๋ชจ๋‹ˆํ„ฐ๋ง ์ •๋ณด ์ˆ˜์ง‘, ์ ‘๊ทผ ์ œ์–ด ์ฒ˜๋ฆฌ ๋“ฑ์˜ ์‹ค์ œ Bussiness Logic๊ณผ๋Š” ๋ถ„๋ฆฌ๋˜์–ด ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ๋“ค์„ ๋„ฃ๊ณ  ์‹ถ์„ ๋•Œ ์œ ์šฉํ•˜๋‹ค.

์‰ฝ๊ฒŒ ๋งํ•ด, HandlerInterceptor์˜ ์—ญํ• ์€ HanldeMapping์ด ๊ฒฐ์ •ํ•œ Handler๋ฅผ HandlerAdapter ์ˆ˜ํ–‰ ์ „, ํ›„ ๋กœ ๊ฐ€๋กœ์ฑ„์–ด ์ถ”๊ฐ€์ ์ธ ์ž‘์—…์„ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.

Interceptor ํ˜ธ์ถœ ์ˆœ์„œ

servlet-context.xml

<interceptors>
		<interceptor>
			<mapping path="/*"/>
			<beans:bean class="com.test.sample.AInterceptor"/>
		</interceptor>
		<interceptor>
			<mapping path="/*"/>
			<beans:bean class="com.test.sample.BInterceptor"/>
		</interceptor>
        <interceptor>
			<mapping path="/*"/>
			<beans:bean class="com.test.sample.CInterceptor"/>
		</interceptor>
	</interceptors>


  1. AInterceptor.preHandle()
  2. BInterceptor.preHandle()
  3. CInterceptor.preHandle() Controller
  4. CInterceptor.postHandle()
  5. BInterceptor.postHandle()
  6. AInterceptor.postHandle()
  7. CInterceptor.afterCompletion()
  8. BInterceptor.afterCompletion()
  9. AInterceptor.afterCompletion()

Interceptor ์žฅ์  ( ์‚ฌ์šฉ ์ด์œ  )

  • ๊ณตํ†ต ์ฝ”๋“œ ์‚ฌ์šฉ์œผ๋กœ ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ ์ฆ๊ฐ€
  • ๋ฉ”๋ชจ๋ฆฌ ๋‚ญ๋น„, ์„œ๋ฒ„ ๋ถ€ํ•˜ ๊ฐ์†Œ
  • ์ฝ”๋“œ ๋ˆ„๋ฝ์— ๋Œ€ํ•œ ์œ„ํ—˜์„ฑ ๊ฐ์†Œ

Interceptor ์ œ๊ณต method

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class Interceptor implements HandlerInterceptor {

	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		return true;
	}

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView modelAndView) throws Exception {
	}

	@Override
	public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
			throws Exception {
	}
}
  • preHandle
    ์ง€์ •๋œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋™์ž‘ ์ด์ „์— ์ˆ˜ํ–‰ํ•  ๋™์ž‘ ( ์‚ฌ์ „ ์ œ์–ด )
    false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด request๋ฅผ ๋ฐ”๋กœ ์ข…๋ฃŒ

  • postHandle
    ์ง€์ •๋œ ์ปจํŠธ๋กค๋Ÿฌ์˜ ๋™์ž‘ ์ดํ›„์— ์ฒ˜๋ฆฌํ•  ๋™์ž‘ ( ์‚ฌํ›„ ์ œ์–ด )
    Controller ์ˆ˜ํ–‰ ํ›„ ํ˜ธ์ถœ

  • afterCompletion
    Dispatcher Servlet์˜ ํ™”๋ฉด ์ฒ˜๋ฆฌ๊ฐ€ ์™„๋ฃŒ๋œ ์ดํ›„ ์ฒ˜๋ฆฌํ•  ๋™์ž‘
    view๋ฅผ ํ†ตํ•ด ํด๋ผ์ด์–ธํŠธ์— ์‘๋‹ต์„ ์ „์†กํ•œ ๋’ค ์‹คํ–‰
    ์˜ˆ์™ธ๊ฐ€ ๋ฐœ์ƒํ•˜์—ฌ๋„ ์‹คํ–‰

Interceptor Session Check

preHandle()์— ์„ธ์…˜์ฒดํฌ๋ฅผ ๊ตฌํ˜„ํ•ด ๋ณด์•˜๋‹ค.
์„ธ์…˜์— ์ €์žฅ๋œ ์‚ฌ์šฉ์ž ์ •๋ณด๋ฅผ ๋ฐ›์•„์™€์„œ ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์กด์žฌํ•˜๋ฉด true, ์กด์žฌํ•˜์ง€ ์•Š์œผ๋ฉด false๋ฅผ ํ•ด์ฃผ๊ณ  root๋กœ ๋‹ค์‹œ ๋ณด๋‚ธ๋‹ค.
์ฃผ๋กœ ์‚ฌ์šฉ์ž๋งŒ์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™”๋ฉด๋‹จ์—์„œ ์ด์šฉํ•œ๋‹ค. ์—ฌ๊ธฐ์„œ๋Š” ๊ธฐ์‚ฌ๋ฅผ ์ ๊ฑฐ๋‚˜, ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๋ถ€๋ถ„์— interceptor๋ฅผ ์ •์˜ํ•˜๊ฒ ๋‹ค.

servlet-context.xml

<beans: bean id="confirm" class="com.ssafy.interceptor.ConfirmInterceptor"/>

<interceptors>
    <interceptor>
        <mapping path="/article/write"/>
        <mapping path="/article/modify"/>
        <mapping path="/article/delete"/>
        <beans:ref bean="confirm"/>
    </interceptor>
</interceptors>


ConfirmInterceptor.java

public class ConfirmInterceptor extends HanlderInterceptorAdaptor{

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception{
        // ์„ธ์…˜ ๋ฐ›์•„์˜ค๊ธฐ
        HttpSession session = request.getSession();
        // ์‚ฌ์šฉ์ž ์ •๋ณด ์ €์žฅ
        MemberDto memberDto = (MemberDto) session.getAttribute("userinfo");
        // ์‚ฌ์šฉ์ž ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด root๋กœ ๋‹ค์‹œ ๋ณด๋‚ธ๋‹ค
        if(memberDto == null){
            response.sendRedirect(request.getContextPath());
            return false;
        }
        return true;
    }
}