5.3 PUT API와 DELETE API 만들기

김찬미·2024년 6월 8일
0
post-thumbnail

PUT API란?

PUT API는 웹 애플리케이션 서버를 통해 데이터베이스 같은 저장소에 존재하는 리소스 값을 업데이트하는 데 사용된다. POST API와 비교하면 요청을 받아 실제 데이터베이스에 반영하는 과정(서비스 로직)에서 차이가 있지만 컨트롤러 클래스를 구현하는 방식은 POST API와 거의 동일하다. 리소스를 서버에 전달하기 위해 HTTP Body를 활용해야 하기 때문이다.

1) @RequestBody를 활용한 PUT Method 구현

PUT API는 POST Method와 마찬가지로 값을 HTTP Body에 담아 전달한다. 서버에서는 이 값을 받기 위해 아래와 같이 @RequestBody 어노테이션을 사용한다.

1. Map 객체로 받을 때

    // http://localhost:8080/api/v1/put-api/member
    @PutMapping(value = "/member")
    public String putMember(@RequestBody Map<String, Object> putData) {
        StringBuilder sb = new StringBuilder();

        putData.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n");
        });

        return sb.toString();
    }

2. DTO 객체를 활용할 때

    // http://localhost:8080/api/v1/put-api/member1
    @PutMapping(value = "/member1")
    public String putMemberDto1(@RequestBody MemberDto memberDto) {
        return memberDto.toString();
    }

    // http://localhost:8080/api/v1/put-api/member2
    @PutMapping(value = "/member2")
    public MemberDto putMemberDto2(@RequestBody MemberDto memberDto) {
        return memberDto;
    }

첫 번째 메서드인 putMemberDto1은 리턴 값이 String 타입이고 두 번째 메서드인 putMemberDto2는 DTO 객체 타입이다. DTO 객체를 반환하면 어떤 결과가 일어날까?

전달받은 객체의 Content-Type은 'application/json'이 되고, 응답 결과는 JSON 형태로 Body에 실릴 것이다. @RestController 어노테이션을 사용하면 @ResponseBody를 생략할 수 있는데, 이 @ResponseBody 어노테이션은 자동으로 값을 JSON과 같은 형식으로 변환해서 전달하는 역할을 수행한다.

2) ResponseEntity를 활용한 PUT Method 구현

스프링 프레임워크에는 HttpEntity라는 클래스가 있다. HttpEntity는 헤더(Header)와 Body로 구성된 HTTP 요청과 응답을 구성하는 역할을 수행한다.

public class HttpEntity<T> {

	private final HttpHeaders headers;

	@Nullable
	private final T body;
}

RequestEntity와 ResponseEntity는 HttpEntity를 상속받아 구현한 클래스이다. 그중 ResponseEntity는 서버에 들어온 요청에 대해 응답 데이터를 구성해서 전달할 수 있게 한다. 다음과 같이 ResponseEntity는 HttpEntity로부터 HttpHeader와 Body를 가지고 자체적으로 HttpStatus를 구현한다.

public class RequestEntity<T> extends HttpEntity<T>

public class ResponseEntity<T> extends HttpEntity<T>

이 클래스를 활용하면 응답 코드 변경은 물론 Header와 Body를 더욱 쉽게 구성할 수 있다. 이 클래스는 PUT Method를 구현하는 이번 절에서 소개하고 있지만 다른 메서드에서도 모두 사용할 수 있는 클래스이다. 아래는 메서드의 리턴 타입에 ResponseEntity를 적용한 예시이다.

    // 예제 5.17
    // http://localhost:8080/api/v1/put-api/member3
    @PutMapping(value = "/member3")
    public ResponseEntity<MemberDto> postMemberDto3(@RequestBody MemberDto memberDto) {
        return ResponseEntity
                .status(HttpStatus.ACCEPTED)
                .body(memberDto);
    }

위 예제에서는 메서드의 리턴 타입을 ResponseEntity로 설정하고 리턴 값을 만든다. status에 넣을 수 있는 값은 다양한데, 예제에서 사용한 HttpStatus.ACCEPTED는 응답 코드 202를 가지고 있다. 즉, 이 메서드를 대상으로 요청을 수행하면 응답 코드는 202로, Body엔 memberDto가 JSON 형태로 담길 것이다.


DELETE API란?

DELETE API는 웹 애플리케이션 서버를 거쳐 데이터베이스 등의 저장소에 있는 리소스를 삭제할 때 사용된다. 서버에서는 클라이언트로부터 리소스를 식별할 수 있는 값을 받아 데이터베이스나 캐시에 있는 리소스를 조회하고 삭제하는 역할을 수행한다. 이때 컨트롤러를 통해 값을 받는 단계에서는 간단한 값을 받기 때문에 GET 메서드와 같이 URI에 값을 넣어 요청을 받는 형식으로 구현된다.

1) @PathVariable과 @RequestParam을 활용한 DELETE 메서드 구현

@PathVariable을 이용하면 아래와 같이 URI에 포함된 값을 받아 로직을 처리할 수 있다.

    // http://localhost:8080/api/v1/delete-api/{String 값}
    @DeleteMapping(value = "/{variable}")
    public String DeleteVariable(@PathVariable String variable) {
        return variable;
    }

@DeleteMapping 어노테이션에 정의한 value의 이름과 메서드의 매개변수 이름을 동일하게 설정해야 삭제할 값이 주입된다. 또는 @RequestParam 어노테이션을 통해 쿼리스트링 값을 받을 수도 있다.

    // http://localhost:8080/api/v1/delete-api/request1?email=value
    @DeleteMapping(value = "/request1")
    public String getRequestParam1(@RequestParam String email) {
        return "e-mail : " + email;
    }
profile
백엔드 개발자

0개의 댓글

관련 채용 정보