개발/TMP

2023.08.28.MON

잇(IT) 2023. 8. 28. 10:53
728x90
- 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"
);
728x90

'개발 > 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