[Spring] Filter (1)

이연우·2025년 7월 28일

TIL

목록 보기
62/100

🧹 공통 관심 사항(cross-cutting concerns)이란?

  • 핵심 기능과 직접 관련은 없지만,
    여러 위치에서 공통적으로 필요한 부가 기능
  • Filter가 나오게된 이유는 공통 관심사(Cross Cutting Concern)의 처리 때문

🔑 핵심 기능

  • 비지니스 로직

✨ 부가 기능

  • 비지니스 로직과 별개로 동작하는 기능

📌 요구 사항 예시
🧑‍🎓 로그인한 유저만 게시글 API에 접근 가능해야 함

📝 해결 방법 → 핵심은 언제나 수정에 있음

1. 화면에서 로그인하지 않으면 API를 사용하지 못하도록 막음
→ 유저가 HTTP 요청을 마음대로 조작할 수 있음

2. Controller에서 로그인 여부를 체크하는 Logic을 작성
→ 실제로는 인증이 필요한 모든 컨트롤러에 공통으로 로그인 여부를 체크해야 함
→ 로그인 로직이 변경될 때마다 로그인 여부를 체크하는 Logic 또한 변경될 가능성이 높음

@RestController
@RequestMapping("/post")
public class PostController {

    @PostMapping
    public PostResponseDto create(PostCreateRequestDto request) {
        // 로그인 여부 확인 로직
        // 생성 로직
    }

    @PutMapping("/{postId}")
    public void update(
            @PathVariable Long postId,
            PostUpdateRequestDto request
    ) {
        // 로그인 여부 확인 로직
        // 수정 로직
    }

    @DeleteMapping("/{postId}")
    public void delete(@PathVariable Long postId) {
        // 로그인 여부 확인 로직
        // 삭제 로직
    }

}
  • 이와 같이 여러 가지 로직에서
    공통으로 관심이 있는 부분공통 관심사라고 함
로그인 여부 확인 로직 -> 공통 관심사 (인증 : 로그인)

→ 공통 관심사는 로그인뿐만 아니라 더 큰 범위를 의미함
👉 이런 중복 인증 코드를 없애기 위한 게 Filter의 존재 이유

3. Spring AOP를 활용할 수 있음

4. Web과 관련된 공통 관심사는 Servlet FilterSpring Intercepter를 사용함
HttpServletRequest 객체를 제공하기 때문에 HTTP 정보나 URL 정보에 접근하기 용이함

⚙️ 공통 관심사 문제 해결을 위한 선택지

시도문제점
화면 단에서 막기유저가 브라우저 도구로 요청 조작 가능
Controller에서 매번 인증 로직 작성중복 코드 발생 + 유지보수 어려움
✅ 필터(Filter) 또는 인터셉터(Interceptor) 사용공통 로직을 중앙 집중 관리 가능

🚦 Servlet Filter란?

  • 모든 HTTP 요청이 Servlet에 도달하기 전에 먼저 거치는 사전 처리기

🔍 주요 특징

항목설명
🧩 공통 로직 분리인증, 로깅, 인코딩 등을 필터로 분리
🔗 요청/응답 감시HttpServletRequest, HttpServletResponse를 조작 가능
⛓️ Filter Chain여러 필터를 순차적으로 실행 가능
🧭 실행 위치Controller 호출 전에 실행됨
⚙️ 핵심 메서드doFilter() 안에서 로직 정의 및 다음 필터 호출 여부 결정

🔁 Filter 동작 구조

[클라이언트 요청]
      ↓
[🔍 Filter 1] 
      ↓
[🔍 Filter 2] 
      ↓
[🚪 DispatcherServlet (Spring 핵심)] 
      ↓
[🧠 Controller]

➕ Filter 추가 및 순서 지정 가능

  • 필터는 자바 코드 또는 설정 파일에서 자유롭게 추가/제거 가능
  • 실행 순서도 지정 가능 (예: 인증 → 로깅 순)

🧪 인증 필터 동작 예시

✅ 로그인 성공 시

  • Filter를 통과 → DispatcherServletController 정상 호출

❌ 로그인 실패 시

  • Filter에서 요청 차단 → Controller 호출되지 않음

⛓️ Filter Chain 구조

  • 모든 필터는 체인 구조로 연결됨
  • 개발자가 필터를 여러 개 등록 가능
  • 필터 실행 순서 지정 가능

📥 요청 흐름 요약

  1. 클라이언트 요청 →

  2. ☑️ 필터에서 공통 로직 실행 (인증 등)

  3. ✅ 통과되면 DispatcherServletController 실행

  4. ⛔ 실패 시 Controller 호출 없이 필터에서 응답 종료


🧠 요약 정리

항목설명
📌 공통 관심사인증, 로깅 등 중복되는 부가기능
🧹 Filter요청 전후에 실행되는 HTTP 레벨의 인터셉터
🔄 doFilter()필터 동작 정의 + 다음 필터로 넘길지 결정
⛓️ FilterChain다중 필터 구성 가능
🎯 장점중앙 집중 처리, 중복 코드 제거, 유지보수 쉬움

0개의 댓글