[spring boot 개념] 필터란 무엇인가? (feat. annotation)

이경민·2022년 7월 19일
0

spring

목록 보기
4/20

스프링은 엄청 많은 필터를 갖고 있다.

스프링 자체가 기본 필터들 갖고 있으며 직접 필터 생성이 가능하다. 주로 Spring Framework에서는 request/response의 logging 용도로 활용하거나 인증 관련 Logic들을 해당 Filter에서 처리. 이를 선/후 처리하여 Service business logic과 분리한다.

1) 필터 (Filter): Web Application에서 관리되는 영역

문지기 (임무가 주어치면 처리한다). Spring boot Framework에서 Client로부터 오는 요청/응답 대해 최초/최종 단계의 위치에 존재한다. 이를 통해 요청/응답의 정보 변경 OR Spring에 의해 데이터 변환 전 순수한 Client의 요청/응답 값 확인 가능하다.

2) 톰캣: 흔히 WAS(Web Application Service)라고 한다

  • 아피치 sw 재단의 application server로서 자사 sublet을 실행하고 JSP(Java Server Pages)가 포함된 웹 페이지를 생성.
  • 웹 서버와 연동해 실행 가능항 자바 환경 제공.
  • 주로 XML 파일을 편집해 설정.
  • 톰캣의 필터는 인터셉터 (AOP: 핕터와 기능이 비슷하다. 권한이 있으면 들어오도록, 없으면 나가도록 해준다)

3) 인터셉터: 무언가를 가로챈다.

컨트롤러의 uri에 접근하는 과정에서 무언가를 제어할 필요가 있을 때 사용. 로그인 권한 관련 처리 등을 인터셉터를 이용해 효율적으로 처리 가능.

  • 인터셉터 추가: org.springframework.web.servlet의 HandlerInterceptor 인터페이스를 구현 (implements)
public interface HandlerInterceptor { 
	default boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 
        throws Exception { 
        	return true; 
        } 
        default void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable ModelAndView modelAndView) throws Exception { } 
        default void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, @Nullable Exception ex) throws Exception { } 
}

참고: https://mangkyu.tistory.com/173


스프링은 엄청 많은 어노테이션을 갖고 있다.

compile checking

  • 어노테이션 @ (주석+힌트): 컴파일러가 무시하지 않는다.
  • // (주석): 컴파일러가 무시하는 부분

예) Animal Method에 run이 존재 & Dog class가 Animal 상속을 한다.

그러면 Dog가 run 메소드를 재정의 할 수 있다. 이때 run 위에다가 @override를 사용하면 자바가 실행될 때 컴파일하면 Animal도 run method를 갖고 있을 것이라고 예상하고 확인한다. Animal에 run 메소드가 있으면 정상. 없으면 compile checking 시에 에러가 발생한다.

spring에서 어노테이션은 주로 객체를 생성한다.

  • @Component: 해당 클래스를 스캔해 heap 메모리에 로딩한다. (IoC)
  • @Bean: 스프링 컨테이너에 의해 만들어진 자바 객체
  • @Autowired: 로딩된 객체를 해당 변수에 집어 넣는다. heap 공간에 객체를 읽어 동일한 타입의 객체가 없다면 null, 있다면 heap에 올라온 객체를 넣는다. (DI)
  • @Controller: controller임을 나타내고 bean으로 등록되며 이 클래스가 controller로 사용됨을 spring framework에 알린다.
📝 spring에서는 개발자가 직접 new하는 방식 보다 IoC를 사용한다.
@Component
class A S ... // IoC   

spring이 해당 class를 읽어서(스캔) 자신이 들고 있는 메모리 공간(heap 안에)에 A라는 class를 로딩한다.

class B {         // A class 객체를 B에서 사용하고 싶으면
	A a = new A();  // 기존 A의 공간이 아닌 새로운 공간에 A 생성 
}
class B {          
	@Autowired    
	A a = new A();  // 기존 A의 공간이 아닌 새로운 공간에 A 생성 
}

리플렉션: 스캔할 때 어떤 class가 있는지 분석하는 기법.

런타임 시 분석하며, 어떤 메서드, 필드, 어노테이션이 있는지 확인 가능. (무엇을 할지도 설정 가능.)

  • Reflection API란?
    구체적인 클래스 타입을 알지 못해도 그 클래스 정보(메서드, 타입, 변수 등)에 접근 가능하게 해주는 자바 API. 따라서, 클래스의 이름만으로 해당 클래스의 정보를 가져올 수 있다. 사용 예시)
    public class Car {
        private final String name;
        private int position;
    
        public Car(String name, int position) {
            this.name = name;
            this.position = position;
        }
    
        public void move() {
            this.position++;
        }
    
        public int getPosition() {
            return position;
        }
    }
    public static void main(String[] args) {
        Object obj = new Car("foo", 0);  // 다형성 특징 (이와 같은 객체 생성 가능))
        obj.move();    // 컴파일 에러 발생 java: cannot find symbol
    }

0개의 댓글