API - 2 (GET, POST)

참조 - API란 무엇인가요? AWS : https://aws.amazon.com/ko/what-is/api/

 

API란 무엇인가요? - API 초보자를 위한 가이드 - AWS

 

aws.amazon.com

API 는 간단하게 클라이언트와 서버간의 약속이라고 설명할 수 있다.

클라이언트가 서버에게 요청을 보내면, 서버가 요구사항을 처리한 후 응답하는 것이다.

 

REST(Representational State Transfer) 는 클라이언트가 서버 데이터에 액세스 할 때 사용 가능한

GET, POST, PUT, DELETE 등의 함수 집합을 정의한다.

간단히 정리하자면 REST 란 주소에 명사를, 요청 방식에 동사를 사용해 의도를 명확히 드러내는 것을 의미한다.

 

동사는 JPA 에서 배웠던 CRUD 를 생각하면 된다.

 

+ 주의사항과 예시

더보기

주소에 들어가는 명사들은 복수형을 사용한다.

주소에는 동사를 가급적이면 사용하지 않는다.

 

  • 자동차 전체 목록 조회 요청
    GET /cars

  • ID 가 1번인 자동차 조회 요청
    GET /cars/1
  • 자동차 추가생성 요청
    POST /cars

  • ID 가 2번인 자동차 수정 요청
    PUT /cars/2

  • ID 가 3번인 자동차 삭제 요청
    DELETE /cars/3

 

그럼 각각 GET, POST, PUT, DELETE 에 해당하는 API 를 만들어 보자.

우선 이번에는 GET 과 POST API 만 만들어 보자.

 

 


 

GET

브라우저에서 접근 = GET 방식 API 를 만든다 = 요청에 응답하는 Controller 를 만든다.

JSON 형식이니 REST Controller 를 만들면 된다.

controller 패키지를 만든 후, 그 안에 CarController.java 파일을 만든다.

 

CarController.java (어노테이션 첨가 전)

더보기

 

package com.eunki96.test02.controller;


import com.eunki96.test02.domain.Car;
import com.eunki96.test02.domain.CarRepository;
import org.springframework.web.bind.annotation.GetMapping;

import java.util.List;

public class CarController {

    private final CarRepository carRepository;

    @GetMapping("/api/cars") //조회 : GET 방식으로 요청이 오면 메소드를 실행하라
    public List<Car> getCar() {
        return carRepository.findAll();
    }
}

 

이렇게 작성하면 

 

다음과 같이 오류가 생길텐데, 커서를 올려두고 alt+enter 를 하면

 

생성자를 만들지 않아서 오류가 생겼음을 알 수 있다.

이럴 때는 final 이 붙거나 @NotNull 이 붙은 필드의 생성자를 자동 생성해주는 Lombok 어노테이션

@RequiredArgsConstructor 를 사용하면 된다.

 

@GetMapping 은 GET 방식으로 요청이 오면 메소드를 실행하라는 뜻이다.

 

CarController.java (어노테이션 첨가 후)

package com.eunki96.test02.controller;


import com.eunki96.test02.domain.Car;
import com.eunki96.test02.domain.CarRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RequiredArgsConstructor
@RestController
public class CarController {

    private final CarRepository carRepository;

    @GetMapping("/api/cars")
    public List<Car> getCar() {
        return carRepository.findAll();
    }
}

 

https://eggmomo.tistory.com/4

 

RestController (브라우저에 클래스 정보 보여주기)

2022.09.16 - [공부/Spring (Sparta) -] - API, JS 데이터를 서버에서 전달받는 형식이 JSON이라는것을 알 수 있었다. 이 때 JSON형태로 데이터를 반환하기 위해 RestController를 사용한다. REST란 서버의 응답이..

eggmomo.tistory.com

이 게시글에서 @RestController 에 대해 언급했었으니 이는 넘어가자.

 

이제 localhost:8080/api/cars 로 들어가면,

 

위와같은 화면을 확인할 수 있다. 저번 게시글에서 H2 콘솔을 통해 확인한 데이터와 같은 상태다.

H2 콘솔이 아니어도 브라우저 주소를 통해 데이터를 확인할 수 있다.

 

이렇게 API 를 만들고 나면 실제로 잘 동작하는 지 확인하는 방법으로

  • 테스트 코드를 실행해본다.
  • ARC 툴을 사용한다.

두 가지가 있다.

앞으로는 ARC 로 API 가 잘 동작하는지 테스트 해보려한다.

 

예시

 

 


 

 

POST

이번에는 생성을 요청하는 POST 방식이다.

CarController.java 에 다음 내용을 추가해주면 된다.

private final CarService carService;

@PostMapping("/api/cars")
public Car createCar(@RequestBody CarRequestDto carRequestDto) {

    Car car = new Car(carRequestDto);

    return carRepository.save(car);
}

 

이번에는 생성을 요청하기에 @PostMapping 어노테이션을 이용한다.

하지만 브라우저에 주소를 치는 것은 GET 방식이기에 먼저 작성했던 @GetMapping 쪽으로 넘어가게 된다.

 

즉, URL 을 통해서 파라미터를 받는 GET 방식과 달리

POST 방식은 Body 값과 Content-Type 값을 작성해야 한다.

 

디테일한 것은 다음에 배우고, 지금은 ARC 로 테스트를 해보려 한다.

우선은 POST 방식으로 위 주소로 오면 createCar 메소드가 실행된다는 것만 알면 된다.

 

여기서 저번에 만들어놓은 DTO 를 이용해 자동차의 model 과 brand 정보를 가져오고,

DTO 의 정보를 car 에 담기 위해 생성자를 만들어 준다.

 

@RequestBody 는 요청한 정보를 carRequestDto 안에 넣어주는 역할을 한다.

API 에서 넘어오는 데이터를 받으려면 꼭 RequestBody 형태로 받아줘야 한다.

이런 식으로 Spring 은 요청을 주고받는 방식을 강제한다.

 

하지만 아직 CarRequestDto 를 파라미터로 이용하는 생성자를 만들지 않았으니 다음을 Car.java 에 추가해주면 된다.

public Car(CarRequestDto carRequestDto){
    this.model = carRequestDto.getModel();
    this.brand = carRequestDto.getBrand();
}

 

이제 ARC 를 사용해 잘 동작하는지 확인하려한다.

 

 

 

Headers 의 name 과 value 를 각각 입력하고

 

 

 

BODY 탭을 다음과 같이 입력한 후 SEND 버튼을 눌러 생성된 것을 확인한다.

 

 

GET 으로 요청시 다음 결과를 확인할 수 있다.

 

 

 

 

PUT, DELETE API 는 다음 글에서 추가하겠다.

'Spring > Spring 정리' 카테고리의 다른 글

API - 3 (PUT, DELETE)  (0) 2022.09.21
REST / REST API / RESTful 간단히 정리  (0) 2022.09.21
DTO  (2) 2022.09.19
JPA - 2 /CRUD로 행복회로 돌려보기(실습)  (0) 2022.09.18
JPA - 1  (0) 2022.09.17