@GetMapping("/test")
public void gettest(){}
@PostMapping("/test")
public void posttest(){}
사용방식
(1) RequestMapping
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
return "Hello World";
}
(2) Rest Mapping
@GetMapping(value = "/hello")
public String hello() {
return "Hello World";
}
예제
public class MemberDto {
private String name;
private String email;
private String organization;
public MemberDto(String name, String email, String organization) {
this.name = name;
this.email = email;
this.organization = organization;
}
public String getName() {
return name;
}
public String getEmail() {
return email;
}
public String getOrganization() {
return organization;
}
@Override
public String toString(){
return this.name + " " + this.email + " " + this.organization;
}
}
@RestController
@RequestMapping("/api/v1/put-api")
public class PutController {
@PutMapping(value = "/member3")
public ResponseEntity<MemberDto> putMemberDto3(@RequestBody MemberDto memberDto){
return ResponseEntity
.status(HttpStatus.ACCEPTED)
.body(memberDto);
}
}
(1) @PathVariable
// localhost:8080/variable1/1
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
return variable;
}
(2) @PathVariable("variable")
@RequestMapping(value = "/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var) {
return var;
}
(3) @RequestParam("name")
// localhost:8080/variable1?name=test&email=qqq@naver.com&organization=멋사
@GetMapping(value = "/request1")
public String getinfo(@RequestParam String name,
@RequestParam String email ,
@RequestParam String organization)
{return name + " " + email + " " + organization;
}
@PostMapping("/member-dto")
public String postMemberDto(@RequestBody MemberDto memberDto) {
return memberDto.toString();
} // JSON 형식으로 받아온 데이터를 create하고 위의 형식으로 리턴해줌
GET과 POST의 차이
GET
method는 클라이언트에서 서버로 어떠한 리소스로 부터 정보를 요청하기 위해 사용되는 메서드
즉 데이터를 읽거나 (Read), 검색 (Retrieve)할 때에 사용되는 method
POST
method는 리소스를 생성/업데이트 하기 위해 서버에 데이터를 보내는 데 사용됨
get 과 달리 전송해야될 데이터를 HTTP 메세지의 Body에 담아서 전송함
import com.springboot.springbootcoreguide.domain.dto.MemberDto;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
@RestController
@RequestMapping("/api/v1/put-api")
public class PutController {
@PutMapping(value = "/member3")
public ResponseEntity<MemberDto> putMemberDto3(@RequestBody MemberDto memberDto){
return ResponseEntity
.status(HttpStatus.ACCEPTED)
.body(memberDto);
}
}
POST과 PUT의 차이
POST
멱등성을 보장하지 않음
POST를 제외한 HTTP Method
멱등성을 보장함
멱등성이란?
같은 행위를 여러 번 반복하더라도 같은 효과를 가져야한다. 그것을 멱등성이라 부른다.
즉, 이는 응답이 다를 수는 있지만, 요청이 의도한 효과를 발휘할 때 멱등성이 유지됨을 의미한다.
예시
REST API로 간단한GET, POST, PUT, DELETE
를 하는 API를 만들었다고 가정할때
먼저 Data를 생성한다.POST
요청(insert)으로 생성을한다.POST/data
POST
요청을 반복하게 된다면 데이터들은 계속해서 추가가 될 것이고, 그 때 마다 서버의 응답은 다른 응답을 나타내며, 다른 효과를 지닐 것이다GET /data
GET
으로 목록을 요청(select)하여 불러온다.이 행위를 여러 번 수행한다고 서버의 상태가 변하지도 않고(단순히 조회만 하므로), 같은 효과를 기대할 수 있다. 따라서 멱등성과 안전한 메서드가 성립됨을 알 수 있다.PUT /data/3
PUT
으로 3번째 Data를 수정(update)한다고 할때, 3번 데이터가 없는 경우 데이터가 생성 될 수 있다. 하지만, 이미 존재한다면 데이터는 수정이 된다. 그러면 PUT요청이 여러 번 실행되더라도 3번째 Data는 우리가 요청한 그 값으로 수정된 항상 같은 상태일 것 이다.DELETE /data/3
DELETE
요청도 마찬가지로, 기존의 값이 변하는 것으므로 멱등성이 성립한다.
참고자료 : 멱등성 정리 블로그
@RestController
@RequestMapping("api/v1/delete-api")
public class DeleteController {
@DeleteMapping("/{variable}") // api/v1/delete-api/1 => 1번 데이터 삭제
public String deleteVariable(@PathVariable String variable){
return variable;
}
@DeleteMapping("/request1") // api/v1/delete-api/request1?email=123@naver.com => 123@naver.com 데이터 삭제
public String getRequestparam(@RequestParam String email){
return "e-mail : " + email;
}
}
Spring Boot + Swagger 3.0.0 적용
application.properties 를 application.yml로 이름을 변경해준다.
그 후 아래의 코드를 추가해준다.
spring:
mvc:
pathmatch:
matching-strategy: ant_path_matcher
application.yml에서 포트 번호를 변경하는 방법은 다르다!
기존 포트 변경 코드는 지우고 아래 코드로 변경!!
server:
port : 8081
package com.springboot.hello.configuration;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
@Configuration
public class SwaggerConfiguration {
@Bean
public Docket api() {
return new Docket(DocumentationType.OAS_30)
.select()
.apis(RequestHandlerSelectors.any())
.paths(PathSelectors.any())
.build();
}
}