RequestMapping 너는 내가 담당한다

2024. 5. 12. 16:28TIL

✔오늘 배운 중요한 🔑 point

  • 프로세스 간 데이터를 전달하는 객체인 DTO는 Controller의 인자로 사용되는데 기본적으로 DTO는 불변성을 유지하기 때문에 data class로 작성한다
  • DTO를 Controller의 인자로 사용될때 사용하는 어노테이션이 @RequestBody 이다

🎯 오늘 배운 내용

 

Spring에서 Controller를 등록을 할때  data만 return하는 경우에는 @RestController 를 사용할 수 있다

@RestController
class CourseController {
}

@RestController 어노테이션을 작성함으로서 CourseController class를 Bean으로 등록한다

CourseController가 컨트롤러로 등록이 된건 OK ,

그렇다면 이  CourseController는 어떤 url을 담당하는걸까?

 

 

 

HandlerMapping에서  해당 url 의 요청을 받을 Controller가 무엇인지를 매칭을 해주기 때문에

CourseController가 어떤 url의 요청을 담당하는지를 적어줘야한다!

@RequestMapping("/courses")
@RestController
class CourseController {
}

@RequestMapping 어노테이션을 통해서  "/courses" 하위에 있는 모든 요청들을 CourseController가 담당하게 된다!

 즉 "/courses"하위의 요청이 들어온다면 CourseController가 담당하게 된다

 

조회

 

@GetMapping, @PostMapping, @PutMapping, @DeleteMapping, @PatchMapping등은 

 @RequestMapping의 파생 어노테이션으로 함수(fun)와 함께 사용된다!!

@RequestMapping("/courses")
@RestController
class CourseController {

    @GetMapping
    fun getCourseList(): ResponseEntity<List<CourseResponse>>{
        TODO()
    }
    
}

 

만약 @RequestMapping("/courses")가 없다면 -> @GetMapping("/courses")라고 명시해주면 된다!

지금은 @RequestMapping("/courses")이 명시가 되어있기때문에 @GetMapping()도 "/courses"의 위치를 담당한다고 볼 수 있다.

 

@RequestMapping("/courses")가 명시되었다면 아래 코드의 의미는 

@GetMapping("/{courseId}")

@GetMapping("/courses/{courseId}")

라고 할 수 있다.

 

자 여기서 {courseId}란 뭘까?

{} 이것은 경로 변수를 표시하는 방법이다!!

예를들어

 

이렇게 주소 뒤에  https://hjpkotlin2024.tistory.com/42 에서 /42가 {}안에 들어가는 내용이라고 보면된다

@PathVariable 어노테이션은 이러한 경로값을 매핑할때 사용한다  즉 이 코드는

@GetMapping("/{courseId}")
    fun getCourse(@PathVariable courseId:Long){
        TODO()
    }

courseId 라는 @PathVariable이 있고  그 타입은 Long타입이다 라는 뜻이다

 

 

생성

  Post요청을 처리하는 함수를 지정하는 @PostMapping을 보면 @RequestBody가 사용된 것을 확인 할 수 있다

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

단순 조회를 하는 Get과 달리 생성을 하는 Post 요청에는 보통 요청 바디에 데이터가 포함되어 있기 때문에

 

data class CreateCourseRequest(
    val title:String,
    val description:String?,
)

data calss로 정의 되어있는 CreateCourseRequest라는 dto로 mapping을 하기 위해서  

(@RequestBody createCourseRequest: CreateCourseRequest) 라는 내용이 들어가게 된다

 

자 여기서  클라이언트가 새로운 강의를 생성하는 POST요청을 보낸다면 서버는 새로운 강의를 생성하고 그 결과를 응답으로 반환을 해야만 할것이다

 

 

따라서

data class CourseResponse(
    val id:Long,
    val title: String,
    val description: String?,
    val status: String,
    val maxapplicants: Int,
    val numapplicants: Int
)
@PostMapping
    fun createCourse(@RequestBody createCourseRequest: CreateCourseRequest):ResponseEntity<CourseResponse>{
        TODO()
        return ResponseEntity.status(HttpStatus.CREATED).body(어쩌구저쩌구)
    }

CourseResponse라는 객체는 새로 생성된 강의의 정보를 담고있으므로 CourseResponse를 반환해야만 하는데

우리는 CourseResponse의 dto뿐만 아니라 StatusCode(요청의 성공,실패를 알려주는 코드) 또한 반환하고 싶으니 상세한 객체를 구성하기 위해서  ResponseEntity를 사용한다!

 

 

수정

 

수정은 어떻게 될까?

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

당연하게도 수정을 할려면 경로의 위치를 알아야하기 때문에 @PathVariable로 수정해야하는 경로를 명시해주고

어떤 내용으로 수정을 할건지에 대한 정보가 있어야하기때문에 @RequestBody도 작성을 해줘야한다!!

 

 

삭제

삭제는 어떻게 될까?

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

삭제도 마찬가지로 삭제를 진행하려면 경로의 위치가 당연히 있어야 하기 때문에 @PathVariable을 명시해줘야하며

어차피 수정이 아닌 삭제 이기 때문에 @RequestBody는 당연히 필요가 없다.

 

 

 

📓 오늘의 한줄

 

"All events are best understood by those who should understand them."

- Keigo Higashino -

 

 

'TIL' 카테고리의 다른 글

알고리즘(푸드 파이트 대회)  (0) 2024.05.14
예외처리를 전역적으로  (0) 2024.05.13
@Bean  (0) 2024.05.11
DI는 중요해  (0) 2024.05.10
Swagger  (0) 2024.05.09