Spring์์ ์ ๊ณตํ๋ AOP(Aspect Oriented Programming) ์ ํ ์ข ๋ฅ๋ก, ์ปจํธ๋กค๋ฌ ์คํ ์ /ํ์ ํน์ ๊ธฐ๋ฅ์ ์ํํ ์ ์๋ ๊ธฐ๋ฅ์ ๋๋ค. ์ฃผ๋ก ์ธ์ฆ ๋จ๊ณ๋ฅผ ์ฒ๋ฆฌ ํ๊ฑฐ๋, ๋ก๊น ํ๋๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. -> ๋น์ฆ๋์ค ๋ก์ง๊ณผ ๋ถ๋ฆฌ๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
HandlerInterceptor ์ธํฐํ์ด์ค๋ฅผ ๊ตฌํํ๊ณ , preHandle(),postHandle(), afterCompletion() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ์ฌ ์ปจํธ๋กค๋ฌ ์คํ ์ /ํ์ ํน์ ์์ ์ ์ํํ ์ ์์ต๋๋ค.
Interceptor๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ๋๊ฐ์ง ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
WebMvcConfigurer๋ฅผ ๊ตฌํํ์ฌ addInterceptors() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉ ํ์ฌ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋์ ๋ฐ๋ผ addPathPatterns() ๋ฅผ ์ฌ์ฉํ์ฌ ํน์ URL์๋ง ์ ์ฉํ ์๋ ์์ต๋๋ค.
@Interceptor๋ฅผ ์ฌ์ฉํ์ฌ Bean์ผ๋ก ๋ฑ๋กํ๋ ๋ฐฉ๋ฒ์ด ์์ต๋๋ค.
์ธํฐ์ ํธ๋ฅผ ์ฌ์ฉํ๋ฉด ๋ชจ๋ ์์ฒญ์์ ๊ณตํต์ ์ฌ์ฉํ๋ ๋ก์ง์ Interceptor์์ ์ฒ๋ฆฌํ ์ ์๊ธฐ ๋๋ฌธ์ ์ค๋ณต ์ฝ๋๋ฅผ ์ ๊ฑฐํ ์ ์์ต๋๋ค. ๋ํ ๋ก๊น , ์ธ์ฆ, ๊ถํ ๊ฒ์ฌ, ์บ์ ์ฒ๋ฆฌ ๋ฑ ๋ง์ ๊ธฐ๋ฅ์ ์ํํ ์ ์์ต๋๋ค.
์ด์ ์ ๊ณต๋ถํ Filter์ ๋ง์ด ์ ์ฌํ๋ค๊ณ ๋๊ผ์ต๋๋ค. Filter๊ฐ ๋จผ์ ์คํ๋๊ณ Interceptor๊ฐ ์คํ์ด ๋๋๋ฐ ์ด๋ ํ ์ฐจ์ด์ ์ด ์๋์ง ๊ถ๊ธํ์ฌ ์์๋ณด์์ต๋๋ค.
Filter | Interceptor | |
---|---|---|
์ ์ฉ ๋ฒ์ | ์๋ธ๋ฆฟ ์ปจํ ์ด๋์์ ์ฒ๋ฆฌ๋๋ ๋ชจ๋ ์์ฒญ์ ๋ํด ์ ์ฉ ๊ฐ๋ฅ | ์คํ๋ง์ DispathcherServlet์ด ์ฒ๋ฆฌํ๋ ์์ฒญ์ ๋ํด์๋ง ์ ์ฉ ๊ฐ๋ฅ |
์ฒ๋ฆฌ ์์ | ์์ฒญ ์ฒ๋ฆฌ ์ ํ๋ก ์ ์ฒ๋ฆฌ ํ ํ์ฒ๋ฆฌ ๊ฐ๋ฅ | ์์ฒญ ์ฒ๋ฆฌ ์ ์๋ง ์ ์ฒ๋ฆฌ ๊ฐ๋ฅ |
์ ์ฉ ๋ฐฉ๋ฒ | web.xml์ ๋ฑ๋กํ๊ฑฐ๋ @WebFilter ์ด๋ ธํ ์ด์ ์ ์ฌ์ฉํ์ฌ ๋ฑ๋ก | ์ธํฐ์ ํฐ๋ฅผ ๊ตฌํํ ํด๋์ค๋ฅผ ๋น์ผ๋ก ๋ฑ๋กํ๊ณ , ์ธํฐ์ ํฐ๋ฅผ ๋ฑ๋กํ๋ InterceptorRegistry ํด๋์ค์ addInterceptor() ๋ฉ์๋๋ฅผ ํธ์ถํ์ฌ ๋ฑ๋ก |
์ ์ฉ ์ฉ๋ | ์์ฒญ ๋ฐ ์๋ต์ ๋ํ ์ ์ญ์ ์ธ ์ฒ๋ฆฌ๊ฐ ํ์ํ ๊ฒฝ์ฐ | ํน์ ์ปจํธ๋กค๋ฌ์ ์์ฒญ์ ๋ํด ๊ณตํต์ ์ธ ์ ์ฒ๋ฆฌ ์์ ์ ์ํํ๊ฑฐ๋, ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ์์ฒญ์ ๋ง์์ผ ํ๋ ๊ฒฝ์ฐ |
@Auth์ ๊ฐ์ง Request๊ฐ ์ค๋ฉด ์ฟผ๋ฆฌ๋ฅผ ๊ฒ์ฌํ๋ ๋ก์ง์ ๋ง๋ค์ด๋ณด๊ฒ ์ต๋๋ค.
MvcConfig
@Configuration
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {
private final AuthInterceptor authInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
//addPathPatterns์ ๋ด๊ฐ ์ํ๋ ์ฃผ์๋ง ๋ฃ์ด๋ ๋๋ค.
registry.addInterceptor(authInterceptor).addPathPatterns("/api/private/*");
}
}
์คํ๋ง MVC์์ ์ธํฐ์ ํฐ๋ฅผ ์ค์ ํ๊ธฐ ์ํ MvcConfig์ ๋๋ค.
@Configuration ์ด๋
ธํ
์ด์
์ ์คํ๋ง ์ปจํ
์ด๋์๊ฒ ํด๋น ํด๋์ค๋ฅผ Bean ๊ตฌ์ฑ ํด๋์ค๋ก ์ธ์ํ๋๋ก ์ง์ ํ๋ ์ญํ ์ ํฉ๋๋ค. ํด๋น ์ด๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ฉด ์คํ๋ง์ ํด๋น ํด๋์ค๋ฅผ ๊ตฌ์ฑ ํด๋์ค๋ก ์ธ์ํ์ฌ, ์ ํ๋ฆฌ์ผ์ด์
์คํ ์์ Bean๋ค์ ์์ฑํ๊ณ ๊ตฌ์ฑํฉ๋๋ค.
@RequireArgsConstructor๋ ์์ฑ์๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ Lombok ์ด๋
ธํ
์ด์
์
๋๋ค.
WebMvcConfigurer addInterceptors() ๋ฉ์๋๋ฅผ ์ค๋ฒ๋ผ์ด๋ฉํ๋ฉด, ํด๋น ๋ฉ์๋์์ ์ธํฐ์ ํธ๋ฅผ ๋ฑ๋กํ ์ ์์ต๋๋ค. ๋ถ๊ฐ์ ์ผ๋ก addPathPatterns() ์ฌ์ฉํ์ฌ ํน์ URL์์๋ง ์๋ํ๊ฒ ํ ์ ์์ต๋๋ค.
AuthInterceptor
@Slf4j
@Component
public class AuthInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
URI uri = UriComponentsBuilder.fromUriString(request.getRequestURI())
.query(request.getQueryString())
.build()
.toUri();
boolean hasAnnotation = checkAnnotation(handler, Auth.class);
log.info("has Annotation : {}", hasAnnotation);
//Auth ๊ถํ์ ๊ฐ์ง ์์ฒญ์ ๋ํด์๋ง ์ธ์ ,์ฟ ํค ๋ฑ์ ๊ฒ์ฌ
if (hasAnnotation) { //๊ถํ ์ฒดํฌ
String query = uri.getQuery();
log.info("query : {}", query);
return query.contains("name=Chan");
}
//return value -> false : filter -> dispatcher -> interceptor -> ์ง์
๋ถ๊ฐ.
return true;
}
private boolean checkAnnotation(Object handler, Class clazz) {
//resource javascript, html ๋ ํต๊ณผ ์ํจ๋ค.
if (handler instanceof ResourceHttpRequestHandler) {
return true;
}
// annotation check
HandlerMethod method = (HandlerMethod) handler;
log.info("get annotation : {}", method.getMethodAnnotation(clazz));
log.info("get bean type : {}", method.getBeanType().getAnnotation(clazz));
if (method.getMethodAnnotation(clazz) != null ||
method.getBeanType().getAnnotation(clazz) != null) {
//Auth annotation ์ด ์์ผ๋ฉด true
return true;
}
return false;
}
}
checkAnnotation์์ @Auth์ ์ฌ๋ถ๋ฅผ ํ์ธํ์ฌ ๋ฆฌํดํฉ๋๋ค. ๋ง์ฝ @Auth๊ฐ ์ฌ์ฉ๋ Request๋ฉด ์ฟผ๋ฆฌ๋ฌธ์ ๊ฒ์ฌํ์ฌ name=Chan์ธ์ง ํ์ธํฉ๋๋ค. false๋ฉด ์ธํฐ์ ํฐ์ ์์ ์ข ๋ฃ๊ฐ ๋๊ธฐ ๋๋ฌธ์ Response๊ฐ์ ํด๋ผ์ด์ธํธ๋ ๋ฐ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค.
์คํ๊ฒฐ๊ณผ (์ฟผ๋ฆฌ๋ฌธ ์ผ์น)
{
"name": "Chan",
"age": 111
}
์คํ๊ฒฐ๊ณผ (์ฟผ๋ฆฌ๋ฌธ ๋ถ์ผ์น)
No Content
์คํ๊ฒฐ๊ณผ (@Auth ๋ฏธ์ฌ์ฉ
{
"name": "ใ ใ ใ ",
"age": 111
}