캡스톤을 하다가, 한 동기가 질문했던 부분을 블로그에 남겨보기로 했다.
일단 받은 질문을 간단하게 요약하자면,
- 스프링은 자바로 동작한다.
- 자바에서는 에러가 발생하면, RuntimeException(이놈 말고도, IllegalArgumentException처럼 extends RuntimeException을 받는 녀석들이 있다)으로 발생하는 예외들은 분명 러닝과정에서 빨갛게 예외가 발생했다고 뜬다.
- 근데 이렇게, Response를 이용해 Exception에 대해 뭐시기를 해주는게 의미가 있는가?
였다.
일단, 이러한 유튭..아니 블로그각을 만들어준 동기에게 감사하고 정리를 조금 해봐야겠다.
테스트를 위해 하나의 예외를 집어넣어 실행을 시켜보았다.
이 상태에서, 실행을 시키고 해당 컨트롤러 uri를 요청하면, 자바 프로젝트에서 예외가 발생할 것이다.
웹상에서도 어떠한 결과가 나오긴 할 것이다.
이런식으로 예외가 발생한 상태이다. 웹 상에는
이렇게 500 에러가 발생했다는 정보만 있다.
이제, 위에 있는 UsernameAlreadyInUseException을 던져보자.
일단, BAD_REQUEST 400에러가 발생할 것이다. 그 외에 차이점이 있을까?
자바 로그부터 보여주자면,
아무일도 없다. 이게뭐지...? 싶다.
이제 반환된 화면을 보자.
???? 이게 뭘까?
경험적으로는 컨트롤러에서 발생하는 예외사항들을, 그냥 에러로 반환하는 것이 아닌, 이에 대한 정보를 담아 body로 반환하는 것을 알 수 있다.
이제 이론을 보자!
설명에서는, ExceptionHandler어노테이션으로 명시되어 있는 메서드를 @ResponseBody로, 메서드 내의 반환 값을 바디에 반환해주는 것이다.
그렇다면, 그 메서드를 보자!
@ResponseStatus는 에러코드 반환을 어떤 값으로 할지 명시해준다.
지금의 경우는 403에러, FORBIDDEN을 반환해준다.
기능적으로 어떻게 동작하는지를 정리해보자.
- 컨트롤러 로직에서 예외가 발생한다.
- @ExceptionHandler에 명시되어있는 예외는 전역적으로 명시된 메서드가 실행된다.
- 해당 메서드의 반환값을 body에 뿌려준다.
간단하게, 동작과정을 알아보았다.
생각해보니, 나도 그냥 이렇게 돌아가는 구조다 라고 알고있었는데, 한번 까보는 재미도 있으면서, 배우는 맛도 쏠쏠했다.
그럼...twenty thousand
'개발공부 > 받은 질문들' 카테고리의 다른 글
받았던 질문 : getter를 쓰는 것을 지양하라는 이유는 무엇일까? (0) | 2023.03.30 |
---|---|
받았던 질문 : 도대체 JPA에서 파라미터 없는 생성자를 왜 만들어야 할까? (0) | 2023.03.30 |