- Jsonpath
.andExpect(jsonPath("$.title").value("title을 입력해주세요"))
- $.title은 JSONPath 표현식을 나타냅니다. JSONPath는 JSON 문서 내에서 특정 값이나 데이터를 선택하기 위한 경로 표현식 언어입니다.
- ControllerAdvice
@ControllerAdvice는 Spring Framework에서 제공하는 어노테이션으로, 전역 컨트롤러에서 발생하는 예외를 처리하고 관리하는 데 사용됩니다. 이를 통해 애플리케이션의 여러 컨트롤러에서 발생할 수 있는 예외들을 한 곳에서 처리하고 일관된 방식으로 응답을 생성할 수 있습니다.
일반적으로 Spring 애플리케이션에서는 다양한 컨트롤러들이 요청을 처리하다가 예외가 발생할 수 있습니다. 예를 들어, 데이터가 없는 경우에 대한 처리, 권한 없음에 대한 처리, 유효성 검사 실패에 대한 처리 등 다양한 상황에서 예외가 발생할 수 있습니다. 이러한 예외들을 각각의 컨트롤러에서 처리하면 코드 중복이 발생할 수 있고, 예외 처리 로직의 일관성이 유지되지 않을 수 있습니다.
@ControllerAdvice를 사용하면 이러한 예외 처리 로직을 한 곳에서 관리할 수 있습니다. @ControllerAdvice가 선언된 클래스는 여러 컨트롤러에서 발생하는 예외를 캐치하여 특정 메서드에서 처리할 수 있습니다.
@ControllerAdvice를 사용한 클래스 내부에서는 @ExceptionHandler, @InitBinder, @ModelAttribute와 같은 다양한 어노테이션을 사용하여 예외 처리, 데이터 바인딩, 모델 속성 설정 등을 수행할 수 있습니다.
간단한 예시로, 다음과 같이 @ControllerAdvice를 사용하여 예외 처리를 담당하는 클래스를 정의할 수 있습니다:
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(Exception.class)
public ResponseEntity<String> handleException(Exception e) {
// 예외 처리 로직
return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR).body("Internal Server Error");
}
}
위 코드에서는 모든 예외에 대해 Exception 클래스를 사용하여 처리하고 있습니다. 이 클래스 내부의 handleException 메서드에서는 예외 처리 로직을 구현하고, HTTP 응답을 생성하여 반환하고 있습니다. 이렇게 @ControllerAdvice를 사용하면 예외 처리 관련 로직을 중앙에서 관리하면서 일관성 있는 응답을 생성할 수 있습니다.
@Slf4j
@ControllerAdvice
public class ExceptionController {
@ResponseStatus(HttpStatus.BAD_REQUEST)
@ExceptionHandler(MethodArgumentNotValidException.class)
@ResponseBody
public Map<String, String> invalidRequestHandler(MethodArgumentNotValidException e) {
// System.out.println("하하하");
// log.error("exceptionHandler error", e);
// MethodArgumentNotValidException
// -> 즉, Exception 클래스는 MethodArgumentNotValidException이 아니기 때문에 field 에러에 관한 내용이 담겨져있지 않다.
// 파라미터로 받는 클래스를 해당 MethodArgumentNotValidException으로 변경해준다.
FieldError fieldError = e.getFieldError();
String field = fieldError.getField();
String message = fieldError.getDefaultMessage();
Map<String, String> response = new HashMap<>();
response.put(field, message);
return response;
}
}
@Slf4j: 롬복(Lombok) 라이브러리의 어노테이션으로, 클래스 내에서 로깅을 위한 private static final Logger log = LoggerFactory.getLogger(클래스이름.class) 코드를 자동으로 생성해줍니다. 이를 통해 log라는 Logger 인스턴스를 사용하여 로깅할 수 있습니다.
@ControllerAdvice: Spring의 어노테이션으로, 이 클래스가 전역 예외 처리를 담당한다는 것을 나타냅니다.
@ResponseStatus(HttpStatus.BAD_REQUEST): 예외 처리 메서드가 발생한 예외에 대해 HTTP 응답 상태 코드를 지정합니다. 여기서는 BAD_REQUEST (400) 상태 코드를 지정하고 있습니다.
@ExceptionHandler(MethodArgumentNotValidException.class): 특정 예외 클래스인 MethodArgumentNotValidException을 처리하기 위한 메서드임을 나타냅니다.
@ResponseBody: 이 어노테이션이 메서드에 붙으면, 메서드가 반환하는 객체가 HTTP 응답 본문에 직접적으로 쓰여지게 됩니다.
public Map<String, String> invalidRequestHandler(MethodArgumentNotValidException e): MethodArgumentNotValidException 예외가 발생했을 때 처리되는 메서드입니다. 이 메서드는 유효성 검사 실패와 관련된 필드 에러를 처리하고 응답을 생성합니다.
FieldError fieldError = e.getFieldError();: MethodArgumentNotValidException 객체에서 필드 에러 정보를 가져옵니다.
String field = fieldError.getField();: 필드 에러에서 어떤 필드에 대한 에러인지 가져옵니다.
String message = fieldError.getDefaultMessage();: 필드 에러에서 디폴트 메시지를 가져옵니다. 이 메시지는 주로 어노테이션 기반의 유효성 검사에서 설정한 메시지입니다.
Map<String, String> response = new HashMap<>();: 응답으로 반환할 맵 객체를 생성합니다.
response.put(field, message);: 에러 필드와 해당 필드의 에러 메시지를 맵에 추가합니다.
return response;: 최종적으로 맵을 응답으로 반환합니다.
이렇게 ExceptionController 클래스는 MethodArgumentNotValidException 예외를 처리하여 유효성 검사 실패에 대한 응답을 생성하는 역할을 하게 됩니다. 이 예제는 실제로 Spring MVC 컨트롤러에서 데이터 유효성 검사 실패 시 어떻게 처리할 수 있는지를 보여주는 것입니다.
- Map.of()
- Map.of()를 사용하여 Map의 값을 초기화 할 수 있다.
- HashMap을 사용한 Map 초기화
private Map<Integer, String> map = new HashMap<>() {
{
put(1, "sangwoo kang");
put(2, "james kang");
put(3, "stef you");
}
};
- Map.of()를 사용한 Map 초기화
private Map<Integer, String> map = Map.of(
1, "sangwoo kang",
2, "james kang",
3, "stef you"
);
'Programming > TMP' 카테고리의 다른 글
2023.08.30.WED (0) | 2023.08.30 |
---|---|
2023.08.29.TUE (0) | 2023.08.29 |
2023.08.26.SAT (0) | 2023.08.26 |
2023.08.25.FRI (0) | 2023.08.25 |
2023.08.24.THU (0) | 2023.08.24 |