Handler란?
Spring 프레임워크에서 Handler는 HTTP 요청을 처리하는 컴포넌트이다.
HTTP 요청이 들어오면 Spring MVC 프레임워크는 DispatcherServlet을 통해 요청을 처리하는데 이 때, 요청을 처리할 Handler를 찾아 요청을 전달하게 된다.
Handler는 요청을 처리하고, 적절한 모델과 뷰를 반환하며 @Controller 또는 @RestController 어노테이션으로 표시된 클래스의 메서드로 정의될 수 있다.
1. Handler의 역할
요청 매핑
Handler는 @RequestMapping 어노테이션을 사용하여 어떤 URL 패턴에 응답해야 하는지 정의할 수 있다.
파라미터 바인딩
Handler는 요청 파라미터를 메서드 파라미터로 바인딩할 수 있는데, 이 과정에서 Spring은 자동으로 파라미터의 타입 변환을 처리하고, 유효성 검증을 수행한다.
비즈니스 로직 수행
Handler는 요청에 대한 비즈니스 로직을 수행한다. 이 과정에서 데이터베이스 조회, 계산, 파일 처리 등을 수행할 수 있다.
모델 생성
Handler는 비즈니스 로직의 결과로 모델객체를 생성한다. 모델객체는 뷰에 전달되어 클라이언트에게 응답을 생성하는 데 사용된다.
뷰 선택
Handler는 뷰 리졸버(ViewResolver)를 사용하여 클라이언트에게 보여줄 뷰를 선택한다.
응답 생성
Handler는 선택된 뷰와 모델을 결합하여 클라이언트에게 응답을 생성합니다.
예외 처리
Handler는 @ExceptionHandler 어노테이션을 사용하여 예외를 처리하고, 적절한 에러 페이지를 보여줄 수 있다.
2. Controller와 Handler의 차이
Controller와 Handler는 Spring MVC 프레임워크에서 HTTP 요청을 처리하는 컴포넌트이지만, 약간의 차이가 있다.
Controller는 HTTP 요청에 대한 처리를 담당하는 클래스이다. @Controller 어노테이션을 사용하여 표시하며, 메서드 단위로 요청 처리를 정의한다. 이 때 요청을 처리하는 데 필요한 비즈니스 로직과 뷰를 결합하여 HTTP 응답을 생성하게 된다.
반면에 Handler는 Controller의 메서드와 함께 동작하는 컴포넌트 중 하나입니다. Handler는 요청을 처리하고, 적절한 모델과 뷰를 반환한다. 요청을 처리하는 과정에서 요청 매핑, 파라미터 바인딩, 비즈니스 로직 수행, 모델 생성, 뷰 선택, 응답 생성, 예외 처리 등의 작업을 수행한다.
요약하자면, Controller는 HTTP 요청 처리를 담당하는 클래스이고, Handler는 Controller의 메서드와 함께 동작하여 요청 처리를 수행하는 컴포넌트라고 생각하면 된다.
3. @ExceptionHandler 사용법
먼저 @ControllerAdvice 어노테이션을 사용하여 예외 처리를 담당하는 클래스를 정의한다.
그 다음 @ExceptionHandler 어노테이션을 사용하여 처리할 예외 클래스를 정의하고,
예외 발생 시 처리할 메서드를 정의한다.
//예제 코드
@ControllerAdvice // 모든 Exception 받을시 여기로
@RestController
public class GlobalExceptionHandler {
@ExceptionHandler(value = Exception.class)
public ResponseDto<String> handleArgumentException(Exception e){
return new ResponseDto<String>(HttpStatus.INTERNAL_SERVER_ERROR.value(),e.getMessage());
}
}
위의 코드에서는 @RestController를 사용하여 Controller에서 발생하는 모든 예외사항을 가져와 json데이터로 응답하여 예외를 처리하는 방식이다.
@Controller를 사용할 경우 에러 페이지로 응답하여 예외를 처리 할 수 있다.
'개발지식 > BE(Back-End)' 카테고리의 다른 글
Spring Security 작동원리 (0) | 2023.04.03 |
---|---|
RestAPI란? (0) | 2023.04.02 |
Spring Framework - Repository의 역할 (0) | 2023.04.01 |
Spring Framework - Controller와 RestController의 차이 (0) | 2023.04.01 |
Spring Framework - JPA Entity란? (0) | 2023.03.31 |