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임을 유의한다.
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>
'Programming > Java' 카테고리의 다른 글
AOP (Aspect-Oriented Programming) 관점지향 프로그래밍 (0) | 2023.10.24 |
---|---|
useBean을 이용한 JSP 계산기 파일 단순화 (0) | 2023.10.19 |
Servlet (0) | 2023.10.19 |
Javascript를 넣은 회원가입창 만들기 (2) | 2023.10.18 |
[Java web] Hello JSP (2) | 2023.10.17 |