Book/스프링부트 핵심가이드

PUT 메서드 구현 방법(feat. @PutMapping)

블로그 주인장 2023. 10. 25.

API를 작성하는 다양한 방법

HTTP 메서드에 해당하는 API를 개발하고 그 과정에서 필요한 내용들 중

하나인 PUT 메서드의 구현에 관하여 자세하게 알아보겠습니다.


PUT API

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

@RequestBody를 활용한 PUT 메서드 구현

PUT API는 POST 메서드와 마찬가지로 값을 HTTP Body에 담아 전달한다.

서버에서는 이 값을 받기 위해 @RequestBody를 사용한다.

@RestController
@RequestMapping("/Sample")
public class SampleController {
	
    //http://localhost:8080/Sample/member
    @PutMapping(value = "/member")
    public String getValue(@RequestBody Map<String, Object> param) {
    	StringBuilder sb = new StringBuilder();
        
        param.entrySet().forEach(map -> {
        	sb.append(map.getKey() + " " + map.getValue() + "\n");
        });
        
        return sb.toString();
    }
}

서버에 어떤 값이 들어올지 모르는 경우, Map 객체를 활용하여 값을 받을 수 있다.

API를 개발한 쪽에서 작성한 명세(specification)를 웹사이트를 통해 클라이언트나 사용자에게 올바른 사용법을 안내한다.

 

DTO를 활용한 PUT 메서드 구현

서버에 들어오는 요청에 담겨 있는 값이 정해져 있는 경우 DTO 객체를 활용하여 구현한다.

@RestController
@RequestMapping("/Sample")
public class SampleController {
	
    //http://localhost:8080/Sample/member
    @PutMapping(value = "/member")
    public String putMember(@RequestBody MemberDto memberDto) {
        return memberDto.toString();
    }
    
    //http://localhost:8080/Sample/member
    @PutMapping(value = "/member2")
    public MemberDto putMember(@RequestBody MemberDto memberDto) {
        return memberDto;
    }
}

String 타입으로 보내면 String 타입으로 값을 전달받으며, 리턴 값을 DTO객체로 작성하면 DTO 객체의 toString 메서드 결과값이 출력된다.

toString 메서드로 인해 나름의 형식이 갖춰져 전달됐지만, HEADERS 항목의 'content-type' : 'text-plain'으로 결과값이 일반 문자열로 전달됐음을 확인할 수 있다.

DTO 객체로 반환 시에 'content-type' : 'application-json' 형식으로 전달된 것을 확인할 수 있다.

@RestController 어노테이션이 지정된 클래스는 @ResponseBody를 생략할 수 있는데, @ResponseBody 어노테이션은 자동으로 값을 JSON 형식으로 변환해서 전달하는 역할을 수행한다.

 

ResponseEntity를 활용한 PUT 메서드 구현

스프링 프레임워크에는 HttpEntity라는 클래스가 있다.

HttpEntity : 헤더(Header)와 Body로 구성된 HTTP 요청과 응답을 구성하는 역할을 수행한다.

 

RequestEntity와 ResponseEntity는 HttpEntity를 상속받아 구현한 클래스이다.

이 중 ResponseEntity는 서버에 들어온 요청에 대해 응답 데이터를 구성해서 전달할 수 있게 한다.

ResponseEntity는 HttpEntity로부터 HttpHeaders와 Body를 가지고 자체적으로 HttpStatus를 구현한다.

public class ResponseEntity<T> extends HttpEntity<T> {

	private final Object status;

	public ResponseEntity(HttpStatus status) {
		this(null, null, status);
	}
    
    //.. 생략
}

 

메서드 리턴타입을 ResponseEntity로 설정하여 리턴값을 만든다.

status에 넣을 수 있는 값은 다양한데, HttpStatus.ACCEPTED는 응답 코드 202를 가지고 있다.

해당 메서드를 대상으로 요청을 수행하면 응답코드가 202로 변경이 된다.

    @PutMapping(value = "/member3")
    public ResponseEntity<MemberDto> postMemberDto3(@RequestBody MemberDto memberDto) {
        return ResponseEntity.status(HttpStatus.ACCEPTED).body(memberDto);
    }
반응형

댓글