๐œ‹ 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
๊ทธ๋Ÿผ ๋‹ค์Œ์— ๊ฑด๊ฐ•ํ•œ ๋ชจ์Šต์œผ๋กœ ๋งŒ๋‚˜์š” ~ ห“ห“เธโ‚โธโธŒฬฃสทฬฃฬซโธฬฃโธŒโ‚Žเธ„ห’ห’

์ข‹์€ ์›นํŽ˜์ด์ง€ ์ฆ๊ฒจ์ฐพ๊ธฐ