Controller 구현 - 기본

귀찮Lee·2022년 6월 27일
0

Spring

목록 보기
16/30
post-custom-banner
@RestController
@RequestMapping("/v1/coffees")
public class CoffeeController {
    @PostMapping
    public ResponseEntity postCoffee(@RequestParam("korName") String korName,
                                     @RequestParam("engName") String engName,
                                     @RequestParam("price") int price) {
        
        Map<String, Object> map = new HashMap<>();
        map.put("korName", korName);
        map.put("engName", engName);
        map.put("price", price);

        return new ResponseEntity<>(map, HttpStatus.CREATED);
    }

    @GetMapping("/{coffee-id}")
    public ResponseEntity getCoffee(@PathVariable("coffee-id") long coffeeId) {
        System.out.println("# coffeeId: " + coffeeId);

        // not implementation

        return new ResponseEntity<>(HttpStatus.OK);
    }

    @GetMapping
    public ResponseEntity getCoffees() {
        System.out.println("# get Coffees");

        // not implementation

        return new ResponseEntity<>(HttpStatus.OK);
    }

    @PatchMapping("/{coffee-id}")
    public ResponseEntity patchCoffee(@RequestBody CoffeePatchDto coffeePatchDto,
                                      @PathVariable("coffee-id") long coffeeId) {
        coffeePatchDto.setCoffeeId(coffeeId);
        return new ResponseEntity<>(coffeePatchDto, HttpStatus.OK);
    }

    @DeleteMapping("/{coffee-id}")
    public ResponseEntity deleteCoffees(@PathVariable("coffee-id") long coffeeId){

        return new ResponseEntity<>(HttpStatus.NO_CONTENT);
    }

}

◎ 기본 Controller 어노테이션

  • @Controller

    • 주로 View를 반환하기 위해 사용 (클래스에 붙여 사용)
  • @RestController

    • @Controller + @ResponseBody
    • Json 형태로 객체 데이터를 반환
  • @RequestMapping

    @RequestMapping(value = "/v1/coffees", produces = {MediaType.APPLICATION_JSON_VALUE})
    • value (default) : 데이터 요청시에 URL 뒤에 붙여 실행할 메서드/클래스를 특정함
    • produces : 응답을 어떤 미디어 타입으로 클라이언트에게 전송할 것인지 명시
    • 만약 return 값이 String이고, Json으로 보내고 싶다면, MediaType.APPLICATION_JSON_VALUE이라고 명시해야 함
  • @XXXXMaping

    • 요청받는 http의 메서드를 정함
      • GET : 서버의 데이터를 변화시키지 않는 요청
      • POST : 요청마다 새로운 리소스를 생성 (멱등성 X)
      • PUT : 요청마다 같은 리소스를 반환 (멱등성 O)
      • PATCH : 수정의 용도 (PUT은 교체의 용도)
      • DELETE : 특정 부분 제거, 초기화
    • 같은 URI로 요청을 받더라도, http 메서드가 다르다면, 다른 코드가 실행됨
    • 뒤에 파라미터로 인자를 받아 @RequestMapping에서 작성한 value값 뒤에 붙여 URI 요청시 해당 코드가 실행됨

◎ Input 관련 어노테이션

  • @PathVariable
    • 요청하는 URI에 데이터를 넣어서 전달
      ex) DELETE, GET 과 같은 메서드에 그 데이터의 Primary Key를 넣어 특정 데리터 요청
  • @RequestParam
    • query에 값을 넣어 데이터를 받음
    • 또는 쿼리 파라미터(Query Parmeter), 폼 데이터(form-data), x-www-form-urlencoded 형식으로 전송하여 서버쪽에서 전달받음
  • @ModelAttribute
    • x-www-form-urlencoded 형식의 데이터를 DTO를 통해 받음
  • @RequestBody
    • JSON 형식의 데이터를 DTO를 통해 받음

◎ ResponseEntity

  • 전송 기본값

    • 기본적으로 String 값으로 return하게 되면 상단의 표와 같이 보내는 형식이 정해진다.
    • 기본적인 Collection 을 이용하게 된다면 SpringMVC 내부 과정에서 자동으로 JSON형태로 바꾸어 보내준다.
  • ResponseEntity

    • ResponseEntity 객체로 응답 데이터를 래핑함으로써 HTTP 응답 상태를 같이 전달할 수 있다.
    • HTTP 응답 상태를 같이 전달함으로써, 클라이언트의 요청을 서버가 어떻게 처리했는지를 쉽게 알 수 있다.
    • 클라이언트 쪽에서는 HTTP 응답 상태를 기반으로 다음 처리를 할지 에러처리를 할지 결정할 수 있다.
      ex) POST Method 에서 요청 정상 처리시 HttpStatus.OK보다는 HttpStatus.CREATED가 조금 더 자연스럽다.
profile
배운 것은 기록하자! / 오류 지적은 언제나 환영!
post-custom-banner

0개의 댓글