본문 바로가기
Programming/Java

API(POST, PUT, DELETE) 만들기

POST API: DB 등 저장소에 리소스 저장할 때 사용. HTTP body에 담아 서버에 전달

(GET API는 URL경로나 파라미터 노출. POST는 하나에 담아 숨김)

 

JSON: 자바스크립트 객체문법 따르는 문자 데이터 형태. (Java Script Object Notation)

 

 

방법: 클래스 생성 후 RequestMapping으로 공통 URL 설정

package com.springboot.api.controller;

import com.springboot.api.dto.MemberDto;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping("/api/v1/post-api")
public class PostController {
    @RequestMapping(value = "/domain", method = RequestMethod.POST)
    public String postExample(){
        return "Hello Post API";
    }
    // http://localhost:8081/api/v1/post-api/member
    @PostMapping(value = "/member")
    public String postMember(@RequestBody Map<String, Object> postData) {
        StringBuilder sb = new StringBuilder();

        postData.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n" );
        });
        return sb.toString();
    }
    // http://localhost:8081/api/v1/post-api/member2
    @PostMapping(value = "/member2")
    public String postMemberDto(@RequestBody MemberDto memberDto) {
        return memberDto.toString();
    }
}

 

다음 실행시 데이터를 입력하되 json형태로 전달해야 한다. 호출방식 POST임을 유의한다.

그냥 member

 

 

dto 쓴 결과

 

 

 

 

 

 

 

PUT API: 저장된 리소스 업데이트 목적. POST API와 거의 동일

 

주소를 put으로 바꾸고, PutMapping을 사용한다.

package com.springboot.api.controller;

import com.springboot.api.dto.MemberDto;
import org.springframework.web.bind.annotation.*;

import java.util.Map;

@RestController
@RequestMapping(value = "/api/v1/put-api")
public class PutController {
    // http://localhost:8081/api/v1/put-api/member
    @PutMapping(value = "/member")
    public String postMember(@RequestBody Map<String, Object> putData) {
        StringBuilder sb = new StringBuilder();

        putData.entrySet().forEach(map -> {
            sb.append(map.getKey() + " : " + map.getValue() + "\n" );
        });
        return sb.toString();
    }
    // http://localhost:8081/api/v1/put-api/member2
    @PutMapping(value = "/member1")
    public String postMemberDto1(@RequestBody MemberDto memberDto) {
        return memberDto.toString();
    }
    // http://localhost:8081/api/v1/put-api/member2
    @PutMapping(value = "/member2")
    public MemberDto postMemberDto2(@RequestBody MemberDto memberDto) {
        return memberDto;
    }
}

 

직접 작성한 형태는 member

문자열 형태는 member1 (text/plain) 형태

객체 자체는 member2(application/JSON) 형태

 

 

 

 

Header와 Body를 더 쉽게 구현하도록 돕는 ResponseEntity

    // http://localhost:8081/api/v1/put-api/member3
    @PutMapping(value = "/member3")
    public ResponseEntity<MemberDto> postMemberDto3(@RequestBody MemberDto memberDto) {
        return ResponseEntity
                .status(HttpStatus.ACCEPTED) // 응답코드 202로 변경
                .body(memberDto);
    }

 

 

 

 

 

 

 

DELETE API: 리소스 삭제할 떄 사용

package com.springboot.api.controller;

import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping(value ="/api/v1/delete-api")
public class DeleteController {
    // http://localhost:8081/api/v1/delete-api/{String 값}
    @DeleteMapping(value = "/{variable}")
    public String DeleteVariable(@PathVariable String Variable) {
        return Variable;
    }
    //http://localhost:8081/api/v1/delete-api/request1?email=value
    @DeleteMapping(value = "/request1")
    public String getRequestParam1(@RequestParam String email) {
        return "e-mail : " + email;
    }
}

 

 

 

 

 

 

Swagger: REST API 문서화

 

우선 springboot 버전을 2.5.6으로 정하고(최신버전 사용시 버전충돌 있음), pom.xml에서 의존성을 추가한다.

 <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger2 -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger2</artifactId>
            <version>2.9.2</version>
        </dependency>

        <!-- https://mvnrepository.com/artifact/io.springfox/springfox-swagger-ui -->
        <dependency>
            <groupId>io.springfox</groupId>
            <artifactId>springfox-swagger-ui</artifactId>
            <version>2.9.2</version>
        </dependency>

 

 

그리고 Swagger configuration을 다음과 같이 만든다.

package com.springboot.api.config;


        import org.springframework.context.annotation.Bean;
        import org.springframework.context.annotation.Configuration;
        import springfox.documentation.builders.ApiInfoBuilder;
        import springfox.documentation.builders.PathSelectors;
        import springfox.documentation.builders.RequestHandlerSelectors;
        import springfox.documentation.service.ApiInfo;
        import springfox.documentation.spi.DocumentationType;
        import springfox.documentation.spring.web.plugins.Docket;
        import springfox.documentation.swagger2.annotations.EnableSwagger2;
// 접속 주소: http://localhost:8081/swagger-ui.html
@Configuration
@EnableSwagger2
public class SwaggerConfiguration {

    @Bean
    public Docket api(){
        return new Docket(DocumentationType.SWAGGER_2)
                .apiInfo(apiInfo())
                .select()
                .apis(RequestHandlerSelectors.basePackage("com.springboot.api"))
                .paths(PathSelectors.any()) // basePackage로부터 Mapping된 resource를 문서화 시킴
                .build();
    }
    private ApiInfo apiInfo(){
        return new ApiInfoBuilder()
                .title("Chatbot API Documentation")
                .description("This documents describes about Kakao Chatbot RestAPI ")
                .version("1.0.0")
                .build();
    }
}

 

 

 

그리고 Get 컨트롤러에 다음 내용을 수정한다.

    // http://localhost:8081/api/v1/get-api/request1?name=value1&email=value2&organization=value3
    @ApiOperation(value = "GET 메서드 예제", notes = "@RequestParam을 활용한 GET method")
    @GetMapping(value = "/request1")
    public String getRequestParam1(
            @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;
    }

 

 

 

그리고 http://localhost:8081/swagger-ui.html 에 접속시 지금까지 작성한 모든 컨트롤러에 대한 페이지가

다음과 같이 정리되어 나온다.

 

지금까지 만든 API에 대한 각 정보를 제공하며 값을 입력하고 출력할 수도 있다.

이런식으로 API 작업에 대한 정리를 하는 것 또한 작업과정에서 중요하다.

 

 

 

 

 

 

 

 

Lognack(로킹 라이브러리): 시스템 상태나 동작 정보를 시간 순으로 기록하는 것 

디버깅, 개발 이후 발생한 문제를 해결할 떄 원인 분석에 꼭 필요한 일이다.

다음 내용의 logback-srping.xml  파일을 복붙하여 생성한다.

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <property name="LOG_PATH" value="./logs"/>

    <!-- Appenders -->
    <appender name="console" class="ch.qos.logback.core.ConsoleAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
        </encoder>
    </appender>

    <appender name="INFO_LOG" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <filter class="ch.qos.logback.classic.filter.ThresholdFilter">
            <level>INFO</level>
        </filter>
        <file>${LOG_PATH}/info.log</file>
        <append>true</append>
        <rollingPolicy class="ch.qos.logback.core.rolling.TimeBasedRollingPolicy">
            <fileNamePattern>${LOG_PATH}/info_${type}.%d{yyyy-MM-dd}.gz</fileNamePattern>
            <maxHistory>30</maxHistory>
        </rollingPolicy>
        <encoder>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%-5level] [%thread] %logger %msg%n</pattern>
        </encoder>
    </appender>

    <!-- TRACE > DEBUG > INFO > WARN > ERROR > OFF -->
    <!-- Root Logger -->
    <root level="INFO">
        <appender-ref ref="console"/>
        <appender-ref ref="INFO_LOG"/>
    </root>
</configuration>

 

 

 

 

728x90
반응형