๐Ÿ“˜ Filter, Interceptor, AOP

  • ์ž๋ฐ” ์›น ๊ฐœ๋ฐœ์„ ํ•˜๋‹ค๋ณด๋ฉด, ๊ณตํ†ต์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•  ์—…๋ฌด๋“ค์ด ๋งŽ๋‹ค.
  • ๋กœ๊ทธ์ธ ๊ด€๋ จ(์„ธ์…˜์ฒดํฌ)์ฒ˜๋ฆฌ, ๊ถŒํ•œ์ฒดํฌ, XSS(Cross site script)๋ฐฉ์–ด, pc์™€ ๋ชจ๋ฐ”์ผ์›น์˜ ๋ถ„๊ธฐ์ฒ˜๋ฆฌ, ๋กœ๊ทธ, ํŽ˜์ด์ง€ ์ธ์ฝ”๋”ฉ ๋ณ€ํ™˜ ๋“ฑ์ด ์žˆ๋‹ค.
  • ์œ„์™€ ๊ฐ™์€ ๊ณตํ†ต์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ด 3๊ฐ€์ง€๊ฐ€ ์žˆ๋‹ค.
    1. Filter
    2. Interceptor
    3. AOP

Interceptor์™€ Filter๋Š” Servlet ๋‹จ์œ„์—์„œ ์‹คํ–‰๋œ๋‹ค. <> ๋ฐ˜๋ฉด AOP๋Š” ๋ฉ”์†Œ๋“œ ์•ž์— ProxyํŒจํ„ด์˜ ํ˜•ํƒœ๋กœ ์‹คํ–‰๋œ๋‹ค. ใ†์‹คํ–‰์ˆœ์„œ๋ฅผ ๋ณด๋ฉด Filter๊ฐ€ ๊ฐ€์žฅ ๋ฐ–์— ์žˆ๊ณ  ๊ทธ์•ˆ์— Interceptor, ๊ทธ์•ˆ์— AOP๊ฐ€ ์žˆ๋Š” ํ˜•ํƒœ์ด๋‹ค. ๋”ฐ๋ผ์„œ ์š”์ฒญ์ด ๋“ค์–ด์˜ค๋ฉด Filter โ†’ Interceptor โ†’ AOP โ†’ Interceptor โ†’ Filter ์ˆœ์œผ๋กœ ๊ฑฐ์น˜๊ฒŒ ๋œ๋‹ค.

Filter

์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋Š” DispatcherServlet ์ด์ „์— ์‹คํ–‰์ด ๋˜๋Š”๋ฐ ํ•„ํ„ฐ๊ฐ€ ๋™์ž‘ํ•˜๋„๋ก ์ง€์ •๋œ ์ž์›์˜ ์•ž๋‹จ์—์„œ ์š”์ฒญ๋‚ด์šฉ์„ ๋ณ€๊ฒฝํ•˜๊ฑฐ๋‚˜, ์—ฌ๋Ÿฌ๊ฐ€์ง€ ์ฒดํฌ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค. EX)

<!-- ํ•œ๊ธ€ ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•œ ์ธ์ฝ”๋”ฉ ํ•„ํ„ฐ -->

<filter>

    <filter-name>encoding</filter-name>

    <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>

    <init-param>

        <param-name>encoding</param-name>

        <param-value>UTF-8</param-value>

    </init-param>

</filter>

<filter-mapping>

    <filter-name>encoding</filter-name>

    <url-pattern>/*</url-pattern>

</filter-mapping>

ํ•ด๋‹น ํ•„ํ„ฐ์˜ ์ด๋ฆ„์€ encoding, ๊ฐ’์€ UTF-8์ธ ํŒŒ๋ผ๋ฏธํ„ฐ๋ฅผ ์ •์˜ํ•˜๊ณ  ์žˆ๋‹ค.

ํ•„ํ„ฐ์˜ URL-PATTERN์„ /*๋กœ ์ •์˜ํ•˜๋ฉด servlet, jsp๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๋ฏธ์ง€์™€ ๊ฐ™์€ ๋ชจ๋“  ์ž์›์˜ ์š”์ฒญ์—๋„ ํ˜ธ์ถœ ๋œ๋‹ค.

Interceptor(์ธํ„ฐ์…‰ํ„ฐ)

ํ•„ํ„ฐ๋Š” ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ ์™ธ๋ถ€์— ์กด์žฌํ•˜์—ฌ ์Šคํ”„๋ง๊ณผ ๋ฌด๊ด€ํ•œ ์ž์›์— ๋Œ€ํ•ด ๋™์ž‘ํ•œ๋‹ค.

ํ•˜์ง€๋งŒ ์ธํ„ฐ์…‰ํ„ฐ๋Š” ์Šคํ”„๋ง์˜ DistpatcherServlet์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „, ํ›„๋กœ ๋ผ์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์Šคํ”„๋ง ์ปจํ…์ŠคํŠธ(Context, ์˜์—ญ) ๋‚ด๋ถ€์—์„œ Controller(Handler)์— ๊ด€ํ•œ ์š”์ฒญ๊ณผ ์‘๋‹ต์— ๋Œ€ํ•ด ์ฒ˜๋ฆฌํ•œ๋‹ค.

์Šคํ”„๋ง์˜ ๋ชจ๋“  ๋นˆ ๊ฐ์ฒด์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋‹ค.

์ธํ„ฐ์…‰ํ„ฐ๋Š” ์—ฌ๋Ÿฌ ๊ฐœ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๋กœ๊ทธ์ธ ์ฒดํฌ, ๊ถŒํ•œ์ฒดํฌ, ํ”„๋กœ๊ทธ๋žจ ์‹คํ–‰์‹œ๊ฐ„ ๊ณ„์‚ฐ์ž‘์—… ๋กœ๊ทธํ™•์ธ ๋“ฑ์˜ ์—…๋ฌด์ฒ˜๋ฆฌ

AOP

๊ฐ์ฒด ์ง€ํ–ฅ์˜ ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ํ–ˆ์„ ๋•Œ ์ค‘๋ณต์„ ์ค„์ผ ์ˆ˜ ์—†๋Š” ๋ถ€๋ถ„์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ข…๋‹จ๋ฉด(๊ด€์ )์—์„œ ๋ฐ”๋ผ๋ณด๊ณ  ์ฒ˜๋ฆฌํ•œ๋‹ค.

์ฃผ๋กœ โ€˜๋กœ๊น…โ€™, โ€˜ํŠธ๋žœ์žญ์…˜โ€™, โ€˜์—๋Ÿฌ ์ฒ˜๋ฆฌโ€™๋“ฑ ๋น„์ฆˆ๋‹ˆ์Šค๋‹จ์˜ ๋ฉ”์„œ๋“œ์—์„œ ์กฐ๊ธˆ ๋” ์„ธ๋ฐ€ํ•˜๊ฒŒ ์กฐ์ •ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

Interceptor๋‚˜ Filter์™€๋Š” ๋‹ฌ๋ฆฌ ๋ฉ”์†Œ๋“œ ์ „ํ›„์˜ ์ง€์ ์— ์ž์œ ๋กญ๊ฒŒ ์„ค์ •์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

Interceptor์™€ Filter๋Š” ์ฃผ์†Œ๋กœ ๋Œ€์ƒ์„ ๊ตฌ๋ถ„ํ•ด์„œ ๊ฑธ๋Ÿฌ๋‚ด์•ผํ•˜๋Š” ๋ฐ˜๋ฉด, AOP๋Š” ์ฃผ์†Œ, ํŒŒ๋ผ๋ฏธํ„ฐ, ์• ๋…ธํ…Œ์ด์…˜ ๋“ฑ ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์œผ๋กœ ๋Œ€์ƒ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.

AOP์˜ Advice์™€ HandlerInterceptor์˜ ๊ฐ€์žฅ ํฐ ์ฐจ์ด๋Š” ํŒŒ๋ผ๋ฏธํ„ฐ์˜ ์ฐจ์ด๋‹ค.

Advice์˜ ๊ฒฝ์šฐ JoinPoint๋‚˜ ProceedingJoinPoint ๋“ฑ์„ ํ™œ์šฉํ•ด์„œ ํ˜ธ์ถœํ•œ๋‹ค.

๋ฐ˜๋ฉด HandlerInterceptor๋Š” Filter์™€ ์œ ์‚ฌํ•˜๊ฒŒ HttpServletRequest, HttpServletResponse๋ฅผ ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.

AOP์˜ ํฌ์ธํŠธ์ปท

@Before: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰ ์ „

@After: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰ ํ›„

@After-returning: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ •์ƒ์ ์ธ ์ˆ˜ํ–‰ ํ›„

@After-throwing: ์˜ˆ์™ธ๋ฐœ์ƒ ํ›„

@Around: ๋Œ€์ƒ ๋ฉ”์„œ๋“œ์˜ ์ˆ˜ํ–‰ ์ „/ํ›„

ํƒœ๊ทธ:

์นดํ…Œ๊ณ ๋ฆฌ:

์—…๋ฐ์ดํŠธ: