๐ŸŒฟSpring/Spring Framework

[Spring Framework] Filter ์™€ Interceptor

Boom's 2024. 1. 11. 17:25
๋ฐ˜์‘ํ˜•

 

Spring์€ ๊ณตํ†ต์ ์œผ๋กœ ์—ฌ๋Ÿฌ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•จ์œผ๋กœ์จ ์ค‘๋ณต๋œ ์ฝ”๋“œ๋ฅผ ์ œ๊ฑฐ ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŽ์€ ๊ธฐ๋Šฅ๋“ค์„ ์ง€์›ํ•˜๊ณ  ์žˆ๋‹ค.

๊ทธ ์ค‘์— ํ•„ํ„ฐ(Filter)์™€ ์ธํ„ฐ์…‰ํ„ฐ(Interceptor)์˜ ์ฐจ์ด์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ณ ์ž ํ•œ๋‹ค.

 

1. ํ•„ํ„ฐ(Filter)


1) ํ•„ํ„ฐ(Filter) ๋ž€?

 

- ์ž๋ฐ” ์„œ๋ธ”๋ฆฟ์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ๋Šฅ

- ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ ํ•„ํ„ฐ๋กœ ์ธ์ฆ ๋“ฑ ๋‹ค์–‘ํ•œ ์ž‘์—…์„ ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋‹ˆ ์Šคํ”„๋ง ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ์˜ ํ•„ํ„ฐ์— ๋Œ€ํ•ด ๊ธฐ๋ก

- Spring Framework๋Š” ๋“ค์–ด์˜ค๋Š” ์š”์ฒญ์ด Dispatcher Servlet์— ์˜ํ•ด Controller์— ๋งคํ•‘

- Filter์˜ ์š”์ฒญ์ด Dispatcher Servlet์— ์˜ํ•ด ๋‹ค๋ค„์ง€๊ธฐ ์ „, ํ›„์— ๋™์ž‘

 

2) ํ•„ํ„ฐ(Filter)๋Š” ์–ด๋””์— ์‚ฌ์šฉํ•˜๋‚˜?

 

2-1) ํ•„ํ„ฐ ์ธํ„ฐํŽ˜์ด์Šค์˜ 3๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ

  • init() : Filter๊ฐ€ ์ƒ์„ฑ ๋  ๋•Œ ์ˆ˜ํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ
  • dofilter() : Request, Response๊ฐ€ ํ•„ํ„ฐ๋ฅผ ๊ฑฐ์น  ๋•Œ ์ˆ˜ํ–‰ ๋˜๋Š” ๋ฉ”์†Œ๋“œ
  • destory() : Filter๊ฐ€ ์†Œ๋ฉธ๋  ๋•Œ ์ˆ˜ํ–‰๋˜๋Š” ๋ฉ”์†Œ๋“œ

 

2-2) ํ•„ํ„ฐ(Filter)์˜ ์šฉ๋„ ๋ฐ ์˜ˆ์‹œ

  1. ๊ณตํ†ต ๋œ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ/์ธ๊ฐ€ ๊ด€๋ จ ์ž‘์—…
  2. ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•œ ๋กœ๊น…(Logging) ๋˜๋Š” ๊ฐ์‚ฌ
  3. ์ด๋ฏธ์ง€ / ๋ฐ์ดํ„ฐ ์••์ถ• ๋ฐ ๋ฌธ์ž์—ด ์ธ์ฝ”๋”ฉ
  4. Spring ๊ณผ ๋ถ„๋ฆฌ๋˜์–ด์•ผ ํ•˜๋Š” ๊ธฐ๋Šฅ

3) ํ•„ํ„ฐ(Filter) ๊ตฌํ˜„ ๋กœ๊ทธ

3) ํ•„ํ„ฐ ์ฒด์ธ (Filter Chain)

 

  • ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํ•„ํ„ฐ๊ฐ€ ๋ชจ์—ฌ์„œ ํ•˜๋‚˜์˜ ์ฒด์ธ์„ ํ˜•์„ฑ ํ•  ๋•Œ ์ฒซ๋ฒˆ์งธ ํ•„ํ„ฐ๊ฐ€ ๋ณ€๊ฒฝํ•˜๋Š” ์š”์ฒญ ์ •๋ณด๋Š” ํด๋ผ์ด์–ธํŠธ์˜ ์š”์ฒญ ์ •๋ณด๊ฐ€ ๋˜์ง€๋งŒ, ์ฒด์ธ์˜ ๋‘๋ฒˆ์งธ ํ•„ํ„ฐ๊ฐ€ ๋ณ€๊ฒฝํ•˜๋Š” ์š”์ฒญ ์ •๋ณด๋Š” ์ฒซ๋ฒˆ์งธ ํ•„ํ„ฐ๋ฅผ ํ†ตํ•ด์„œ ๋ณ€๊ฒฝ๋œ ์š”์ฒญ ์ •๋ณด
  • User๊ฐ€ ๋ณด๋‚ธ Request(์š”์ฒญ) ์ •๋ณด๋Š” ๋ณ€๊ฒฝ์— ๋ณ€๊ฒฝ์— ๋ณ€๊ฒฝ์„ ๊ฑฐ๋“ญํ•˜๊ฒŒ ๋œ๋‹ค.
  • Response ์‹œ, ํ•„ํ„ฐ์˜ ์ ์šฉ ์ˆœ์„œ๊ฐ€ ์š”์ฒญ ๋•Œ์™€๋Š” ๋ฐ˜๋Œ€๋กœ ๋Œ์•„ ์˜จ๋‹ค.

 

FilterRegistrationBean

 

- Spring Framework ์—์„œ ์ œ๊ณตํ•˜๋Š” ํด๋ž˜์Šค ์ค‘ ํ•˜๋‚˜, ์„œ๋ธ”๋ฆฟ ํ•„ํ„ฐ๋ฅผ ๋“ฑ๋ก ํ•  ๋•Œ ์‚ฌ์šฉ

  - ํ•„ํ„ฐ์˜ URL ํŒจํ„ด, ํ•„ํ„ฐ ์ˆœ์„œ, ์ดˆ๊ธฐ ๋งค๊ฐœ ๋ณ€์ˆ˜ ๋“ฑ์„ ์„ค์ • ๊ฐ€๋Šฅ

@Bean
    public FilterRegistrationBean firstFilterRegister() {
        
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(new FirstFilter());
        //Bean์˜ ๋“ฑ๋ก ์ˆœ์„œ๋ฅผ ์„ค์ • ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ -> ์ž‘์€ ์ˆซ์ž ์ผ์ˆ˜๋ก ์šฐ์„ ์ˆœ์œ„๊ฐ€ ๋†’์•„์ง„๋‹ค.
        registrationBean.setOrder(1);
        
        return registrationBean;
    }

 

 

2. ์ธํ„ฐ์…‰ํŠธ(Interceptor)


1) ์ธํ„ฐ์…‰ํŠธ(Interceptor) ๋ž€?

 

- Spring์—์„œ ์ œ๊ณตํ•˜๋Š” ๊ธฐ์ˆ , Dispatcher Servlet ์ด ์ปจํŠธ๋กค๋Ÿฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์ „๊ณผ ํ›„์— Request์™€ Response์„ ์ฐธ์กฐ ํ•˜๊ฑฐ๋‚˜ ๊ฐ€๊ณต ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ ์ œ๊ณต

 

2) ์ธํ„ฐ์…‰ํŠธ(Interceptor)๋Š” ์™œ ์‚ฌ์šฉ ํ•˜๋Š”๊ฐ€?

 

(1)  ์ธํ„ฐ์…‰ํŠธ(Interceptor) ์ธํ„ฐํŽ˜์ด์Šค 3๊ฐ€์ง€ ๋ฉ”์†Œ๋“œ

  1. preHandle() : ์ปจํŠธ๋กค๋Ÿฌ ์ด์ „์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ์ „์ฒ˜๋ฆฌ ์ž‘์—…์ด๋‚˜ ์š”์ฒญ ์ •๋ณด๋ฅผ ๊ฐ€๊ณตํ•˜๊ฑฐ๋‚˜ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉ
  2. postHandle() : ์ปจํŠธ๋กค๋Ÿฌ ํ˜ธ์ถœ ๋œ ํ›„์— ์‹คํ–‰, ์ปจํŠธ๋กค๋Ÿฌ ์ดํ›„์— ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ํ›„ ์ฒ˜๋ฆฌ ์ž‘์—…์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
  3. afterCompletion() : ๋ชจ๋“  View์— ์ตœ์ข… ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ผ์„ ํฌํ•จํ•œ ๋ชจ๋“  ์ž‘์—…์ด ์™„๋ฃŒ๋œ ํ›„์— ์‹คํ–‰ 

(2)  ์ธํ„ฐ์…‰ํŠธ(Interceptor) ์šฉ๋„์˜ & ์˜ˆ์‹œ

  • ์„ธ๋ถ€์ ์ธ ๋ณด์•ˆ ๋ฐ ์ธ์ฆ / ์ธ๊ฐ€ ๊ณตํ†ต ์ž‘์—…
  • API ํ˜ธ์ถœ์— ๋Œ€ํ•œ ๋กœ๊น…(Logging) ๋˜๋Š” ๊ฐ์‚ฌ
  • Controller๋กœ ๋„˜๊ฒจ์ฃผ๋Š” ์ •๋ณด(Data)์˜ ๊ฐ€๊ณต

3) ์ธํ„ฐ์…‰ํŠธ(Interceptor) ๊ตฌํ˜„ ๋กœ๊ทธ

 

- Filter > Dispatcher Servlet > Intercepotor > Resource ์œผ๋กœ ๋„˜์–ด๊ฐ€๋Š” ๋กœ๊ทธ๋ฅผ ํ™•์ธ ๊ฐ€๋Šฅ

 

3. ํ•„ํ„ฐ(Filter) vs ์ธํ„ฐ์…‰ํ„ฐ(Interceptor) ์ฐจ์ด


๋ฐ˜์‘ํ˜•