오늘은 RESTful을 구현해보자
@RestController
@RequestMapping("/coffee")
class CoffeeController(private val coffeeRepository: CoffeeRepository) {
init {
coffeeRepository.saveAll(
listOf(
Coffee("Coffee1"),
Coffee("Coffee2"),
Coffee("Coffee3"),
Coffee("Coffee4")
)
)
}
@GetMapping
fun getCoffeeList(): ResponseEntity<List<Coffee>> {
return ResponseEntity(coffeeRepository.findAll().toList(), HttpStatus.OK)
}
@GetMapping("/{id}")
fun getCoffeeById(@PathVariable id: String): ResponseEntity<Coffee> {
return ResponseEntity(coffeeRepository.findById(id).orElseThrow(), HttpStatus.OK)
}
@PostMapping
fun postCoffee(@RequestBody coffee: Coffee): ResponseEntity<Coffee> {
return ResponseEntity(coffeeRepository.save(coffee), HttpStatus.CREATED)
}
@PutMapping("/{id}")
fun putCoffee(@PathVariable id: String, @RequestBody coffee: Coffee): ResponseEntity<Coffee> {
return ResponseEntity(coffeeRepository.save(coffee), if (coffeeRepository.existsById(id))
HttpStatus.OK
else
HttpStatus.CREATED
)
}
@DeleteMapping("/{id}")
fun deleteCoffee(@PathVariable id: String): Unit {
coffeeRepository.deleteById(id)
}
}
@RestController를 사용하면 NestJS의 @Controller와 동일한 기능을 한다
NestJS에선 @Controller('/path')이런 식으로 사용했는데
Spring에선 @RestController와 @RequestMapping("/path")가 둘 다 필요하다!
명확해서 오히려 좋은 것 같다
메소드 대로 모두 있는데@GetMapping("{path}")
이건 NestJS에서 @Get("{path}")과 같다
단, NestJS에선 @Get('/')과 @Get('')과 @Get()이 동일하게 라우팅되지만 Spring은 이걸 @GetMapping @GetMapping("/")이 다르다. 고로
http://localhost/path와 http://localhost/path/는 다르다!
해당 클래스 타입으로 wrap해서 내보내면 Status Code를 변경하여 내보낼 수 있다.
[오늘의 결론]
아직은 왕초보 단계지만 지금까지로는 NestJS보다 Controller 선언이 편하다 :)