Rest API + Swagger

배지원·2022년 10월 30일
0

SpringBoot

목록 보기
2/11

REST

  • URI를 통한 자원의 명시와 HTTP메소드를 사용한 표현으로 서비스에 접근한는것.
  • HTTP URI 를 통해 자원(Resource)을 명시하고, HTTP Method(POST, GET, PUT DELETE) 를 통해 해당 자원에 대한 CRUD Operation을 적용하는 것
@GetMapping("/test")
public void gettest(){}

@PostMapping("/test")
public void posttest(){}
  • 위의 코드처럼 같은 url 주소에서 HTTP Method만 변경해주면 한개의 주소에서 2개의 HTTP 메서드 동작을 할 수 있다. 이것이 REST API 이다.

REST 장점

  • HTTP를 활용하여, 별도 인프라 구축이 필요 없음.
  • HTTP 표준 프로토콜에 따르는 모든 플랫폼에서 사용가능
  • REST API에 메시지가 의도하는바를 명확하게 나타내어 의도파악이 쉽다.(get인지 post인지 구분)
  • 서버와 클라이언트의 역할을 명확하게 분리한다.

사용방식
(1) RequestMapping

  • HTTP 메서드를 내부에서 설정
@RequestMapping(value = "/hello", method = RequestMethod.GET)
public String hello() {
        return "Hello World";
}
  • 예전에 사용하던 방식으로 value값(url)과 method(HTTP 메서드)를 설정해준다.

(2) Rest Mapping

  • 어노테이션을 사용하여 HTTP 메서드를 설정
@GetMapping(value = "/hello")
public String hello() {
        return "Hello World";
}
  • 요즘은 이 방식을 많이 사용함

REST API

  • 대중적으로 가장 많이 사용되는 애플리케이션 인터페이스이다.
  • 이 인터페이스를 통해 클라이언트는 서버에 접근하고 자원을 조작할 수 있다.

DAO

  • 데이터베이스에 접속하여 비즈니스 로직 실행에 필요한 쿼리를 호출한다.
  • Java의 객체 지향 프로그래밍 방법을 이용해 애플리케이션에서 사용할 DB로직을 객체 하나에 메소드로 구현하여 Controller나 Service에서 필요할 때 호출하여 사용할 수 있게 만든 모음집이 DAO이다.

DTO

  • 각 계층이 데이터를 주고 받을 때 사용하는 객체를 말한다.
  • 데이터 교환 만을 위해 사용하므로 로직을 갖지 않고, getter/setter 메소드만 갖는다.

예제

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;
    }
}

ResponseEntity

  • ResponseEntity는 get, post, put, delete, patch 모두 사용할 수 있음
  • Http Response Header와 Body를 구성하기 쉽게 해줌
  • .status(HttpStatus.ACCEPTED) : 응답코드가 202로 변경됨(Header를 자기가 원하는 값으로 변경 가능)
  • Json 형식으로 반환해줌
@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) Get API

  • GET를 통해 해당 리소스를 조회한다. 리소스를 조회하고 해당 문서에 대한 자세한 정보를 가져온다.

(1) @PathVariable

// localhost:8080/variable1/1
@GetMapping(value = "/variable1/{variable}")
public String getVariable1(@PathVariable String variable) {
        return variable;
}
  • @PathVariable를 통하여 URL에 들어오는 값을 받아올 수 있다.
  • URL에 주소뒤에 /value를 입력하고 value를 variable로 받아 매개변수에 저장함

(2) @PathVariable("variable")

@RequestMapping(value = "/variable2/{variable}")
public String getVariable2(@PathVariable("variable") String var) {
        return var;
}
  • 만약 @GetMapping 어노테이션에 지정한 변수 이름과 메서드 매개변수 이름을 동일하게 맞추기 어렵다면 @PathVariable 뒤에 괄호를 열어 변수명을 지정해준다.

(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;
        }
  • URL의 QUery Prameter를 통해 값을 전달받는다.
  • 가장 많이 사용하는 방식으로 값이 들어올때는 "localhost:8080/variable1?id=1" 이런식으로 ?를 통해 값 입력을 할 수 있다.
  • 값은 무조건 받는 수와 동일하게 입력을 해줘야한다(email값을 빼먹으면 오류 발생)


(2) Post API

  • Post를 통해 해당 URL를 요청하면 리소스를 생성한다. 주로 Insert할때 사용함
  • RequestBody를 통해 JSON 형태로 값 입력
@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에 담아서 전송함


(3) Put API

  • 웹 애플리케이션 서버를 통해 데이터베이스 같은 저장소에 존재하는 리소스 값을 업데이트 하는데 사용합니다. (주로 Update할때 사용)
  • POST API와 비교하면 요청을 받아 실제 데이터베이스에 반영하는 과정에서 차이가 있지만, 컨트롤러 클래스를 구현하는 방법은 POST API와 거의 동일합니다.
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요청도 마찬가지로, 기존의 값이 변하는 것으므로 멱등성이 성립한다.


참고자료 : 멱등성 정리 블로그


(4) Delete API

  • 웹 애플리케이션 서버를 거쳐 데이터베이스 등의 저장소에 있는 리소스를 삭제할 때 사용
  • 서버에서는 클라이언트로부터 리소스를 식별할 수 있는 값을 받아 데이터베이스나 캐시에 있는 리소스를 조회하고 삭제하는 역할을 수행합니다.
@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;
    }
}

Swagger

  • Swagger는 OAS(Open Api Specification)이다.
  • API 문서화를 쉽게 할 수 있도록 도와주며, 파라미터를 넣어서 실제로 어떤 응답이 오는지 테스트도 할 수 있다.
  • 아래 링크 참고

Spring Boot + Swagger 3.0.0 적용

  • 위의 링크는 gradle환경으로 했지만 maven에서도 가능하다.
  • pom.xml에서 alt + insert 후 Add dependency 클릭

  • springfox-boot-starter와 springfox-swagger-ui를 검색하여 3.0.0 버전으로 추가
  • 꼭 전에 넣어주어야 한다.

  • 추가 후 새로 고침!
  • 만약 에러가 난다면?
    • application.properties 를 application.yml로 이름을 변경해준다.

    • 그 후 아래의 코드를 추가해준다.

      spring:
        mvc:
          pathmatch:
            matching-strategy: ant_path_matcher
  • 만약 application.properties 에서 포트를 변경했었다면?
    • application.yml에서 포트 번호를 변경하는 방법은 다르다!

    • 기존 포트 변경 코드는 지우고 아래 코드로 변경!!

      server:
        port : 8081
  • 그 후 SwaggerConfiguration class파일 추가

  • 그리고 아래처럼 코드 추가
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();
    }
}
profile
Web Developer

0개의 댓글