H'academy
  • H'academy
  • Web
    • Back-end
      • Spring Framework
        • Spring 개발환경 구축
          • Project 생성
          • Maven 설정
          • Maven 저장소 위치 설정
          • Apache Tomcat 연동
          • Lombok 설정
        • Spring MVC Project
          • pom.xml
          • web.xml
          • root-context.xml
          • servlet-context.xml
          • DispatcherServlet
        • Controller
          • File Upload / Download
          • RestController(작성중)
        • Spring Test
          • Assert 단정문
          • Spring 환경 연동 테스트
          • MockMvc Test
        • Spring AOP
          • AOP 용어
          • Pointcut Expression
          • Filter
          • Interceptor
          • Filter vs Interceptor
          • Controller Advice(작성중)
        • Spring JDBC
          • DBCP
          • myBatis
            • ResultMap 활용
        • ETC
          • Logging
            • Tomcat Logging 설정
          • Property 관리
          • E-mail
            • Gmail 변경사항
          • Scheduler
          • Websocket
      • Spring Boot
        • STS 다운로드
        • 프로젝트 생성
        • 프로젝트 구조
        • Spring Devtools
        • Spring Controller
          • JSP 연동
            • * JSP 생성불가 문제
            • Spring Boot 3.x
          • Model
          • 요청 파라미터 처리
          • 경로 변수 처리
          • 요청 메소드
          • Redirect
          • Spring Actuator
        • Spring Boot JDBC
          • Database 정보
          • DAO Pattern
          • ORM Framework
            • myBatis
              • Mapper 생성
            • Spring Data JPA
        • Spring AOP
          • AspectJ
          • Filter
          • Interceptor
          • ControllerAdvice
        • REST API
        • Spring WebSocket
        • Send Mail
        • Logging
        • Spring Boot Test
        • Lombok
      • Java EE
        • 개발환경 구성
          • Server와 Client
          • Web Server와 WAS
        • Dynamic Web Project
      • Apache Tomcat
        • Apache Tomcat 구조
        • Tomcat User 생성
        • Tomcat Manager 설정
      • Maven
      • Jenkins
        • Installation
          • Github Webhook 설정
          • Maven 연동
        • Project setting
          • 소스 코드 관리 설정
          • 빌드 유발 설정
          • 빌드 작업 설정
      • OpenAPI(swagger)
        • swagger 2.x (legacy)
        • swagger 3.x (boot)
        • Swagger UI 꾸미기
        • SpringDoc
    • Front-end
      • HTML
        • Heading
        • <A>
        • <IMG>
        • <DIV>
        • <TABLE>
        • <FORM>
          • <INPUT>
          • <SELECT>
          • <TEXTAREA>
          • <FIELDSET>
        • List
      • CSS
        • CSS 적용 방식
          • 크기(size)
            • 픽셀(px)
          • 색상(color)
        • CSS 선택자
          • 스타일 우선순위
        • CSS 주요 속성
          • 크기 속성
            • border
            • margin
            • padding
            • box-sizing
          • 배경 속성
          • 글자 속성
            • font
            • text
          • 배치 속성
            • position
            • display
            • overflow
            • float
            • flexbox
        • CSS Reset
      • JS
        • syntax
          • let, const
          • 구조 분해 할당
          • spread operator
          • Object copy
          • this
          • module
        • jQuery
          • structure
          • function
          • ajax
            • ajax file upload
        • VueJS
          • CDN(Vue3)
            • 기본 구조
            • Vue Devtools
            • jQuery vs VueJS
            • Vue instance
              • data
                • IME issue
              • v-model
              • template
              • computed
              • watch
                • deep watch
                • vs Computed
              • methods
            • Vue directive
              • v-text
              • v-html
              • v-bind
                • v-bind style
                • v-bind class
              • v-on
                • once
                • prevent
              • v-show
              • v-if
              • v-for
          • Vue-cli 3
            • 프로젝트 구조
            • src
              • main.js
              • App.vue
              • HelloWorld.vue
            • Vue Router 4
              • History mode
              • 404 not found
              • Guard
                • beforeEach
            • Vuex
              • 이동 횟수 측정
            • axios
              • interceptor
          • Vue-electron
        • ReactJS
          • CDN(React18)
            • 템플릿 설명
            • JSX
            • render
            • Handling Events
              • onClick
              • onInput
            • Component
              • 클래스 컴포넌트
                • state
                • props
                • event
                  • Mouse
                  • Input
                • lifecycle
              • 함수형 컴포넌트
                • useState
                • useEffect
                • useReducer
                • useMemo
                • props
                • 조건부 렌더링
          • CRA
            • 자원 경로 설정
            • src 절대 경로 설정
            • react-router
            • Context API
            • Electron 설정
        • Webpack
          • NodeJS
          • Git
    • Ubuntu server
      • Jenkins
    • 테스트 도구
      • JMeter
        • Test Plan
        • Test Plan(with login)
        • Plugin 설치
    • WebRTC
  • Base Language
    • Java
      • Java 실행 과정
        • 개발 환경 구축
        • 샘플 코드 작성
        • 컴파일/실행
        • 환경 변수 설정
      • Java 초급
        • Hello world
        • 자료와 정보
        • 변수
          • 정수
            • 정수의 저장 원리
            • 정수형 변수 생성
          • 실수
            • 실수의 저장 원리
            • 실수형 변수 생성
          • 논리
            • 논리형 변수 생성
          • 문자
          • 문자열
            • 문자열 변수 생성
          • 사용자 정의 자료형
        • 연산자
          • 대입 연산
          • 부호 연산
          • 산술 연산
          • 복합 대입 연산
          • 증감 연산
          • 쉬프트 연산
          • 비트 연산
          • 비교 연산
          • 논리 연산
          • 삼항 연산
          • 변환 연산
        • 표준 입출력
          • 표준 출력
          • 표준 오류 출력
          • 표준 입력
            • Scanner 입력
        • 제어문
          • if 구문
            • 단일 조건
            • 두 가지의 조건
            • 여러 가지의 조건
          • switch~case 구문
          • while 구문
          • do~while 구문
          • for 구문
        • 랜덤(Random)
        • 배열
          • 1차원 배열
          • 2차원 배열
          • 다차원 배열
          • Sort
            • 선택 정렬
            • 버블 정렬
            • 삽입 정렬
      • Java 중급
        • 객체 지향 프로그래밍
        • 클래스
        • 인스턴스
        • 필드
        • 메소드
          • 설정(setter) 메소드
          • 반환(getter) 메소드
        • 생성자
        • 접근 제한
          • private
          • package
          • protected
          • public
        • 정적(static)
        • 불변(final)
        • 상수(constant)
        • 상속
          • this와 super의 이해
          • 멤버 변수 설정
          • 멤버 메소드 설정
          • 생성자 설정
        • 추상화
          • 추상 클래스
          • 인터페이스
        • 다형성
        • 중첩 클래스
          • 일반 중첩 클래스
          • static 중첩 클래스
          • 지역 중첩 클래스
          • 익명 중첩 클래스
      • Java API(작성중)
        • java.lang
        • java.util
        • java.text
        • java.time
        • java.io
        • java.net
        • java.sql
        • java.awt
        • javax.swing
      • Java 고급
        • 제네릭(Generic)
        • 열거형(Enum)
        • Annotation Type
          • Retention
          • Target
          • Nested Annotation
        • Java Reflection
          • Intro
          • Class
          • Field
          • Constructor
          • Method
          • Package
      • JDBC
        • 드라이버 로드
        • 연결 생성
          • JDBC Driver 유형
        • JdbcTemplate
      • Java 버전별 변경사항
        • Java 1.8
          • Lambda Expression
          • Stream API
          • java.time 패키지
        • Java 9
        • Java 12
          • switch~case
        • Java 13
          • Text Block
    • Arduino
      • 학습 준비
        • Reference
        • 아두이노 온라인 시뮬레이터
        • 전기의 이해
        • 그라운드(GND)의 이해
      • 개발 환경 구축
        • CH340 보드 설치
        • Editor 글꼴 설정
      • 아두이노 제어
        • 코드의 구성
        • 시리얼 출력
        • 디지털 출력
          • LED 출력
        • PWM 출력
        • 시리얼 입력
        • 디지털 입력
          • PIR 센서
        • 아날로그 입력
          • 온도 센서(LM35DZ)
          • 조도 센서
          • 가스 센서
        • 피에조 부저
        • 서보 모터 제어
          • 시리얼 서보 모터 제어
          • 스위치 서보 모터 제어
        • 온습도 센서(DHT-11)
        • LCD
      • 아두이노 통신
        • 블루투스(Bluetooth)
          • HC-06
            • 온도 센서 활용
          • HM-10
        • 와이파이(Wi-Fi)
          • ESP-01
            • WiFiEsp 라이브러리 추가
            • WiFiEsp 네트워크 스캔
        • 이더넷(Ethernet)
        • ArduinoJson 라이브리 사용
    • Regular Expression
  • Database
    • Oracle
      • 설치
        • SQL Plus
        • SQL Developer
        • DBeaver
        • Docker(Mac OS)
      • SQL
        • 관리자 명령
          • 사용자 관리
          • 권한 관리
          • Encoding 설정
          • 서비스 포트 설정
        • 사용자 명령
          • 테이블 관리
            • 테이블 항목 제약 조건
            • 외래키 제약조건
            • 데이터 유형
          • 시퀀스 관리
          • 데이터 관리
            • 데이터 추가
            • 데이터 조회
              • 오라클 내장 함수
              • 그룹 조회
              • Top N Query
            • 데이터 수정
            • 데이터 삭제
          • 뷰 관리
          • 인덱스 관리
          • 집합 연산
          • 테이블 조인
            • 등가 조인
            • 외부 조인
        • HR 계정
        • 기타 명령
          • 컬럼 간격 조정
      • 내보내기 및 불러오기
        • EXPDP, IMPDP
        • Docker로 실행중인 경우
      • 기타
        • 자동 세션 제거
        • Tablespace 관리
        • Unlock user
  • 면접대비
    • Q&A
      • Java
      • Database
      • Web
      • IT 일반상식
  • ETC
    • Eclipse IDE
      • 설치
      • 화면 설명
      • 환경 설정
      • 프로젝트 생성
      • 소스파일 작성 및 실행
    • Github
      • Github 계정 관리
      • Github 저장소 관리
        • Profile
        • Collaborators
        • Code
        • Issues
        • Pull requests
        • Action
          • Vue 3 Deploy Action
      • Personal Access Token
      • Git ignore 설정
        • Spring 개발용 샘플
      • Github Eclipse 연동
        • Branches
        • Project
        • Team project
          • Dynamic web project
          • Spring Boot Project
          • Branch 생성
          • Pull Request
          • Branch 보호
          • Branch 다시 생성
    • Figma
      • Team
      • Design
      • Component
    • 과정평가형
      • 실기 모의고사 1회
      • 실기 모의고사 2회
      • 실기 모의고사 3회
      • 실기 모의고사 4회
    • VScode
      • Live Server 실행 오류
      • Github 계정 변경
    • Naver ToastUI Editor
      • Editor 만들기
        • Editor options
          • File upload
      • Viewer 만들기
    • 문자 인코딩 방식
    • OBS
      • 녹화 잡음 제거 설정
    • Semantic Version
Powered by GitBook
On this page
  • Spring Filter
  • 필터의 이해
  • Java EE 필터
  • Java EE 필터의 등록
  • web.xml 등록
  • Annotation을 사용하여 등록
  • Java EE url-pattern 작성 규칙
  • Java EE 필터를 스프링에서 사용할 경우의 문제점
  • 스프링 프록시 필터
  • 클래스 코드
  • 등록 코드
  • 스프링 프록시 필터 등록 원리
  1. Web
  2. Back-end
  3. Spring Framework
  4. Spring AOP

Filter

이 문서에서는 스프링에서 필터(Filter)를 사용하는 방법에 대해서 알아본다.

PreviousPointcut ExpressionNextInterceptor

Last updated 2 years ago

Spring Filter

필터의 이해

필터란 사용자의 요청(request)가 처리되기 전에 수행되도록 고안된 도구를 말한다. 자바 EE에서는 javax.servlet.Filter 인터페이스와 구현체로 구성되어 있다.

웹 프로그래밍에서는 필터를 이용하여 인코딩, 인증, 접근제어 등 다양한 작업들을 처리할 수 있다. 따라서 필터를 사용하는 방법을 필수적으로 이해해야 한다.

참조 이미지(출처 : )

Java EE 필터

Java EE에서는 필터를 다음과 같이 사용한다.

import javax.servlet.Filter;

public class CustomFilter implements Filter{
    //생략
}

javax.servlet.Filter 인터페이스를 상속받아 메소드를 재정의한 뒤 web.xml에 등록하면 적용이 완료된다.

재정의할 메소드는 다음과 같다.

  • void doFilter(ServletRequest, ServletResponse, FilterChain)

    • 필터에서 수행할 내용에 대해 정의하는 메소드

    • 필수로 재정의 해야하며, IOException과 ServletException이 발생함

    • ServletRequest 는 HttpServletRequest를 up-casting 시킨 객체

    • ServletResponse 는 HttpServletResponse를 up-casting 시킨 객체

    • FilterChain 은 연속적으로 처리하기 위한 경로 정보를 가지고 있는 객체

      • 요청을 통과 시킬 경우 chain.doFilter(request, response) 형태의 명령을 작성

      • 요청을 거절 시킬 경우 response.sendRedirect(url) 또는 response.sendError(status) 형태의 명령을 작성

  • void init(FilterConfig)

    • 필터의 초기 설정을 수행하는 메소드

    • 선택적으로 재정의가 가능하며 ServletException이 발생함

    • FilterConfig는 Servlet 내장 영역들에 접근할 수 있는 설정 객체

  • void destroy()

    • 필터의 종료 설정을 수행하는 메소드

    • 선택적으로 재정의가 가능함

    • 일반적으로 init에서 생성한 작업들을 마무리하는 용도로 구현

위의 설명을 토대로 완성한 필터의 일반적인 형태는 다음과 같다.

public class CustomFilter implements Filter{
    @Override
	public void init(FilterConfig filterConfig) throws ServletException {
		
	}
	
	@Override
	public void destroy() {
		
	}
	
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		
	}
}

Java EE 필터의 등록

필터는 web.xml 파일에 등록해야 정상적으로 작동하며, 직접 작성하거나 Annotation을 이용하는 방법이 있다.

web.xml 등록

<web-app ...>
    
       <!-- ...(생략)... -->

	<filter>
		<filter-name>encoding</filter-name>	
		<filter-class>com.hakademy.CustomFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>encoding</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
    
    <!-- ...(생략)... -->
    
</web-app>

각각의 태그에 대한 설명은 다음과 같다.

  • filter

    • 필터를 등록하기 위한 설정

  • filter-mapping

    • 필터에 대한 주소 매핑을 위한 설정

  • filter-name

    • 필터의 이름을 지정하여 필터와 매핑을 연결하기 위한 설정

    • 이름은 애플리케이션 내에서 유일해야함

  • filter-class

    • 등록할 필터의 실제 클래스 경로

    • 패키지를 포함하여 작성해야 함

  • url-pattern

    • 필터를 실행할 요청 주소 설정

    • 와일드카드(*) 기호를 사용하여 범위 지정이 가능

Annotation을 사용하여 등록

Annotation을 사용하면 web.xml에 등록한 효과가 발생하며, 필터에 직접 작성하므로 편리하다는 이점이 있다.

@WebFilter(urlPattern="/*")
public class CustomFilter implements Filter{
    //생략
}

위와 같이 urlPattern만 지정해주면 기본적인 등록이 완료되며, 필요하다면 다른 설정도 해줄 수 있다.

Java EE url-pattern 작성 규칙

filter/servlet 등록 시 사용 가능한 url pattern의 규칙은 다음과 같다.

  • 주소 하나만 지정할 경우 해당 주소만 작성

    • /home/test 라고 설정한 경우 http[s]://아이피:포트/컨텍스트/home/test의 경로를 의미

  • 와일드카드를 사용할 경우 다음의 규칙을 준수

    • /로 시작할 경우 *로 끝나야함

      • 이 경우는 엔드포인트 이후의 모든 내용을 필터에 연결하기 위해서 사용함

      • /* , /member/*, /board/reply/* 등과 같이 사용

    • *로 시작할 경우 확장자로 끝나야 함

      • 이 경우는 전체 주소에서 특정한 확장자(.jpg, .mp3 등)를 필터에 연결하기 위해 사용함

      • *.jsp , *.mp3 등과 같이 사용

Java EE 필터를 스프링에서 사용할 경우의 문제점

스프링은 Java EE Project를 기반으로 내부에서 컨테이너를 구축하여 필요한 작업들을 수행한다. Java EE Filter는 web.xml에 직접 등록하여 사용하므로 스프링에서 제어하거나 스프링의 도구들을 이용할 수 없다. 따라서, 스프링과 연동하여 사용하고 싶은 경우에는 스프링에서 지원하는 프록시 필터(proxy filter) 방식을 이용해야 한다.

스프링 프록시 필터

스프링에서 관리할 수 있는 필터를 만들 경우 다음과 같이 클래스를 구성한다.

클래스 코드

@Service
public class CustomFilter implements Filter{
    //생략
}

Java EE 필터와 동일하게 javax.servlet.Filter 를 상속받으며, 차이점은 @WebFilter 대신 @Service를 이용하여 등록한다는 것이다. @Service 대신 @Component등 다른 등록 애노테이션을 사용해도 된다.

등록 코드

등록은 Proxy Filter 형태로 해야하므로 스프링에서 제공되는 클래스를 등록해야한다. 따라서 web.xml에 직접 작성해야 하고 애노테이션 방식은 지원되지 않는다.(Java Configuration으로는 등록 가능)

<filter>
    <filter-name>customFilter</filter-name>
    <filter-class>
        org.springframework.web.filter.DelegatingFilterProxy
    </filter-class>
</filter>
<filter-mapping>
    <filter-name>customFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

주의사항은 <filter-name>을 작성할 때 반드시 등록된 필터의 bean id를 작성해야 한다는 것이다. 지금의 경우 CustomFilter에 별도의 이름을 부여하지 않았기 때문에 자동적으로 이름은 customFilter가 된다. 따라서 <filter-name>에 customFilter라고 작성해주면 정상적으로 등록이 이루어진다.

만약 이름을 별도로 부여하고 싶다면 다음과 같이 애노테이션을 작성한다.

@Service("custom")
public class CustomFilter implements Filter{...}
<filter>
    <filter-name>custom</filter-name>
    ...
</filter>
<filter-mapping>
    <filter-name>custom</filter-name>
    ...
</filter-mapping>

스프링 프록시 필터 등록 원리

필터를 직접 등록하는 것이 아니라 proxy 형태로 등록하기 때문에 web.xml에 DelegatingFilterProxy 형태로 필터를 등록하고 연동 설정을 통해 Spring Bean 과 연결되도록 만드는 구조이다.

이처럼 등록할 경우 실제 등록되는 것은 Spring Bean인 customFilter이므로 스프링에서 제공하는 기능들(ex : @Autowired)을 모두 이용할 수 있다.

보기
https://ko.m.wikipedia.org/wiki/파일:JSP_Model_2.svg