본문 바로가기

FastCampus - 한번에 끝내는 Java|Spring 웹 개발/03 스프링 입문

스프링 Ch 6-3 Exception 처리 + alpha - 패스트캠퍼스 챌린지 10일차

에러 처리

Exception 처리 단원에서는 간단하게 예외처리에 대해서 설명해주시는데, 웹앱 에러 처리의 어려움에 대한 내용이 나왔습니다.

에러를 반환하는 방법 (내려준다 내려준다 하니까 나도 내려줘야 할 거 같자나!!)

  • 기본 에러 페이지 (스프링의 "화이트라벨" 페이지)
  • 에러 코드를 떨구기
  • (제 입장에서) 바람직하지 않은 케이스: 클라이언트에서 200밖에 처리 못 하는 경우에는 메시지에 담아서 (*용문 욕설*)

에러 처리의 방법에 대해서는 요새 고민중인 내용이고, 이 글에 누구를 위해 어떻게 에러를 내줄건지 조금 더 자세히 나와있습니다.

https://www.lpalmieri.com/posts/error-handling-rust/ (Zero to Production in Rust 라는 책의 일부를 블로그로 올리시는 모양입니다. 에러와 로깅이 사용자와 운영/개발자 양 측의 입장에서 어떤 수준으로 필요한지에 대한 설명과 표가 있습니다.)

에러 처리 핸들러를 기술하는 방법은 두 가지입니다.

  • 별도 클래스에 핸들러 기술하기: @RestControllerAdvice (혹은 @ViewResolverAdvice) 가 붙은 클래스에 @ExceptionHandler 를 단 핸들러 메서드를 기술합니다.
    • 어드바이스라고 부르나봅니다. AspectJ 에서도 비슷한 명칭이었던 거 같은데...? 이전 기록을 열어보니 같은 명칭입니다. 왜그랬을꼬...
  • 컨트롤러와 같은 클래스에 기술하기: @RestController 의 메서드로 @ExceptionHandler 를 단 메서드를 기술합니다.

@ExceptionHandler 어노테이션의 주석 문서에 굉장히 자세히 서술되어있던데요, 핸들러 함수의 형식은 좀 자유롭습니다. 강의에서 한 것처럼 대상 예외 클래스를 굳이 지정해주지 않더라도 패러미터에서 알아서 추정하기도 하는 거 같더라구요.

@RestController
@RequestMapping("/api/error-handle")
class WhiteLabelController {
    @GetMapping
    fun get() {
        val nullval: Int? = null
        println(1 + nullval!!)
    }

    @ExceptionHandler
    fun onError(ex: Exception): ResponseEntity<String> {
        return ResponseEntity.badRequest().body(ex.stackTraceToString())
    }

    @ExceptionHandler
    fun onNurupoError(ex: NullPointerException): ResponseEntity<String> {
        return ResponseEntity.badRequest().body("kat " + ex.stackTraceToString())
    }
}
@RestControllerAdvice // 패키지 등의 범위 제한 가능
class WhiteLabelErrorAdvice {
//    @ExceptionHandler(value = [Exception::class]) // kotlin 에서 클래스 언급 시
    @ExceptionHandler
    fun onError(ex: Exception): ResponseEntity<String> {
        return ResponseEntity.badRequest().body(ex.toString())
    }
}

모범?사례

그 뒤로 강의를 두 개를 더 이어서 봤는데, 뭘 말하려는지 모르겠더라구요. 강의 도중에 디버깅을 하고있는 모습을 반복해서 보자니 한 교수님이 떠오르네요. 패스트캠퍼스가 좀 더 검수를 잘 해줬으면 좋겠습니다. 이걸로 강사마다 강의 퀄리티가 들쑥날쑥할거라는 확신을 얻어버렸거든요... PluralSight 가 전체 오버뷰는 한 번에 안 되어도 강의 품질은 훨씬 낫다...

본 포스팅은 패스트캠퍼스 환급 챌린지 참여를 위해 작성되었습니다.
패스트캠퍼스: https://bit.ly/37BpXiC

#패스트캠퍼스 #패캠챌린지 #직장인인강 #직장인자기계발 #패스트캠퍼스후기 #한번에끝내는JavaSpring웹개발마스터초격차패키지Online

오늘의 소진은 정신적 여유입니다. 다음 내용은 (살짝 넘겨보니 아예 전혀 모르는 내용은 아닌 거 같지만) 새로운 내용인데, 여기에 이어서 볼 엄두가 안 나네요. 그냥 봐도 될 거 같긴 한데 상황이 여의칠 않아서 말이죠. 아마 미들웨어의 처리구조에 대한 설명과 그걸 직접 다루는 방법이 나오지 않을까요? 다른 언어의 다른 프레임워크들은 미들웨어를 바닥부터 만들었지만, 스프링은 그 역사 때문에 이것저것 지저분한 상태인 거 같아보이더라구요. (WAS가 왜 필요하지? :mollu:) 전체적인 오버뷰가 필요해보입니다. 이게 제가 딱 필요한 거구요. 4배속 진짜 필요하다니까...

내일 보죠!