๐ Spring Boot Interceptor (เธ โขฬฯโขฬ)เธ
Spring Boot์์ Interceptor์ ๋ํด ์์๋ณด๊ธฐ! (เธ โขฬฯโขฬ)เธ
- ์ฌ์ฉ IDE : IntelliJ IDEA Ultimate
- ์ฌ์ฉ DB : MySQL
- ์ฌ์ฉ ์ธ์ด & SDK : Java & Amazon correto 11
- ์ ๋ฆฌ๋ณธ์ ๋๋ค ์ฐธ๊ณ ์ฉ์ผ๋ก๋ง ๋ด์ฃผ์ธ์ :D
- ํ์๊ด๋ฆฌ ์์ ์์ ์งํํ ์์ ์ ๋๋ค!
๊ถ๊ธํ์ ๋ถ๋ค์ ์ ์ ๋ด์ฉ์ ์ฐธ๊ณ ํด๋ณด์ธ์ :D
์ด์ ๊ธ
ฮธ Spring Boot ์์ 1 (ํ์๊ด๋ฆฌ)
๐ Spring Boot ์์ 2 (ํ์๊ด๋ฆฌ)
๐ Spring Boot ์์ 3 (ํ์๊ด๋ฆฌ)
๐ Spring Boot ์์ 4 (ํ์๊ด๋ฆฌ)
๐ Spring Boot ํ์๊ด๋ฆฌ TEST ๋ชจ์
๐ Spring Boot Mybatis ์ฌ์ฉ๋ฒ
Interceptor
Interceptor๋ ๋จ์ด ๋ป ๊ทธ๋๋ก ๊ฐ๋ก์ฑ๋ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ์ดํดํ๊ธฐ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค!
์ผํ๋ชฐ๊ฐ์ ์ฌ์ดํธ์์ ๋ก๊ทธ์ธ์์ด ์ฅ๋ฐ๊ตฌ๋๋ฅผ ๋๋ฅด๋ฉด ๋ก๊ทธ์ธํ์ด์ง๋ก ๋์ด๊ฐ๋ ๊ทธ ์ํฉ
๋ง์ด ๊ฒช์ด๋ณด์ ์ ์์ผ์์ฃ ??
์ฌ์ฉ์๊ฐ ํ์ ๊ธฐ๋ฅ(ex : ๋ก๊ทธ์ธ)์ ์ํํ์ง ์๊ณ ํ์ ๊ธฐ๋ฅ์ ์กฐ๊ฑด์ผ๋ก ํ๋ ์์
(ex : ์ฅ๋ฐ๊ตฌ๋)๋ฅผ ์ํํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์ญํ ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค!!
์ ๋ ๋ก๊ทธ์ธ์ ๋จผ์ ์ํํ๊ฒ ํ๋๊ฒ์ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
๊ทธ๋ผ ์ง๊ธ๋ถํฐ ์์๋ณด๋ฌ ๊ฐ์๋ค สใฃโขแดฅโขสใฃ
LoginCheck์ฉ Interceptor Class
// ์ธํฐ์
ํฐ ํด๋์ค๋ HandlerInterceptor ๋ฅผ ์ํ ๋ฉ์๋๋ฅผ ์ฐ๊ธฐ ์ํด implements ํด์ผํฉ๋๋ค.
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
// preHandle : ์ฌ์ ์ ์กฐ์ํ๋ค.
// ์ปจํธ๋กค๋ฌ์ ๊ฐ๊ธฐ ์ Interceptor์์ ์บ์นํด์ ๋ค๋ฅธ ์์
์ ์ํํ๊ฒ ๋ณด๋.
// HttpServletRequest : ๊ฐ์ข
ํด๋์ค๋ฅผ ์์ฒญํ๊ฒ ํด์ฃผ๋ ๋ฉ์๋. ์คํ๋ง์์๋ ๊ตณ์ด ์์จ๋ ๋ค ์ก์์ฃผ์ง๋ง ๊ทผ๋ณธ์ ์ผ๋ก๋ ์ด ๋ฉ์๋๊ฐ ํ์์ด๋ค.
// ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ฃผ์
String requestURI = request.getRequestURI();
System.out.println("requestURI = " + requestURI);
// ์ธ์
๊ฐ์ ธ์ด
HttpSession session = request.getSession();
// ์ธ์
์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์๋์ง ํ์ธ
if (session.getAttribute(SessionConst.LOGIN_EMAIL)==null) {
// ๋ฏธ ๋ก๊ทธ์ธ ์ํ
// ๋ก๊ทธ์ธ์ ํ์ง ์์ ๊ฒฝ์ฐ ๋ฐ๋ก ๋ก๊ทธ์ธํ์ด์ง๋ก ๋ณด๋ด๊ณ , ๋ก๊ทธ์ธ์ ํ๋ฉด ์์ฒญํ ํ๋ฉด์ ๋ณด์ฌ์ค.
session.setAttribute("redirectURL", requestURI);
response.sendRedirect("/member/login");
return false;
} else {
// ๋ก๊ทธ์ธ ์ํ
return true;
}
}
์ ์ฝ๋๋ ์ฃผ์์์ ์ ์ ์๋ฏ์ด Controller์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ๋ก๊ทธ์ธ ๊ฒ์ฆ์ ํ ๋ค,
๋ก๊ทธ์ธ์ด ํ์ํ๋ค๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ & ์ฌ์ฉ์๊ฐ ์ด์ ์ ์์ฒญํ ์ฃผ์๋ก ๋ณด๋ด๊ธฐ ์ํ ์์
์ ํ๋ ํด๋์ค๋ผ ๋ณด์๋ฉด ๋ฉ๋๋ค.
์ด์ ์ฌ์ฉ์๊ฐ ํน์ ์ฃผ์๋ฅผ ์์ฒญ ํ์ ๋ Interceptor๋ฅผ ์ํํ๊ฒ ํ๋ ํด๋์ค๋ฅผ ๋ง๋ค๋ฌ ๊ฐ๋ด
์๋ค!
WebConfig Class
// @Configuration : ์ค์ ์ ๋ณด๋ฅผ ์คํ๋ง ์คํ ์ ๋ฑ๋กํด์ค
// ์ฐจํ์ ํ์ธํ ๋ ๋ถํธํ๋ค๋ฉด ์๋ @Configuration ์ ์ฃผ์์ฒ๋ฆฌํ๋ฉด ๋จ
@Configuration
public class WebConfig implements WebMvcConfigurer {
// WebMVCConfigurer์ ์ํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด implements ํ๊ธฐ!
// ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ฅธ ์ ์ ๊ฐ๋ฅ ํ์ด์ง ๊ตฌ๋ถ
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginCheckInterceptor())
// ์๊น ๋ง๋ LoginCheckInterceptor ํด๋์ค ๋ด์ฉ์ ๋๊น
.order(1)
// order : ํด๋น ์ธํฐ์
ํฐ๊ฐ ์ ์ฉ๋๋ ์์, 1์ด๋ฉด ์ฒซ๋ฒ์งธ๋ก ์คํ
.addPathPatterns("/**")
// ํ์ฌ ํ๋ก์ ํธ์ ๋ชจ๋ ์ฃผ์์ ๋ํด ์ธํฐ์
ํฐ๋ฅผ ์ ์ฉ
.excludePathPatterns("/", "/member/save", "/member/login","/member/logout", "/css/**");
// ๊ทธ์ค์ ์ด ์ฃผ์๋ ์ ์ธ
}
}
์ง๊ธ ๋ง๋ ํด๋์ค๋ ์๊น ๋ง๋ ํด๋์ค๋ฅผ ์ด๋ค ์ฃผ์์ ๋ช๋ฒ์งธ๋ก ํน์ ์ฃผ์๋ฅผ ์ ์ธํ๊ณ ์คํํ ๊ฑด์ง ๊ฒฐ์ ํด ์ฃผ๋ ํด๋์ค์
๋๋ค. ํด๋น ํด๋์ค๊ฐ ์๋ค๋ฉด, ๋๋ @Configuration๊ฐ ์๋ค๋ฉด ์ธํฐ์
ํฐ๋ ์คํ๋์ง ์์ต๋๋ค.
์ด์ ์ธํฐ์
ํฐ๋ฅผ ์ํ ์ค๋น๋ ๋๋ฌ์ผ๋ Controller๋ก ๋์ด๊ฐ๋ด
์๋ค! ูฉ( แ )ู
Controller
- WebConfig์์ ์ฃผ์์ค์ ์ ํ๊ธฐ ๋๋ฌธ์ ์ปจํธ๋กค๋ฌ์ ๋ฉ์๋๋ฅผ ๋ฐ๋ก ๋ง๋ค ํ์๋ ์์ต๋๋ค.
์ ์ ๋ง๋ ๋ก๊ทธ์ธ ๋ฉ์๋์ ๋ด์ฉ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํด๋ณด๋ฌ ๊ฐ์๋ค!!
// ๋ก๊ทธ์ธ
@PostMapping("login")
public String login(@ModelAttribute MemberLoginDTO memberLoginDTO, HttpSession session) {
System.out.println("MemberController.login");
if (ms.login(memberLoginDTO)) {
session.setAttribute(LOGIN_EMAIL,memberLoginDTO.getMemberEmail());
// return "member/mypage"; // ๊ธฐ์กด ๋ฆฌํด
String redirectURL = (String) session.getAttribute("redirectURL");
// ์ธํฐ์
ํฐ๋ฅผ ๊ฑฐ์ณ์ ์ค๋ฉด redirectURL์ ๊ฐ์ด ์์๊ฒ์ด๊ณ ,
// ๊ทธ๋ฅ ๋ก๊ทธ์ธ์ ํด์ ์ค๋ฉด redirectURL์ ๊ฐ์ด ์์๊ฒ์.
// ๋ฐ๋ผ์ if else๋ก ๊ตฌ๋ถํด์ค
if (redirectURL != null) {
return "redirect:"+redirectURL;
// ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ฃผ์๋ก ๋ณด๋ด์ฃผ๊ธฐ ์ํด ๋ฆฌํด๊ฐ์ ์์ ๊ฐ์ด ์ธํ
} else {
return "redirect:/";
// ๋ก๊ทธ์ธ์ด ์ด๋ฏธ ๋ ํ์์ด๋ฏ๋ก index ํ์ด์ง๋ก ๊ฐ๊ฒ ์ค์
}
} else {
return "member/login";
}
}
์์ ๊ฐ์ด ์ปจํธ๋กค๋ฌ์์์ ์ค์ ๋ ๋๋ฌ๋ค๋ฉด ์ด์ Interceptor๊ฐ ์๋๋๋ ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ฒ๋๋ค!!
์ด๋ ๊ฒ ํ์๊ด๋ฆฌ ์์ ๋ ๋๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์ ์๊ฐ์๋ ๊ฒ์๊ธ ๊ด๋ฆฌ ์์ ๋ก ๋์์ฌํ
๋ ๊ทธ ์ ๊น์ง๋ ํ์๊ด๋ฆฌ๋ฅผ ๋ณต์ตํ๋ฉด ์ข์๊ฑฐ๊ฐ์ต๋๋ค. :D
๊ทธ๋ผ ๋ค์์ ๊ฑด๊ฐํ ๋ชจ์ต์ผ๋ก ๋ง๋์ ~ หหเธโโธโธฬฃสทฬฃฬซโธฬฃโธโเธหห
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ Spring Boot Interceptor (เธ โขฬฯโขฬ)เธ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค
https://velog.io/@ohjs813/Spring-Boot-Interceptor
์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์
๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ
์ธ ๋ฐ๊ฒฌ์ ์ ๋
(Collection and Share based on the CC Protocol.)
Interceptor๋ ๋จ์ด ๋ป ๊ทธ๋๋ก ๊ฐ๋ก์ฑ๋ ๊ธฐ๋ฅ์ ์ํํฉ๋๋ค.
์๋ฅผ ๋ค๋ฉด ์ดํดํ๊ธฐ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค!
์ผํ๋ชฐ๊ฐ์ ์ฌ์ดํธ์์ ๋ก๊ทธ์ธ์์ด ์ฅ๋ฐ๊ตฌ๋๋ฅผ ๋๋ฅด๋ฉด ๋ก๊ทธ์ธํ์ด์ง๋ก ๋์ด๊ฐ๋ ๊ทธ ์ํฉ
๋ง์ด ๊ฒช์ด๋ณด์ ์ ์์ผ์์ฃ ??
์ฌ์ฉ์๊ฐ ํ์ ๊ธฐ๋ฅ(ex : ๋ก๊ทธ์ธ)์ ์ํํ์ง ์๊ณ ํ์ ๊ธฐ๋ฅ์ ์กฐ๊ฑด์ผ๋ก ํ๋ ์์
(ex : ์ฅ๋ฐ๊ตฌ๋)๋ฅผ ์ํํ๋ ๊ฒ์ ๋ฐฉ์งํ๋ ์ญํ ์ด๋ผ๊ณ ๋ณผ ์ ์์ต๋๋ค!!
์ ๋ ๋ก๊ทธ์ธ์ ๋จผ์ ์ํํ๊ฒ ํ๋๊ฒ์ ๋ง๋ค์ด๋ณด๋๋ก ํ๊ฒ ์ต๋๋ค!
๊ทธ๋ผ ์ง๊ธ๋ถํฐ ์์๋ณด๋ฌ ๊ฐ์๋ค สใฃโขแดฅโขสใฃ
// ์ธํฐ์
ํฐ ํด๋์ค๋ HandlerInterceptor ๋ฅผ ์ํ ๋ฉ์๋๋ฅผ ์ฐ๊ธฐ ์ํด implements ํด์ผํฉ๋๋ค.
public class LoginCheckInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws IOException {
// preHandle : ์ฌ์ ์ ์กฐ์ํ๋ค.
// ์ปจํธ๋กค๋ฌ์ ๊ฐ๊ธฐ ์ Interceptor์์ ์บ์นํด์ ๋ค๋ฅธ ์์
์ ์ํํ๊ฒ ๋ณด๋.
// HttpServletRequest : ๊ฐ์ข
ํด๋์ค๋ฅผ ์์ฒญํ๊ฒ ํด์ฃผ๋ ๋ฉ์๋. ์คํ๋ง์์๋ ๊ตณ์ด ์์จ๋ ๋ค ์ก์์ฃผ์ง๋ง ๊ทผ๋ณธ์ ์ผ๋ก๋ ์ด ๋ฉ์๋๊ฐ ํ์์ด๋ค.
// ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ฃผ์
String requestURI = request.getRequestURI();
System.out.println("requestURI = " + requestURI);
// ์ธ์
๊ฐ์ ธ์ด
HttpSession session = request.getSession();
// ์ธ์
์ ๋ก๊ทธ์ธ ์ ๋ณด๊ฐ ์๋์ง ํ์ธ
if (session.getAttribute(SessionConst.LOGIN_EMAIL)==null) {
// ๋ฏธ ๋ก๊ทธ์ธ ์ํ
// ๋ก๊ทธ์ธ์ ํ์ง ์์ ๊ฒฝ์ฐ ๋ฐ๋ก ๋ก๊ทธ์ธํ์ด์ง๋ก ๋ณด๋ด๊ณ , ๋ก๊ทธ์ธ์ ํ๋ฉด ์์ฒญํ ํ๋ฉด์ ๋ณด์ฌ์ค.
session.setAttribute("redirectURL", requestURI);
response.sendRedirect("/member/login");
return false;
} else {
// ๋ก๊ทธ์ธ ์ํ
return true;
}
}
์ ์ฝ๋๋ ์ฃผ์์์ ์ ์ ์๋ฏ์ด Controller์ ์์ฒญ์ ๋ณด๋ด๊ธฐ ์ ๋ก๊ทธ์ธ ๊ฒ์ฆ์ ํ ๋ค,
๋ก๊ทธ์ธ์ด ํ์ํ๋ค๋ฉด ๋ก๊ทธ์ธ ํ์ด์ง๋ก ์ด๋ & ์ฌ์ฉ์๊ฐ ์ด์ ์ ์์ฒญํ ์ฃผ์๋ก ๋ณด๋ด๊ธฐ ์ํ ์์
์ ํ๋ ํด๋์ค๋ผ ๋ณด์๋ฉด ๋ฉ๋๋ค.
์ด์ ์ฌ์ฉ์๊ฐ ํน์ ์ฃผ์๋ฅผ ์์ฒญ ํ์ ๋ Interceptor๋ฅผ ์ํํ๊ฒ ํ๋ ํด๋์ค๋ฅผ ๋ง๋ค๋ฌ ๊ฐ๋ด
์๋ค!
// @Configuration : ์ค์ ์ ๋ณด๋ฅผ ์คํ๋ง ์คํ ์ ๋ฑ๋กํด์ค
// ์ฐจํ์ ํ์ธํ ๋ ๋ถํธํ๋ค๋ฉด ์๋ @Configuration ์ ์ฃผ์์ฒ๋ฆฌํ๋ฉด ๋จ
@Configuration
public class WebConfig implements WebMvcConfigurer {
// WebMVCConfigurer์ ์ํ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด implements ํ๊ธฐ!
// ๋ก๊ทธ์ธ ์ฌ๋ถ์ ๋ฐ๋ฅธ ์ ์ ๊ฐ๋ฅ ํ์ด์ง ๊ตฌ๋ถ
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginCheckInterceptor())
// ์๊น ๋ง๋ LoginCheckInterceptor ํด๋์ค ๋ด์ฉ์ ๋๊น
.order(1)
// order : ํด๋น ์ธํฐ์
ํฐ๊ฐ ์ ์ฉ๋๋ ์์, 1์ด๋ฉด ์ฒซ๋ฒ์งธ๋ก ์คํ
.addPathPatterns("/**")
// ํ์ฌ ํ๋ก์ ํธ์ ๋ชจ๋ ์ฃผ์์ ๋ํด ์ธํฐ์
ํฐ๋ฅผ ์ ์ฉ
.excludePathPatterns("/", "/member/save", "/member/login","/member/logout", "/css/**");
// ๊ทธ์ค์ ์ด ์ฃผ์๋ ์ ์ธ
}
}
์ง๊ธ ๋ง๋ ํด๋์ค๋ ์๊น ๋ง๋ ํด๋์ค๋ฅผ ์ด๋ค ์ฃผ์์ ๋ช๋ฒ์งธ๋ก ํน์ ์ฃผ์๋ฅผ ์ ์ธํ๊ณ ์คํํ ๊ฑด์ง ๊ฒฐ์ ํด ์ฃผ๋ ํด๋์ค์
๋๋ค. ํด๋น ํด๋์ค๊ฐ ์๋ค๋ฉด, ๋๋ @Configuration๊ฐ ์๋ค๋ฉด ์ธํฐ์
ํฐ๋ ์คํ๋์ง ์์ต๋๋ค.
์ด์ ์ธํฐ์
ํฐ๋ฅผ ์ํ ์ค๋น๋ ๋๋ฌ์ผ๋ Controller๋ก ๋์ด๊ฐ๋ด
์๋ค! ูฉ( แ )ู
์ ์ ๋ง๋ ๋ก๊ทธ์ธ ๋ฉ์๋์ ๋ด์ฉ์ ์ถ๊ฐํ๊ธฐ๋ง ํ๋ฉด ์ฌ์ฉ์ด ๊ฐ๋ฅํ๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ํด๋ณด๋ฌ ๊ฐ์๋ค!!
// ๋ก๊ทธ์ธ
@PostMapping("login")
public String login(@ModelAttribute MemberLoginDTO memberLoginDTO, HttpSession session) {
System.out.println("MemberController.login");
if (ms.login(memberLoginDTO)) {
session.setAttribute(LOGIN_EMAIL,memberLoginDTO.getMemberEmail());
// return "member/mypage"; // ๊ธฐ์กด ๋ฆฌํด
String redirectURL = (String) session.getAttribute("redirectURL");
// ์ธํฐ์
ํฐ๋ฅผ ๊ฑฐ์ณ์ ์ค๋ฉด redirectURL์ ๊ฐ์ด ์์๊ฒ์ด๊ณ ,
// ๊ทธ๋ฅ ๋ก๊ทธ์ธ์ ํด์ ์ค๋ฉด redirectURL์ ๊ฐ์ด ์์๊ฒ์.
// ๋ฐ๋ผ์ if else๋ก ๊ตฌ๋ถํด์ค
if (redirectURL != null) {
return "redirect:"+redirectURL;
// ์ฌ์ฉ์๊ฐ ์์ฒญํ ์ฃผ์๋ก ๋ณด๋ด์ฃผ๊ธฐ ์ํด ๋ฆฌํด๊ฐ์ ์์ ๊ฐ์ด ์ธํ
} else {
return "redirect:/";
// ๋ก๊ทธ์ธ์ด ์ด๋ฏธ ๋ ํ์์ด๋ฏ๋ก index ํ์ด์ง๋ก ๊ฐ๊ฒ ์ค์
}
} else {
return "member/login";
}
}
์์ ๊ฐ์ด ์ปจํธ๋กค๋ฌ์์์ ์ค์ ๋ ๋๋ฌ๋ค๋ฉด ์ด์ Interceptor๊ฐ ์๋๋๋ ํ๋ก์ ํธ๊ฐ ์์ฑ๋๊ฒ๋๋ค!!
์ด๋ ๊ฒ ํ์๊ด๋ฆฌ ์์ ๋ ๋๋ง์น๋๋ก ํ๊ฒ ์ต๋๋ค.
๋ค์ ์๊ฐ์๋ ๊ฒ์๊ธ ๊ด๋ฆฌ ์์ ๋ก ๋์์ฌํ
๋ ๊ทธ ์ ๊น์ง๋ ํ์๊ด๋ฆฌ๋ฅผ ๋ณต์ตํ๋ฉด ์ข์๊ฑฐ๊ฐ์ต๋๋ค. :D
๊ทธ๋ผ ๋ค์์ ๊ฑด๊ฐํ ๋ชจ์ต์ผ๋ก ๋ง๋์ ~ หหเธโโธโธฬฃสทฬฃฬซโธฬฃโธโเธหห
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ Spring Boot Interceptor (เธ โขฬฯโขฬ)เธ), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@ohjs813/Spring-Boot-Interceptor์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค