NodeJS에서 Spring 전환하기 2

장달진·2024년 4월 21일

오늘은 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

@RestController를 사용하면 NestJS의 @Controller와 동일한 기능을 한다
NestJS에선 @Controller('/path')이런 식으로 사용했는데
Spring에선 @RestController@RequestMapping("/path")가 둘 다 필요하다!
명확해서 오히려 좋은 것 같다

Method

메소드 대로 모두 있는데@GetMapping("{path}")
이건 NestJS에서 @Get("{path}")과 같다
단, NestJS에선 @Get('/')@Get('')@Get()이 동일하게 라우팅되지만 Spring은 이걸 @GetMapping @GetMapping("/")이 다르다. 고로
http://localhost/pathhttp://localhost/path/는 다르다!

ResponseEntity

해당 클래스 타입으로 wrap해서 내보내면 Status Code를 변경하여 내보낼 수 있다.

[오늘의 결론]
아직은 왕초보 단계지만 지금까지로는 NestJS보다 Controller 선언이 편하다 :)

profile
아무것도 모르는 개발자

0개의 댓글