728x90

 

인터셉터란?

컨트롤러(Controller)의 '핸들러(Handler)'를 호출하기 전과 후에 요청과 응답을 참조하거나 가공할수 있는 일종의 필터

interceptor 란 단어는 '낚아채다'라는 의미.

해당 단어의 의미와 같이 사용자 요청에 의해 서버에 들어온

Request 객체를 컨트롤러의 핸들러(사용자가 요청한 url에 따라 실행되어야 할 메서드, 이하 핸들러)로

도달하기 전에 낚아채서 개발자가 원하는 추가적인 작업을 한후 핸들러로 보낼수 있도록 해주는것이 인터셉터

 

사용 목적

개발자는 특정 Controller의 핸들러가 실행되기 전이나 후에 추가적인 작업을 원할때 Interceptor를 사용

(추가적인 작업으로는 로그인체크, 권한 체크 등이 있다.)

 

적용해야할 핸들러가 수천개가 된다면 어떻게될까?

크게 두가지 문제가 생긴다.

1) 메모리 낭비, 서버의 부하 증가

    - 적용해야할 핸들러만 수만큼 세션체크 코드를 작성함으로써 반복되는 코드들이 매우 많아지기 때문

2) 코드의 누락

 

 

 

(Interceptor, AOP도 요청을 가로채는 녀석)

 

인터셉터가 들어갈 수 있는 시점 3가지

(인터셉터가 사용할 수 있는 메소드 3가지)

  1. preHandle()
  2. postHandle()
  3. afterCompletion()

인터셉터 수행한다 = 인터셉터가 가로챈다

 

  1. preHandle() : Servlet이 Controller를 호출하기 전에 수행
  2. postHandle() : Controller에서 Servlet으로 리턴되는 순간에 수행
  3. afterCompletion() : 최종 결과를 생성하는 일을 포함한 모든 작업이 완료 된 후

 

최종결과란 뷰까지 다 처리한 상태를 의미

(모든 View에서 최종 결과를 생성하는 일을 포함한 모든 작업이 완료된 후에 실행)

 

Q.뷰까지 다 처리됬다는게 클라이언트에 리스폰스까지 끝난거를 의미한건가요?

A.응답이 다 끝났으니까 그때 인터셉터를 실행한다는 의미

 

※ 필터(Filter)와 인터셉터(Interceptor)의 사용처 차이

필터 인코딩처리에 많이 사용

인터셉터 : 로그인처리에 많이 사용

장바구니 눌렀다가 로그인이 안되어있으면 로그인으로 가는게 인터셉터

이거는 프리핸들러로 구분될 것임. 장바구니 쓸려는 컨트롤러 수행전에 해야하는 것이기 때문

  • 적용되는 위치 차이
  • 필터 : 자바
  • 인터셉터 : 스프링
728x90
반응형
728x90

Filter

이클립스 new에서 Filter 항목 클릭하면 자동생성됨

인코딩 코드 추가: request.setCharacterEncoding("UTF-8");

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

		request.setCharacterEncoding("UTF-8");
		
		chain.doFilter(request, response);
	}

 

추가로 필터는 Annotation이 @WebFilter이다

 

Exception

1) 클래스생성

2) 클래스 기본생성자 생성

public MemberException() {}

3) 예외처리해줄 메소드 생성 + super()

	public MemberException(String msg) {
			super (msg);
	}

 

 

Filter

package common;

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;

/**
 * Servlet Filter implementation class CommonFilter
 */
@WebFilter("/CommonFilter")
public class CommonFilter implements Filter {

    /**
     * Default constructor. 
     */
    public CommonFilter() {
        // TODO Auto-generated constructor stub
    }

	/**
	 * @see Filter#destroy()
	 */
	public void destroy() {
		// TODO Auto-generated method stub
	}

	/**
	 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain)
	 */
	
	
	
	
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {

		request.setCharacterEncoding("UTF-8");
		
		chain.doFilter(request, response);
	}

	
	
	
	/**
	 * @see Filter#init(FilterConfig)
	 */
	public void init(FilterConfig fConfig) throws ServletException {
		// TODO Auto-generated method stub
	}

}

 

 

 

Exception

package member.model.vo;

public class MemberException extends Exception {
	public MemberException() {}
	public MemberException(String msg) {
			super (msg);
	}
}

 

728x90
반응형
728x90

015. 함수 filter, lambda

 

 

일단 필터함수랑 람다함수 각각 먼저 알아보자

 

1.filter()

  • 걸러낸다는 뜻. 함수도 동일한 의미
  • 두번째 인수(반복 가능한 자료형) 첫 번째 인수(함수명)에 입력되었을 때,  '반환 값이 참인 것만 걸러 내서 돌려준다.'

 

1)형태

filter(function, iterable)
filter(함수명, 반복가능한 자료형)

 

2)세부 내용

filter(함수명, 반복가능한 자료형)

  • 함수명(function) : True or False로만 반환
  • 반복가능한 자료형(iterable) : 함수에 차례로 들어갈 반복 가능한(iterable) 인수(instance)
instance
클래스로 만든 객체

 - 객체와 구분, 어떤 클래스의 객체인지 관련지어 얘기할 때 인스턴스라고 부른

 

3)특징

  • 여러 데이터 중에 일부만 추려낼 때 사용
  • 따라서, 보통 list,tuple을 대상으로 주로 사용함
  • filter()는 filter값으로만 리턴함
  • 결과값이 참인 것만 결과값을 돌려줌. False는 다 버리고 True만 줌
  • filter() 함수의 결과값을 list로 변환하는 가장 쉬운 방법은 list() 내장 함수를 사용하는 것.
  • 마찬가지로 tuple도 내장함수 tuple() 사용

 

이제 직접해보자

보다시피 filter()가 filter값으로 낸다는 의미를 알것이다. 이상한 숫자와 알파벳이 섞여있다

이를 사람이 알기 쉽게 변환할 수 있도록 하는게 list나 tuple로 바꿔주는 것이다. 그래서 아래에서 list()를 추가하였고, 

0보다 큰 [1,2] 값을 리턴한 것.

 

filter() 함수를 쉽게 한마디로 설명하자면 def 함수와 연계하여 함수의 조건을 충분하는 True값만 걸러서 추출한다고 생각하면 되겠다

 


2.lambda

def와 동일한 역할을 하는 녀석

1)형태

lambda 매개변수1,매개변수2... : 매개변수를 이용한 표현식

 

* 매개변수(parameter)와 인자(arguement)란?

def add(x,y):  # (x,y)가 매개변수(parameter)
	return x + y
    
z = add(4,-5)  # (4,-5)가 인자(argument)
print(z)

위의 def 함수를 lambda 함수로 전환해보면,

# lambda 함수로 변환

add = lambda x,y : x + y
z = add(4,-5)
print(z)

실제로 해보면, 결과값 또한 똑같게 잘나온다

 

2)특징

언제 사용하는가?

def를 사용할 필요없이 간단하거나, def를 사용할 수 없는 곳에 주로 사용

위의 filter() 함수식은 람다함수를 사용하면 더 간편하게 코드 작성가능

 

 

 

728x90
반응형

+ Recent posts