[Spring Boot 게시판] 11일차

김정현·2022년 10월 11일
0

SPRINGBOOT게시판

목록 보기
10/36

1. 게시물 삭제 시도후 뒤로가기 또는 경로 재설정

1) 뒤로가기 메서드

        public static String jsHistoryBack(String msg) {
            if(msg==null) {
                msg = "";
            }
            return Ut.f("""
                    <script>
                    alert('%s');
                    history.back();
                    </script>
                    """
                    ,msg);
        }      
  • 삭제 실패시 history.back();를 이용해 뒤로가기 구현 메소드

2) 경로 재설정 메서드

  public static String jsReplace(String msg,String uri) {
            if(msg==null) {
                msg = "";
            }
            if(uri==null) {
                uri = "";
            }
            return Ut.f("""
                    <script>
                    alert('%s');
                    location.replace('%s');
                    </script>
                    """
                    ,msg,uri);
        }
  • 삭제 후 location.replace()를 통해 uri 경로로 이동 메서드

2. Rq클래스 도입, 로그인에 관한 중복 로직 제거

1) Rq 클래스

    public class Rq {
        @Getter
        private boolean isLogined;
        @Getter
        private int loginedMemberId;
    public Rq(HttpServletRequest req) {
        HttpSession httpSession = req.getSession();
        if (httpSession.getAttribute("loginedMemberId") != null) {
            this.isLogined = true;
            this.loginedMemberId = (int) httpSession.getAttribute("loginedMemberId");
        }
    }
  • 로그인에 관한 중복 로직을 제거하기 위해 Rq클래스를 구현
  • HttpServletRequest객체를 통해 로그인에 관한정보를 필드에 저장
  • 기존에는 각 메서드마다 httpSession을 이용해 로그인 관한 중복로직이 존재

2) ArticleController

    public ResultData<Article> doAdd(HttpServletRequest req, String title, String body) {
            Rq rq = new Rq(req);
        
        ~~생략~~
            
        if (rq.isLogined() == false) {
			return ResultData.from("F-A", "로그인 후 이용가능 합니다.");
		}
        ResultData<Integer> writeRd = articleService.writeArticle(rq.getLoginedMemberId(), title, body);
  • HttpSession 대신 HttpServletRequest를 인자로 받고
  • Rq클래스 객체 생성생성자로 전달받은 HttpServletRequest를 통해 로그인 관한 정보를 저장했으므로
  • rq객체의 필드를 이용해 로그인 관련 로직에 적용

3. 인터셉터

  • 인터셉터(Interceptor)는 스프링의 Spring Context(ApplicationContext) 기능으로 임의의 URI를 호출시 DispatcherServlet에서 해당 Controller가 처리되기 전과 후에 발생하는 이벤트이다.
  • 스프링에서도 말 그대로 중간에 요청을 가로채서 어떠한 일을 하는 것을 말한다. 인터셉터의 정식 명칭은 핸들러 인터셉터(Handler Interceptor)이다.
  • 클라이언트의 요청이 컨트롤러에 가기 전에 가로채고, 응답이 클라이언트에게 가기전에 가로챈다.
  • 즉, 인터셉터는 DispatcherServlet이 컨트롤러를 요청하기 전,후에 요청과 응답을 가로채서 가공할 수 있도록 해준다.
  • 예를 들어 로그인 기능이 있을 때, 로그인을 한 사람만 보이는 페이지가 있고, 로그인 한 사람만 글을 작성할 수 있다고 하자. 그러면 페이지 컨트롤러에서도 로그인 확인 로직이 들어가고, 글 작성 컨트롤러에서도 로그인 확인 로직이 들어가야 한다. 인터셉터를 사용하면 컨트롤러에 로직이 로그인 확인 로직이 없어도 컨트롤러에 들어가기전에 인터셉터에서 로그인 확인을 하고 컨트롤러로 보낸다. 즉, 하나의 인터셉터로 프로젝트 내의 모든 요청에 로그인 여부를 확인할 수 있다.

- 인터셉터 적용하기 -

4. Rq 객체를 BeforeActionInterceptor 에서 한번만 생성

    @Component
    public class BeforeActionInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception {
            Rq rq = new Rq(req);
            req.setAttribute("rq", rq);
            return HandlerInterceptor.super.preHandle(req, resp, handler);
        }
  • 기존에는 Rq객체를 각각의 컨트롤러에서 맵핑된 메서드에서 각각 만들어졌다.
  • 컨트롤러에 접근전에 인터셉터를 통해 Rq객체를 한번만 생성하여
  • HttpServletRequest req에 Rq객체를 저장

0개의 댓글