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);
}
'Book > 스프링부트 핵심가이드' 카테고리의 다른 글
DELETE 메서드 구현 방법(feat. @DeleteMapping) (0) | 2023.10.25 |
---|---|
POST 메서드 구현 방법(feat. @PostMapping) (0) | 2023.10.25 |
스프링부트 생성 (Feat. Spring Initializr) (2) | 2023.10.25 |
댓글