Spring

GET vs POST

성찬우 2021. 9. 15. 19:31

우리는 개발을 할때 최종적으로 컨트롤러에서 매핑을 어노테이션을 통해 정해준다. 

 

혹시 헤더와 바디의 개념에 대해 조금은 알아볼 분들은 하단 링크를 3분만 투자해서 읽어보길 바란다!

https://fitchan.tistory.com/9

 

[http]헤더?바디..?타입..?

종종 공부를 하다보면 아무런 생각없이 "body에 담아서 보냇어요~!" "Json 타입이요!" 이런 말들을 하곤했지만 만약누가 그게 뭐에요? 라고 물어본다면 대답을 하지 못할 것같다. 모의면접보고 멘붕

fitchan.tistory.com

 

개발 할때 누가 "갯매핑이 모에오??" 혹은 "포스트매핑이 모에오??" 물어본다면

"GetMapping 조회 PostMapping 게시 기능하는거"

정도로 대답할 것 같다. 하지만 조금만 더 자세히 설명할 수 있는 우리가 되어 보도록 하자 

 

 

 

 

GET


GetMapping 을 사용하면 어떤 일이 벌어질까?

 

우선 모든일의 시작은 클라이언트의 "요청" 이다.

클라이언트에서는 우리에게 어떤것을 요청하는지 힌트를 준다. 

바로 우리가 사전에 약속했던 api (EX. /api/board ) 

 

우리가 약속했던 해당 api에 대체 뭐가 있는지 물어보는 것으로 시작한다. 

클라이언트 : " 야 너네 /api/board 에 있는거 다 내놔 그리고 Json으로 내놔 "

서버 : "어? 웅.... (데이터 json형태로 역직렬화 중 )여기......."

서버는 클라이언트의 요청을 역직렬화 하고

클라이언트는 서버에서 받은 Json을 받아 데이터형태를 조립할 수 있습니다. ex) { "제목" : "GET vs POST" }

 

 

관련 어노테이션
@PathVariable @RequestParam

 

POST


Post방식의 제일 포인트는 Body에 데이터를 담아 보낸다.

때문에 data의 형태에 대한 정보를 Header에 적어줘야합니다.  ex) "Content-Type":"application/json", charset=utf-8

또한 요청을 보낼시에 객체가 아직 json형태가 아니기 때문에 json형태로 변환을 해서 보내주어야 하는데

이 또한 적어줘야 가능한 일입니다.

 

관련 어노테이션
@RequestBody

 

 

.

.

.

이외에도 Put은 수정할 데이터에 대한 정보를 보내주어야 하기때문에 Header와 Body로 전달을 해주어야 하며

Delete는 Header에 Get방식과 동일하게 데이터를 실어 보내기 때문에 Body가 필요없습니다. 

 

그리고 Patch라는 것이 있는데 이건 Put매핑과 비슷한 기능을 합니다.

하지만 Body의 정보를 선택적으로 골라서 보내도록 하게 되어있는데 특이한 점은 Key-Value를 통해 부분 적인 

수정이 가능합니다. 하단의 코드를 참고하시면 사용하시기 쉬우실 겁니다. 

 

Service

@Transactional
    public ResponseEntity<Board> patch(Long boardId, Map<Object, Object> fields) {
        Optional<Board> board = boardRepository.findById(boardId);
        if(board.isPresent()) {
            fields.forEach((key, value) -> {
                Field field = ReflectionUtils.findField(Board.class, (String) key);
                field.setAccessible(true);
                ReflectionUtils.setField(field, board.get(), value);
            });
            Board updateBoard = board.get();
            return new ResponseEntity<>(updateBoard, HttpStatus.OK);
        }
        return null;
    }

Controller

@PatchMapping("/{boardId}")
    public ResponseEntity<Void> patchVacBoard(@PathVariable Long boardId, @RequestBody Map<Object, Object> fields) {
        medicalService.patch(boardId, fields);
        return ResponseEntity.ok().build();
    }

Controller부분 medicalService.patch(boardId, fields); 의 patch는 service의 메서드 이름입니다. 햇갈리지 마세요!!