보라코딩

스프링부트로 RESTful 웹 서비스 만들기 본문

코딩/Spring

스프링부트로 RESTful 웹 서비스 만들기

new 보라 2023. 7. 24. 16:24
REST 기초

 

REST : 웹 서비스 제작하기 위한 아키텍처 스타일

 

 

REST의 6가지 제약조건
- 상태 비저장 : 서버는 클라이언트 상태에 관한 어떤 정보도 저장하지 않는다
- 클라이언트-서버의 역할 구분 : 클라이언트와 서버는 독립적으로 작동한다.
- 캐시 가능 : 웹 서비스는 이용하는 여러 클라이언트가 같은 리소스를 요청할 떄가 많다. 응답을 캐시하는 기능이 있으면 성능 향상에 유리하다
- 균일한 인터페이스 : 클라이언트(브라우저, 자바/모바일 애플리케이션)는 달라도 보내는 요청은 비슷해야 한다. 
- 계층형 시스템 : REST는 계층형 시스템 아키텍처를 이용할 수 있게 해준다
- 주문형 코드 : 선택적인 제약 조건이다

 

 

 

 

RESTful 웹 서비스 만들기

 

 

스프링부트에서 모든 HTTP 요청은 컨트롤러 클래스로 처리된다.

RESTful 웹 서비스 만들려면 컨트롤러 클래스 만들어야 한다.

 

 

CarController

 

@RestController 어노테이션 덕분에 데이터는 응답에 JSON 형식으로 직렬화됨

@RequestMapping은 모든 HTTP방식의 요청을 처리함 (GET / PUT / POST / DELETE 등)

 

package com.packet.cardatabase.web;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import com.packet.cardatabase.domain.Car;
import com.packet.cardatabase.domain.CarRepository;

@RestController
public class CarController {

@Autowired
private CarRepository repository;

@RequestMapping("/cars")
public Iterable<Car> getCars(){
return repository.findAll();
}

}

 

 

 

추가로 Owner.java에서 변경 필요

@Entity
@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class Owner {

.......
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, mappedBy="owner")
private List<Car> cars;

......}

 

 

 

그럼 아래로 이동 시, JSON 형식으로 표시되는 것 볼 수 있다.

http://localhost:8080/cars

 

[{"id":3,"brand":"Ford","model":"Mustang","color":"Red","registerNumber":"ADF-1121","year":2021,"price":59000},
{"id":4,"brand":"Nissan","model":"Leaf","color":"White","registerNumber":"SSJ-3002","year":2019,"price":29000},
{"id":5,"brand":"Toyota","model":"Prius","color":"Silver","registerNumber":"KKO-0212","year":2020,"price":39000}]

 

 

 

 

크롬 브라우저 사용시

아래 확장 프로그램 설치해주면 더 쉽게 볼 수 있다.

 

 

 

 

 

 

 

 

 

 

스프링 데이터 REST 이용하기

 

 

 

pom.xml
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-rest</artifactId>
</dependency>

 

 

application.properties

엔드포인트 정의

spring.data.rest.basePath=/api

 

 

 

이렇게 설정하고 이동하면

http://localhost:8080/api

엔티티 서비스에 대한 링크가 생긴다.

 

Car 엔티티 서비스 경로 이름 -> cars  (소문자되고 복수형)

 

 

 

 

 

 

 

다른 경로 이름 이용하려면~

 

@RepositoryRestResource(path="vehicles")
public interface CarRepository extends CrudRepository<Car, Long>{

 

 

 

vehicles로 변경되었다!

 

 

 

 

 

 


 

 

postman에서 DELETE 요청 보내기!

 

작업이 정상적으로 수행되면 204 No Content 응답 표시됨

 

 

 

 

 

 

POST 방식으로 새 car 객체 추가

 

POST 선택해주고 URL 넣기

Body에 raw 선택해서 내용 직접 넣어주기

 

 

 

 

Headers 선택해서 헤더 설정하기

 

 

 

 

이렇게 작성하고 Send 누르면 201 Created 확인 가능!

 

 

 

 

 

 

 

 

 

PATCH로 업데이트하기 (부분 교체)

 

http://localhost:8080/api/cars/{id}

 

 

Body에서 raw 선택하고 

바꿀 데이터만 입력 후 SEND

 

200 OK 확인 가능!

 

 

 

 

 

 

 

 

PUT으로 방금 생성한 새 자동차에 소유자를 추가하자!

http://localhost:8080/api/cars/6/owner

http://localhost:8080/api/owners/1

 

 

Body에 넣고

 

 

헤더값도 넣기

SEND하면

 

 

 

 

GET 요청시 PUT 방식으로 추가된 것 확인 가능!

 

 

 

 

 


 

 

 

서비스에 쿼리 포함 가능

@RepositoryRestResource 어노테이션 추가!

쿼리 매개변수에는 @Param 어노테이션 지정

 

package com.packet.cardatabase.domain;

import java.util.List;

import org.springframework.data.repository.CrudRepository;
import org.springframework.data.repository.query.Param;
import org.springframework.data.rest.core.annotation.RepositoryRestResource;


@RepositoryRestResource
public interface CarRepository extends CrudRepository<Car, Long>{

// 브랜드로 자동차 검색
List<Car> findByBrand(@Param("brand") String string);

// 색상으로 자동차 검색
List<Car> findByColor(@Param("color") String color);

// 연도로 자동차 검색
List<Car> findByYear(int year);

}

 

 

 

 

 

 

http://localhost:8080/api/cars/search

 

 

 

 

 

 

 

http://localhost:8080/api/cars/search/findByBrand?brand=Ford

서비스에서 쿼리 제공