Spring Boot - POST/PUT API 만들기

양현지·2023년 8월 21일
1

Web

목록 보기
7/10

1. POST API

HTTP Method : POST
용도 : 웹 어플리케이션을 통해 데이터베이스 등의 저장소에 리소스를 저장할 때 사용되는 API, 예를 들어 새로운 사용자를 생겅하거나 새로운 게시물을 작성하는 등의 작업
활용 방법 :GET API는 URL의 경로 or 파라미터에 변수를 넣어 요청을 보낸 반면 POST API는 저장하고나 하는 리소스나 값을 HTTP 바디에 담아 서버에 전달. 서버는 이 데이터를 받아 적절한 데이터베이스나 저장소에 저장하고 새로운 리소스의 식별자를 생성하여 응답으로 반환

1) @RequestMapping

① method 요소를 RequestMethod.POST로 설정

    @RequestMapping(value="/domain",method = RequestMethod.POST)
    public String postExample(){
        return "Hello Post API";

2) @RequestBody

① POST 요청은 클라이언트가 서버에 리소스를 저장하는 데 사용하므로 클라이언트의 요청 트래픽에 값이 포함돼 있음. (즉 앞서 말했듯 HTTP 바디에 리소스의 값이 저장되어있음)

2. PUT API

HTTP Method : PUT
용도 : 클라이언트에서 서버로 데이터를 전송하여 기존 리소스를 업데이트 or 수정. 즉 기존 리소스의 내용을 완전히 바꿀 때 사용
활용 방법 : 클라이언트는 업데이트할 리소스의 식별자를 URL에 포함시키고 & PUT 요청 본문에 수정된 데이터를 포함 시켜 요청을 보냄. 서버는 해당 식별자에 해당하는 리소스를 찾아 데이터 수정

1) @RequestBody

① HTTP BOdy에 데이터를 담아 전달

    @PutMapping(value="/member")
    public String postMember(@RequestBody Map<String,Object>pustData){
        StringBuilder sb = new StringBuilder();
        pustData.entrySet().forEach(map->{
            sb.append(map.getKey()+" : "+map.getValue()+"\n");
        });
        return sb.toString();
    }
    // return String
    @PutMapping(value="/member1")
    public String postMemberDto1(@RequestBody MemberDto memberDto){
        return memberDto.toString();
    }
    // return DTO Object
    @PutMapping(value="/member2")
    public MemberDto postMemberDto2(@RequestBody MemberDto memberDto){
        return memberDto;
    }

② @ResponseEntity

  • HttpEntity 클래스를 활용
    @ HttpEntity 클래스

    HttpEntity

    public class HttpEntity<T>{
    	private final HttpHeaders headers;
       @Nullable
       private final T body;
       ... 
    }
  • RequestEntity와 ResponseEntity는 HttpEntity를 상속받아 구현한 클래스

  • ResponseEntity : 서버에 들어온 요청에 대한 응답 데이터를 구성해 전달
    @ ResponseEntity 클래스

public class ResponseEntity<T> extends HttpEntity<T>{
	private final Object status;
}
  • ResponseEntity 클래스를 활용해 Header와 Body를 구성

3. REST API 명세서

1) API 명세서란

API 개발 시 명세서를 작성하여야함
API 명세서란 해당 API가 어떤 로직을 수행하고, 어떤 값을 요청하고, 이에 따른 응답값으로 무엇을 받는지를 정리
  • API 개발 과정에서 변경 사항을 주기적으로 명세 문서에 업데이트하도록 함
  • 번거로운 일이므로 Swagger를 사용하도록

2) Swagger

API 문서 자동화 및 시각화 도구로, 개발자들이 RESTful 웹 서비스의 설계, 문서화 및 테스트를 돕는 오픈소스 프레임워크

① API 문서화
: API 엔드포인트, 요청 및 응답 형식, 매개변수, 헤더 등에 대한 문서 자동화
개발자가 코드 작성 시 주석과 어노테이션을 사용해 설명을 추가하면 Swagger가 자동으로 api문서 생성
② 시각화
: Swagger UI는 API 문서를 시각적으로 보여주는 웹 기반 인터페이스
③ API 테스트
: Swagger UI를 통해 API를 직접 테스트. 매개변수를 설정하고 요청을 보내면 실제 응답을 확인 및 디버깅
④ 코드 생성
: Swagger는 API 정의를 기반으로 클라이언트 및 서버의 코드를 자동으로 생성하도록함(서버와 클라이언트 간 일관된 통신을 구현)
⑤ API 디자인
: Swagger를 사용해 API의 디자인과 구조를 미리 계획. 협업에도 용이

3) Swagger 사용하기

① 의존성 추가
@pom.xml

		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger2</artifactId>
			<version>2.9.2</version>
		</dependency>
		<dependency>
			<groupId>io.springfox</groupId>
			<artifactId>springfox-swagger-ui</artifactId>
			<version>2.9.2</version>
		</dependency>

② refresh maven project

  • ①과 같이 의존성 추가 시 "빨간 밑줄"이 생성되는데, 이는 maven project를 refresh하면 사라짐

③ SwaggerConfiguration.java 작성

package com.example.demo.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;

@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

}

④ application.properties 수정

  • Spring boot 2.6버전 이후에 spring.mvc.pathmatch.matching-strategy 값이 ant_apth_matcher에서 path_pattern_parser로 변경됨에 따라 오류 발생
spring.mvc.pathmatch.matching-strategy=ant_path_matc her

⑤ 서버 실행 후 "http://localhost:8080/swagger-ui.html" 접속

4) API 세부 내용 설정

① @ApiOperation
: 대상 API의 설명을 위한 어노테이션
② @ApiParam
: 매개변수에 대한 설명 및 설정을 위한 어노테이션

	// 추가
    @ApiOperation(value="GET 메서드 설명",notes="@RequestParam을 활용한 GET Method")
    @GetMapping(value = "/request1")
    public String getRequestParam1(
    		// 추가 (" @ApiParam (value="이름",required = true) ")
            @ApiParam (value="이름",required = true) @RequestParam String name,
            @ApiParam (value="이메일",required = true) @RequestParam String email,
            @ApiParam (value="회사",required = true) @RequestParam String organization){
        return name+" "+email+" "+organization;
    }
  • API와 매개변수에 대한 설명이 포함된 명세
    업로드중..

0개의 댓글

관련 채용 정보