예외처리를 전역적으로

2024. 5. 13. 20:55TIL

✔오늘 배운 중요한 🔑 point

  • Exception을 전역적으로 처리하고 싶을때는  @ControllerAdvice, @RestControllerAdvice 어노테이션을 사용하면 된다.

🎯 오늘 배운 내용

 

Web Layer의 컨틀롤러와 DTO를 작성하면서 클라이언트의 요청과 응답은 구현을 한 상태이다

그렇다면 요청에 따른 요구사항을 코드로 작성하는 부분은 어디서 할까?

바로 Service Layer에서 담당한다!

 

그렇다면 Controller와 Service를 어떻게 연결할까?

여러 방법이 있지만 여기서는 생성자 주입을 활용하였는데  단순히 Interface를 주입을 해주어도

이 Interface를 상속받는 @service 어노테이션이 붙은 Bean들을 알아서 찾아준다!

interface CourseService {

    fun getAllCourseList(): List<CourseResponse>

    fun getCourseById(courseId:Long): CourseResponse

    fun createCourse(request: CreateCourseRequest):CourseResponse

    fun updateCourse(courseId:Long,request: UpdateCourseRequest):CourseResponse

    fun deleteCourse(courseId:Long)
}

 

@RequestMapping("/courses")
@RestController
class CourseController(
    private val courseService:CourseService
) {

    @GetMapping
    fun getCourseList(): ResponseEntity<List<CourseResponse>>{
        TODO()
    }
    @GetMapping("/{courseId}")
    fun getCourse(@PathVariable courseId:Long): ResponseEntity<CourseResponse>{
        TODO()
    }

    @PostMapping
    fun createCourse(@RequestBody createCourseRequest: CreateCourseRequest):ResponseEntity<CourseResponse>{
        TODO()

    }

    @PutMapping("/{courseId}")
    fun updateCourse(@PathVariable courseId:Long,@RequestBody updateCourseRequest: UpdateCourseRequest):ResponseEntity<CourseResponse>{
        TODO()
    }

    @DeleteMapping("/{courseId}")
    fun deleteCourse(@PathVariable courseId:Long){
        TODO()
    }
    
}

 

 

    @PutMapping("/{courseId}")
    fun updateCourse(@PathVariable courseId:Long,@RequestBody updateCourseRequest: UpdateCourseRequest):ResponseEntity<CourseResponse>{
        return ResponseEntity.status(HttpStatus.OK).body(courseService.updateCourse(courseId,updateCourseRequest))
    }

이제 각 함수에 return값을 지정해줄건데 HTTP의 응답상태 요청이 성공했음을 알리는 status(HttpStatus.OK)와  courseService.updateCourse(courseId, updateCourseRequest)를 호출하여 강의를 업데이트하고, 그 결과를 HTTP 응답의 바디로 설정한다

 

 

 

예외처리

예외처리를 할때 RuntimeException()은 어플리케이션이 실행될때 발생할수 있는 예외를 나타내는 class이므로 예외처리를 작성할때 RuntimeEception()을 상속을 받으면 된다!!

 

data class ModelNotFoundException(val modelName:String,val id:Long): RuntimeException(
    "Model $modelName not found with given id: $id"
)

 

이 예외처리를 각 Controller마다 다 작성을 한다면 중복코드가 많이 생기기 때문에 비효율적이다.

이 Exception을 전역적으로 처리할 수 있도록 @ControllerAdvice, @RestControllerAdvice 어노테이션을 사용하면 된다.

여기서는 단순히 data만 반환하기 때문에 RestControllerAdvice를 사용한다

 

@RestControllerAdvice
class GlobalExceptionHandler {

    @ExceptionHandler(ModelNotFoundException::class)
    fun handleModelNotFoundException(e:ModelNotFoundException): ResponseEntity<Unit> {
        return ResponseEntity.status(HttpStatus.NOT_FOUND).build()
    }
}

 

 

 

🤔 어떻게 활용할까?

RuntimeException을 활용해서 어플리케이션을 실행했을때 발생할수 있는 오류들에 대해서 예외처리를 할 수 있다

📓 오늘의 한줄

"Dum spiro spero" ( "While I breathe, I hope")

- MARCVS TVLLIVS CICERO -

 

 

 

'TIL' 카테고리의 다른 글

간단한 API를 직접 만들어보자(1)  (0) 2024.05.15
알고리즘(푸드 파이트 대회)  (0) 2024.05.14
RequestMapping 너는 내가 담당한다  (0) 2024.05.12
@Bean  (0) 2024.05.11
DI는 중요해  (0) 2024.05.10