Spring 스프링 HandlerInterCeptor(+URL에서의 AOP)

Spring 스프링 HandlerInterCeptor(+URL에서의 AOP)

반응형

Spring 스프링 HandlerInterCeptor(+URL에서의 AOP)

AOP :(Aspect-oriented programming) 관점지향 프로그래밍

비지니스 로직 ->Domain 지식 필요

공통관심 사항-> Developer Service

이 두가지를 완전히 구분해놓고 설정파일 이나 어노테이션 을 이용해서 결합시켜나가는 프로그래밍 방식입니다.

(메소드에 동작)

DI : (Dependency Injection - 의존성 주입)

스프링에서는 이 두가지가 아주 중요합니다. 의미를 알고있어야합니다

(DI에 대한 설명은 첫 게시물에 나와있으니 참고*)

복잡한 로직을 구현할 때 이 방식(AOP)을 취합니다.

파이썬에서도 어노테이션@을 이용해서 이러한 구현이 어느정도 가능합니다.

spring에서는 url 에 반응하는 HandlerInterceptor 와 method 호출에 반응하는

AOP 2가지 형태로 구현이 되어있습니다.

HandlerInterceptor는 URL 에서 사용하는 방식입니다.

HandlerInterCeptor 에 대해서 먼저 알아보겠습니다.

**HandlerInterCeptor

=>AOP 구현을 위해 제공되는 인터페이스입니다.

인터셉터는,

주로 웹(URL)에서 로그인후 서비스를 이용하고 로그아웃하는 과정,

로그아웃 후 로그인을 했을 때 메인 페이지로 올바르게 가게 만드는 과정의 코드를 써줍니다.

1.메소드

1)preHandle : Controller의 요청 처리 메소드를 호출하기 전에 호출되는 메소드로 이 메소드에서

true를 리턴하면 Controller의 요청 처리 메소드로 이동하고 false를 리턴하면

Controller의 요청 처리 메소드로 가지 않습니다.

2)postHandle : Controller의 요청 처리 메소드가 처리를 전부 수행하고 View로 이동하기 직전에 호출되는

메소드로 예외가 발생하면 호출되지 않습니다.

3)afterCompletion : 요청을 전부 처리하고 난 후 호출되는 메소드로 예외 발생 여부에 상관없이

무조건 호출되는 메소드

먼저 WebSocket을 이용한 채팅 구현 이라는 링크를 누르면

로그인이 되지 않았을 시 로그인 후 이용할 수 있도록 구현해보겠습니다

1)HandlerInterceptor 인터페이스를 implements 한 클래스를 기본 패키지 안에 생성

=>com.pk.db.util.AuthInterceptor

package com.pk.db.util; import java.io.IOException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; //클래스 이름에 Adapter가 붙는 클래스는 //Adapter를 제외한 인터페이스가 존재하는데 //인터페이스는 모든 메소드를 재정의 해야 하고 Adapter 클래스는 필요한 메소드만 //재정의 하면 됩니다. //Bean을 자동 생성 해주는 어노테이션 : Component, Controller, Service, Repository //RestController @Component public class AuthInterceptor extends HandlerInterceptorAdapter { //Controller 로 가기 전에 호출되는 메소드 @Override public boolean preHandle( HttpServletRequest request, HttpServletResponse response, Object handle) { boolean result = false; //로그인이 안된 것을 확인 if(request.getSession().getAttribute("member") != null) { //true를 리턴하도록 만들면 원래 처리를 하러 이동 result = true; }else { try { //로그인이 안되어있으면 로그인 페이지로 이동 response.sendRedirect("login"); } catch (IOException e) { e.printStackTrace(); } } return result; } //요청을 정상적으로 처리하고 난 후 호출되는 메소드 @Override public void postHandle( HttpServletRequest request, HttpServletResponse response, Object handle, ModelAndView mav) { System.out.println("Controller의 요청을 정상으로 처리했습니다."); //보통 로그를 기록하는 경우가 많습니다. } }

2)sevlet-context.xml 파일에 interceptor 를 설정하는 코드를 추가

WebSocket을 이용한 채팅 구현 클릭

로그인 된 상태입니다

다시 3번째 클릭

채팅할수 있는 채팅창으로 이동하게됩니다^^

이것이 바로 HandlerInterCeptor 입니다

4. 이번에는 chat.jsp 파일에서 이름을 입력하지 않고 로그인 한 유저의 nickname을 이용해보겠습니다

=>로그인을 하면 session에 member라는 이름으로 Member 객체가 저장되어 있습니다.

기존의 위쪽 body 부분의 이름 부분 한줄을 지워 준 후

자바스크립트에서 메시지를 전송하는 send 메소드를 수정합니다

send = function(){ //입력한 내용을 WebSocket 서버에게 전달하고 message 란은 클리어 var nickname = '${member.nickname}'; var msg = document.getElementById("message").value; wsocket.send(nickname + ":" + msg); document.getElementById("message").value = ''; }

위의 입장 버튼을 누르면 연결이 되고,

채팅내용을 전송하면 자동으로 관리자: 라는 닉네임이 붙은 상태로 채팅서버에 참여하게됩니다.

​끝!

반응형

from http://bucheoneduc.tistory.com/35 by ccl(A) rewrite - 2021-12-27 17:00:50