본문 바로가기
프로그래밍/용어

Spring Boot에서 핸들러(Handler)란?

by 타미타레 2025. 1. 3.

목차

    1. 용어

    • 구글에서 Handler는 매니저로 번역된다. 
    • 마찬가지로 Handler 클래스는 애플리케이션에서 매니저 역할을 한다고 볼 수 있다. 애플리케이션의 원할한 비지니스를 위해 특정 요청이나 이벤트 발생 시 호출되어 주요 동작을 정의하거나 요청 흐름을 제어하는 역할을 수행한다.

    2. 핸들러의 역할

    • 요청 처리
      • 클라이언트의 요청(HTTP 요청, 이벤트, 메시지 등)을 받아 해당 요청에 적합한 작업을 수행한다.
      • 컨트롤러(Controller)와 유사하지만, 특정 로직만 분리해서 처리할 때 사용되기도 한다.
    • 이벤트 처리
      • 시스템에서 발생한 이벤트를 처리하는 로직을 포함한다. 예: 사용자 가입 이벤트, 결제 완료 이벤트 등.
    • 미들웨어 역할
      • 요청이나 응답 데이터를 가공하거나, 검증, 로깅 등 추가적인 작업을 수행한다.
    • 에러 처리
      • 요청 처리 중 발생한 오류를 캡처하고, 사용자에게 적절한 응답을 반환하거나 복구 작업을 수행한다.

    3. 활용 사례

    (1) HTTP 요청 처리 핸들러

    Spring MVC나 기타 프레임워크에서 핸들러는 주로 HTTP 요청을 처리한다. 예를 들어, @RestController의 메서드 자체가 요청 처리 핸들러로 동작한다.

    @RestController
    public class UserController {
        @GetMapping("/users/{id}")
        public ResponseEntity<User> getUser(@PathVariable Long id) {
            // 요청 처리 로직
            User user = userService.findUserById(id);
            return ResponseEntity.ok(user);
        }
    }

     

    (2) 이벤트 핸들러

    이벤트 기반 아키텍처에서는 특정 이벤트를 처리하는 핸들러가 사용된다.. 예를 들어, 스프링의 이벤트 리스너를 활용한 핸들러:

    @Component
    public class UserRegistrationHandler {
        @EventListener
        public void handleUserRegistration(UserRegistrationEvent event) {
            System.out.println("사용자 등록 이벤트 처리: " + event.getUser().getName());
            // 추가 로직 (예: 이메일 전송)
        }
    }
     

    (3) 에러 핸들러

    에러 발생 시 사용자에게 적절한 응답을 반환하거나 로깅 등의 작업을 수행한다.

    @RestControllerAdvice
    public class GlobalExceptionHandler {
        @ExceptionHandler(UserNotFoundException.class)
        public ResponseEntity<String> handleUserNotFound(UserNotFoundException ex) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
        }
    }

     

    (4) 미들웨어 핸들러

    필터나 인터셉터를 활용해 요청 흐름을 처리하는 핸들러이다. 예를 들어, 스프링의 HandlerInterceptor:

    @Component
    public class LoggingInterceptor implements HandlerInterceptor {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
            System.out.println("요청 URL: " + request.getRequestURL());
            return true; // 요청을 계속 처리
        }
    }

     

    (5) 비동기 메시지 핸들러

    메시지 큐(Kafka, RabbitMQ 등)를 사용하는 경우, 핸들러는 특정 메시지를 처리하는 역할을 한다.

    @Service
    public class MessageHandler {
        @KafkaListener(topics = "user-registration", groupId = "group_id")
        public void handleMessage(String message) {
            System.out.println("받은 메시지: " + message);
            // 메시지 처리 로직
        }
    }

    4. 핸들러와 @Service 클래스의 차이점

    핸들러 @Service 클래스
    특정 이벤트나 요청을 처리하기 위한 로직을 포함 비즈니스 로직 전체를 담당하는 계층적 역할
    주로 이벤트, 메시지, HTTP 요청 등에 반응 주로 데이터 처리, 계산, 트랜잭션 관리
    컨트롤러나 메시지 리스너와 협력하여 동작 핸들러와 협력하여 비즈니스 로직 제공

    5. 핸들러 사용하는 이유

    • 코드 재사용성: 공통 작업(예: 로깅, 인증, 에러 처리)을 핸들러로 분리하여 재사용 가능.
    • 유지보수성: 특정 로직을 핸들러로 분리해 코드 가독성을 높이고, 변경 사항을 쉽게 관리.
    • 확장성: 새로운 핸들러를 추가하여 애플리케이션 기능을 확장하기 쉬움.
    • 유연성: 특정 이벤트나 요청 흐름에서 맞춤 작업을 수행할 수 있음.

    댓글