목차
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. 핸들러 사용하는 이유
- 코드 재사용성: 공통 작업(예: 로깅, 인증, 에러 처리)을 핸들러로 분리하여 재사용 가능.
- 유지보수성: 특정 로직을 핸들러로 분리해 코드 가독성을 높이고, 변경 사항을 쉽게 관리.
- 확장성: 새로운 핸들러를 추가하여 애플리케이션 기능을 확장하기 쉬움.
- 유연성: 특정 이벤트나 요청 흐름에서 맞춤 작업을 수행할 수 있음.
'프로그래밍 > 용어' 카테고리의 다른 글
클라이언트-서버 아키텍처에서 엔드포인트(Endpoint)란? (0) | 2025.01.06 |
---|
댓글