230605 SpringBoot AOP

Myung A Lee·2023년 6월 7일
0

SpringBoot

목록 보기
8/8
post-thumbnail

Spring Boot

AOP

  • AOP는 Aspect Oriented Programming의 약자로 관점 지향 프로그래밍이라고 불린다. 관점 지향은 어떤 로직을 기준으로 핵심적인 관점, 부가적인 관점으로 나누어서 보고 그 관점을 기준으로 모듈화 하겠다는 것이다.
  • 프로그램의 모든 흐름을 쫓아가는것은 자원이 너무 많이 필요하다. 그래서 대신 특정한 시점에 수행되는 프로그램을 만드는 것을 관점지향 프로그래밍이라고 한다.

Aspect-J

  • poing cut 표현식을 사용하여 특정 메서드 사용 전 후 에 처리를 도와주는 라이브러리

Interceptor

  • Controller 도착 전 특정 작업을 수행 하거나 Controller 를 지나 client 에 도착 전 특정 작업을 수행 할 수 있다.
  • preHandler -> @controller -> postHandler

InterCeptorConfig.java

package kr.co.gudi.config;

import java.util.ArrayList;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

import kr.co.gudi.utils.LoginCheck;

@Configuration // 설정 클래스라는 의미
public class InterCeptorConfig implements WebMvcConfigurer {
	
	
	@Autowired LoginCheck check;
	
	@Override
	public void addInterceptors(InterceptorRegistry registry) {
		// registry에 인터셉터 할 여러 내용이 추가 된다. 
		
		ArrayList<String> excludeList = new ArrayList<String>();
		// 일반적으로 메인,로그인,css,회원가입과 관련된 url을 제외시킨다
		excludeList.add("/");
		excludeList.add("/login*");
		excludeList.add("/resources/**"); //** 디렉토리 이후 모든 경로는 다
		excludeList.add("/join*"); // *하나는 그냥 url 요청
		excludeList.add("/*.ajax"); // ajax로 끝나는 요청은 예외
		
		
		
		// 다형성에 의해 HandlerInterceptor 인터페이스를 구현받은 LoginCheck 가 들어갈 수 있땅
		registry.addInterceptor(check) // 1. 실행할 클래스
				.addPathPatterns("/**") // 2. 인터셉터를 적용할 url pattern
				.excludePathPatterns(excludeList); // 3.예외 패턴
	}
	
}

LoginCheck.java

package kr.co.gudi.utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class LoginCheck implements HandlerInterceptor {
	
	Logger logger = LoggerFactory.getLogger(getClass());
	
	// preHandle : Controller 전에 이곳을 지나친다.
	// return type이 boolean이다.
	// true : Controller 접근 허용 / false : Controller 접근 불가
	@Override
	public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {
		
		logger.info("preHandler : " + request.getRequestURI());
		
		// Controller로 가기전에 세션 검사를 해줄 것
		
		boolean pass = true;
		
		HttpSession session = request.getSession();
		if(session.getAttribute("loginId")==null) {
			response.sendRedirect("/");
			pass = false; // 단순히 거절만 해버리면 갈 곳이 없음 == 흰화면
		}
		
		return pass;
	}
	
	
	
	// postHandler : Controller를 지나간 이후에 이곳에 들른다. 
	// request / response 객체에 추가로 무언가를 담을 때 사용
	// ModelAndView 에 무언가 추가 할 사용 (**)

	@Override
	public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
			ModelAndView mav) throws Exception {
		logger.info("postHandler" );
		String loginId = (String) request.getSession().getAttribute("loginId");
		String content = "<div>안녕하세요"+loginId+"님! <a href=\"logout.do\">[로그아웃]</a></div>";
		mav.addObject("loginBox",content);
	}
	
	

}

0개의 댓글