기본 콘텐츠로 건너뛰기

Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)

Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)

AI 생성 이미지: Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)
AI 생성 이미지: Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)

대규모 애플리케이션에서 요청 흐름을 명확히 관리하려면 예외 처리와 요청 전후 가로채기가 필수입니다. 이 글에서는 글로벌 예외 처리와 인터셉터를 실무 관점에서 정리하며, Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE) 같은 핵심 개념을 함께 설명합니다.


1. 🚨 글로벌 예외 처리: `@ControllerAdvice`

컨트롤러별로 흩어진 예외 처리는 유지보수를 어렵게 만듭니다. `@ControllerAdvice`는 애플리케이션 전역에서 발생하는 예외를 한곳에서 관리해 일관된 에러 응답 형식을 만들고, 비즈니스 로직을 깔끔하게 분리합니다. 또한 Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)와 같은 요청 관련 정보를 활용해 더 세밀한 예외 로깅을 구현할 수 있습니다.

`try-catch`를 각 핸들러에 반복하는 대신, `@ExceptionHandler`와 함께 사용하면 공통 응답 규격, 상태 코드 매핑, 그리고 로깅 전략을 중앙에서 통제할 수 있습니다.

Java GlobalExceptionHandler.java


import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;

// 모든 컨트롤러에 걸쳐 예외 처리를 적용하라는 어노테이션
@ControllerAdvice
public class GlobalExceptionHandler {

    // CustomException이 발생했을 때 처리
    @ExceptionHandler(CustomException.class)
    public ResponseEntity<String> handleCustomException(CustomException ex) {
        // HTTP 상태 코드와 메시지를 정의하여 반환
        return new ResponseEntity<>(
            "ERROR: " + ex.getMessage(), 
            HttpStatus.BAD_REQUEST // 400 Bad Request
        );
    }
    
    // RuntimeException 계열의 모든 예외를 처리 (최종 fallback)
    @ExceptionHandler(RuntimeException.class)
    public ResponseEntity<String> handleAllExceptions(RuntimeException ex) {
        return new ResponseEntity<>(
            "Internal Server Error: " + ex.getMessage(), 
            HttpStatus.INTERNAL_SERVER_ERROR // 500 Internal Server Error
        );
    }
}
        
핵심: `@ControllerAdvice`는 전역 예외 처리의 표준입니다. 일관된 에러 바디와 상태 코드를 제공하고, 요청 경로 정보(예: Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE))를 로깅에 활용하면 문제 원인 파악이 쉬워집니다.

2. 🛣️ HandlerInterceptor를 활용한 공통 로직 처리

인터셉터는 DispatcherServlet이 컨트롤러를 호출하기 전후의 흐름을 가로채 공통 작업을 처리할 수 있게 합니다. 인증·권한 검사, 요청/응답 로깅, 성능 측정 같은 횡단 관심사를 인터셉터로 분리하면 컨트롤러가 본연의 역할에만 집중할 수 있습니다. 또한 인터셉터 단계에서 Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)를 참조하면 요청별 세부 로직을 적용하기 용이합니다.

Java LoggingInterceptor.java


import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoggingInterceptor implements HandlerInterceptor {
    // 1. Controller 실행 전에 호출됨 (주로 인증/권한 체크)
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        long startTime = System.currentTimeMillis();
        request.setAttribute("startTime", startTime); // 시작 시간 기록
        System.out.println("요청 시작: " + request.getRequestURI());
        return true; // true를 반환해야 Controller로 진행
    }
    // 2. Controller 실행 후, View 렌더링 직전에 호출됨 (주로 Model/View 조작)
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        if (modelAndView != null) {
            System.out.println("뷰 이름: " + modelAndView.getViewName());
        }
    }
    // 3. View 렌더링 포함 모든 작업 완료 후 호출됨 (주로 리소스 정리 및 로깅)
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        long startTime = (Long) request.getAttribute("startTime");
        long endTime = System.currentTimeMillis();
        System.out.println("요청 완료 시간: " + (endTime - startTime) + "ms");
    }
}
        

인터셉터 등록 (WebMvcConfigurer)

구현한 인터셉터는 WebMvcConfigurer에 등록해야 활성화됩니다. 경로 패턴을 신중히 설계하면 퍼포먼스와 보안 모두 개선됩니다.


@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // /api/** 경로로 들어오는 모든 요청에 대해 인터셉터 적용
        registry.addInterceptor(new LoggingInterceptor())
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/public/**"); // 예외 경로 설정
    }
}
        

한성컴퓨터 DQHD 울트라와이드 리얼 120 모니터 TFG49Q12UW, 124cm LG전자 WQHD 울트라 와이드 모니터, 86.4cm, 34WR50QK 한성컴퓨터 WFHD IPS 울트라와이드 모니터, 73cm, TFG29F07WP(일반) 한성컴퓨터 UWQHD 1500R 커브드 리얼 180 울트라와이드 게이밍 모니터, 86.4cm, TFG34Q14W(무결점)

글로벌 예외 처리와 인터셉터는 애플리케이션의 횡단 관심사를 분리해 코드 품질을 높이고 디버깅 속도를 개선합니다. 운영 환경에서는 Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)로 요청 맥락을 확보하고, 예외 처리와 로깅 전략을 통합하는 것이 효과적입니다.

© 2025 칼퇴하는 개발자. 모든 권리 보유.

🚀 이 주제, 우리 서비스에 어떻게 적용할까요?

Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)를 실제 서비스와 조직에 녹여보고 싶다면, 현재 아키텍처와 운영 방식을 한 번 점검해 보는 것부터 시작해 보세요. 팀 위키나 기술 블로그, 사내 스터디 주제로도 아주 좋습니다.

이 글이 도움이 됐다면, 비슷한 엔터프라이즈 사례 글들도 함께 살펴보면서 우리 조직에 맞는 운영 상용구를 정의해 보세요.

AI 생성 이미지: Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)
AI 생성 이미지: Spring MVC: 동적 요청 경로 추출하기 (PATH_WITHIN_HANDLER_MAPPING_ATTRIBUTE)

댓글

이 블로그의 인기 게시물

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 (Request Parameter 전체보기)

Java Servlet Request Parameter 완전 정복 — GET/POST 모든 파라미터 확인 & 디버깅 예제 Java Servlet Request Parameter 완전 정복 웹 애플리케이션에서 클라이언트로부터 전달되는 Request Parameter 를 확인하는 것은 필수입니다. 이 글에서는 Java Servlet 과 JSP 에서 GET/POST 요청 파라미터를 전체 출력하고 디버깅하는 방법을 다양한 예제와 함께 소개합니다. 1. 기본 예제: getParameterNames() 사용 Enumeration<String> params = request.getParameterNames(); System.out.println("----------------------------"); while (params.hasMoreElements()){ String name = params.nextElement(); System.out.println(name + " : " + request.getParameter(name)); } System.out.println("----------------------------"); 위 코드는 요청에 포함된 모든 파라미터 이름과 값을 출력하는 기본 방법입니다. 2. HTML Form과 연동 예제 <form action="CheckParamsServlet" method="post"> 이름: <input type="text" name="username"><br> 이메일: <input type="email" name="email"><b...

PostgreSQL 달력(일별,월별)

SQL 팁: GENERATE_SERIES로 일별, 월별 날짜 목록 만들기 SQL 팁: GENERATE_SERIES 로 일별, 월별 날짜 목록 만들기 데이터베이스에서 통계 리포트를 작성하거나 비어있는 날짜 데이터를 채워야 할 때, 특정 기간의 날짜 목록이 필요할 수 있습니다. PostgreSQL과 같은 데이터베이스에서는 GENERATE_SERIES 함수를 사용하여 이 작업을 매우 간단하게 처리할 수 있습니다. 1. 🗓️ 일별 날짜 목록 생성하기 2020년 1월 1일부터 12월 31일까지의 모든 날짜를 '1 day' 간격으로 생성하는 쿼리입니다. WITH date_series AS ( SELECT DATE(GENERATE_SERIES( TO_DATE('2020-01-01', 'YYYY-MM-DD'), TO_DATE('2020-12-31', 'YYYY-MM-DD'), '1 day' )) AS DATE ) SELECT DATE FROM date_series 이 쿼리는 WITH 절(CTE)을 사용하여 date_series 라는 임시 테이블을 만들고, GENERATE_SERIES 함수로 날짜를 채웁니다. 결과 (일별 출력) 2. 📅 월별 날짜 목록 생성하기 동일한 원리로, 간격을 '1 MONTH' 로 변경하면 월별 목록을 생성할 수 있습니다. TO...

CSS로 레이어 팝업 화면 가운데 정렬하는 방법 (top·left·transform 완전 정리)

레이어 팝업 센터 정렬, 이 코드만 알면 끝 (CSS 예제 포함) 이벤트 배너나 공지사항을 띄울 때 레이어 팝업(center 정렬) 을 깔끔하게 잡는 게 생각보다 어렵습니다. 화면 크기가 변해도 가운데에 고정되고, 모바일에서도 자연스럽게 보이게 하려면 position , top , left , transform 을 정확하게 이해해야 합니다. 이 글에서는 아래 내용을 예제로 정리합니다. 레이어 팝업(center 정렬)의 기본 개념 자주 사용하는 position: absolute / fixed 정렬 방식 질문에서 주신 스타일 top: 3.25%; left: 50%; transform: translateX(-50%) 의 의미 실무에서 바로 쓰는 반응형 레이어 팝업 HTML/CSS 예제 1. 레이어 팝업(center 정렬)이란? 레이어 팝업(레이어 팝업창) 은 새 창을 띄우는 것이 아니라, 현재 페이지 위에 div 레이어를 띄워서 공지사항, 광고, 이벤트 등을 보여주는 방식을 말합니다. 검색엔진(SEO) 입장에서도 같은 페이지 안에 HTML이 존재 하기 때문에 팝업 안의 텍스트도 정상적으로 인덱싱될 수 있습니다. 즉, “레이어 팝업 센터 정렬”, “레이어 팝업 만드는 방법”과 같이 관련 키워드를 적절히 넣어주면 검색 노출에 도움이 됩니다. 2. 질문에서 주신 레이어 팝업 스타일 분석 질문에서 주신 스타일은 다음과 같습니다. <div class="layer-popup" style="width:1210px; z-index:9001; position:absolute; top:3.25%; left:50%; transform:translateX(-50%);"> 레이어 팝업 내용 <...