restful api로 빠르게 crud 해보기

mark1106·2023년 11월 25일
0

백엔드

목록 보기
1/1

restful api란?

  • REST(Representational State Transfer)
    자원을 이름으로 구분하여 해당 자원의 상태를 주고 받는 모든 것

    1. HTTP URI(Uniform Resource Identifier)를 통해 자원(Resource) 명시
    2. HTTP Method(POST, GET, PUT, DELETE 등)를 통해 통신
    3. 해당 자원(URI)에 대한 CRUD Operation을 적용하는 것을 의미
  • REST의 특징

    1. Server - Client(서버 클라이언트 구조)
    2. Stateless : HTTP 프로토콜은 Stateless Protocol이므로 REST 또한 무상태성을 갖는다. 무상태성이란 Client의 내용을 Server에 저장하지 않고, Server는 각각의 요청을 완전히 별개의 것으로 인식하고 처리
    3. Cacheable : 파일 복사본을 캐시에 저장하여 다음번에 보다 빠르게 접근 가능
    4. Layered System : Client → Controller → Service → Repository와 같이 계층적으로 접근

rest api 설계하기

Controller, Repository, Enitity 만들어주기

간단하게 rest api를 설계해보자.
스프링 공식 홈페이지에서 참고하였다.
https://spring.io/guides/tutorials/rest/


먼저 Entity를 설정해주자.
id, title, content를 필드로 갖는 Board Entity를 만들었다.


Board 엔티티와 관련된 데이터베이스 조작을 위한 메서드를 정의하는 BoardRepository를 만들어보자.
Board 객체와 Board의 기본 키 타입을 id값으로 JpaRepository를 형성해준다.

api를 관리할 controller도 만들어주자.
이 때 @Controller + @ResponseBody인 @RestController와, @RequestMapping을 통해 루트 경로를 /api로 지정해주었다.
또한 위에서 만들어준 Boardrepository도 선언해주자.

단일 데이터 조회

먼저 가장 간단한 단일 데이터 조회를 해보자.

경로는 /api/boards/{id} (루트 경로 포함) 로 @PathVariable을 이용하여 조회하는 방법이다.
id값은 key값으로 고유값이기 때문에 중복되지 않고 단일 조회가 가능하다.
findById는 우리가 만든 repository에서 Jpa가 제공하는 기본 메서드이다.

조회이므로 HttpMethod Get, id가 2번인 데이터 조회를 해보자.

데이터 베이스에 저장된 id가 2번인 Board 데이터를 가져오는 것을 확인할 수 있다.

전체 데이터 조회


다음은 전체 데이터 조회이다.
전체 데이터도 단일 데이터와 마찬가지로 경로를 설정해주고 Board를 List에 담아 Jpa가 만들어준 findAll 함수로 모든 데이터를 가져올 수 있다.


http Get 메서드와 우리가 설정한 경로 api/boards로 조회하면 전체 데이터를 가져오는 것을 볼 수 있다.

데이터 저장

이번에는 데이터 저장이다.
데이터 조회와 달리 이번에는 데이터를 받아와 저장해야 하므로 HttpMethod Post를 사용해줘야 한다.
이 때 @RequestBody로 전송한 데이터를 받고 Board 객체를 생성해준다. 마찬가지로 Jpa에서 제공하는 save메서드로 Board 객체를 저장해준다.


@RequestBody로 전달해야 하므로 Postman에서 Body→raw→JSON 형식으로 Entity를 전달할 수 있다.

여기서 궁금한 점이 한 가지 있었다. 우리는 body에 Board 객체를 넘겨주는 것이 아니라 title과 content와 같은 JSON 형식의 데이터만 넘겨주는데 어떻게 Board 저장소에 저장되는 걸까?


다시 Board 클래스를 보자.
우리가 Board를 선언할 때 Entity로 등록하였고.
이 때 필드를 title, content로 지정하였다.
@RequestBody Board로 데이터를 받으면 body에서 보낸 title은 board.title에, content는 board.content에 스프링이 자동으로 바인딩해줘 객체를 생성해주는 것이었다.

데이터 수정

데이터 수정 기능을 살펴보자

@PathVariable로 id를 넘겨주어 id를 찾고 @RequestBody로 보낸 데이터를 통해 수정한다.

선택 사항이지만 만약 조회한 데이터가 없으면 저장시켜 주도록 작성하였다.


이 id가 9번인 데이터를 title을 컴퓨터구조, content를 재미 없음으로 바꿔보자

@PathVariable에 id값 9와 @RequestBody에 데이터를 넘겨주면 200OK 잘 처리되었다는 메세지를 받을 수 있다.

db를 확인해보자

데이터 삭제

데이터 삭제도 마찬가지로 @PathVariable을 사용하여 데이터 조회 후 DB에서 삭제한다.

Postman에서 DB에 있는 10번 데이터 값을 @PathVariable에 넣어주고 삭제해보자

DB를 확인해보면 9번까지 있고 10번이 없는 것을 확인할 수 있다.

Spring Data JPA에서 제공하는 쿼리 메서드(Query Method) 사용

findById처럼 Jpa가 기본으로 제공해주는 api가 아닌 findByTitle과 같이 내가 찾고 싶은 조건으로 api를 설정하려면 어떻게 해야할까?


BoardRepository 인터페이스에서 findBy<?> 과 같이 직접 선언해주면 된다.(몸통부 구현 x)
Jpa사용법은 아래 링크에 자세하게 나와있다.
https://docs.spring.io/spring-data/jpa/reference/jpa/query-methods.html

And, Or 등 내가 설정하고픈 조건들 사용 방법이 나와있다.

나는 검색한 제목 또는 내용에 포함된 모든 데이터들을 조회하고 싶어 findByTitleOrContent를 선언해주었다. 한번 사용해보자.
위에 모든 데이터 조회하는 코드를 수정해보았다. (@RequestParam으로 title과 content를 받고 아무것도 전달되지 않았을 때 모든 데이터 조회(findAll)를 하기 위해 defaultValue값을 설정해주었다.)

쿼리 파라미터를 이용하여 title과 content를 전달하여준다.
이 때 Or로 지정하였으므로 title=제목, content=월드인 데이터 모두 List에 담아 보여주는 것을 확인할 수 있다.

이렇게 스프링 문서를 참고하며 간단한 restful api를 빠르게 만들어보았다. 아직 스프링과 jpa에 대한 학습이 부족한 상태라 자세히 알지 못하지만 데이터의 생성,조회,삭제,수정 과정을 익힐 수 있었다.

profile
뒤돌아보면 남는 것은 사진, 그리고 기록 뿐

0개의 댓글