보라코딩
스프링부트로 RESTful 웹 서비스 만들기 본문
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>{

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
서비스에서 쿼리 제공

'코딩 > Spring' 카테고리의 다른 글
스프링부트 테스트 (0) | 2023.07.25 |
---|---|
JWT로 백엔드 인증 구현하기 (0) | 2023.07.25 |
JPA를 이용한 데이터베이스 생성 및 접근 (0) | 2023.07.23 |
스프링 시큐리티 설정하기 (0) | 2023.07.18 |
타임리프 페이지 레이아웃 설정하기 (0) | 2023.07.17 |