참조 - API란 무엇인가요? AWS : https://aws.amazon.com/ko/what-is/api/
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();
}
}
이 게시글에서 @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 |