2024. 5. 13. 20:55ㆍTIL
✔오늘 배운 중요한 🔑 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 |