Programming/Web

[Web] 검색을 위한 좋은 RESTful URL은 어떤걸까?

stein 2022. 1. 19. 11:11

https://stackoverflow.com/questions/5020704/how-to-design-restful-search-filtering

 

How to design RESTful search/filtering?

I'm currently designing and implementing a RESTful API in PHP. However, I have been unsuccessful implementing my initial design. GET /users # list of users GET /user/1 # get user with id 1 POST /u...

stackoverflow.com

이번에 백엔드 작업을 하면서 검색에 대한 url을 어떻게 만들지 고민이 생겼다. 카테고리 이동 겸 검색기능이었는데, 카테고리가 다중으로 검색될 수 있는 형태여서 검색어도 리스트로 들어가야했다.

request.data
	> query(or body)
    	> category: [Programming, Vue, Web]
        
response = Programming, Vue, Web 카테고리를 가지는 post list

필요한 형태의 데이터

🤔

고민은 2가지였다. GET 형태의 API를 쓸지, POST 형태의 API를 쓸지. 각각의 장단을 확인해보자

 

GET

장점

1. RESTful의 정의에 부합한다. 우리는 게시글 리스트를 받아오고 싶은거지 만들어내는게(post) 아니기 때문이다.

2. get을 사용하기 때문에 http caching이 가능하다.

https://developer.mozilla.org/ko/docs/Web/HTTP/Caching

하지만, HTTP 캐시들은 일반적으로 GET에 대한 응답만을 캐싱하며, 다른 메서드들은 제외될 겁니다. 

3. url에 정보가 모두 담겨져있기 때문에 bookmarked가 된다.

 

단점

1. 만약 category가 엄청 많아진다면 url이 많이 길어질 수 있다.

 

POST

장점

1. category가 무한정 많아지더라도 body에 싣기 때문에 문제가 없다.

 

단점

1. RESTful하지 못하다. 

    -> (stackoverflow 1위 답변) 꼭 DB에 데이터를 생성하지 않아도 된다. search를 creating한다고 보면된다(?)

The best way to implement a RESTful search is to consider the search itself to be a resource. Then you can use the POST verb because you are creating a search. You do not have to literally create something in a database in order to use a POST.

2. url에 정보가 충분하지 않기에 bookmared가 되지 않는다.

 

결론

필자는 다음과 같은 GET 형태로 api를 만들었다.

/api/blog/post/list?category=Programming&category=Vue&category=Web

(backend)
request.query_params: category=['Programming', 'Vue', 'Web']

구현된 형태

👍

1. 백엔드에서 데이터를 다루기 매우 쉬운 형태이다.

2. url만 보더라도 어떤 데이터를 조회하는지 알 수 있다.

3. 카테고리 검색 정보이기 때문에 url이 무지하게 길어질 상황은 많이 없을 것이라 판단했다.

4. frontend의 페이지 url에도 동일한 로직을 사용한다. 이 부분을 개인적으로 중요시하였다. 개인적인 취향일 수 있으나, 작업자가 최대한 헷갈리지 않도록 구현하는게 유지보수에도 좋다고 생각하기 때문이다. 사용설명서가 필요없는 api가 가장 좋지 않은가?

 

👎

1. url을 만들기 위한 로직이 추가되었다. post로 했다면 그대로 list로 보냈을터, 하지만 그리 큰 문제는 아니다. 약간의 귀찮음?

 


추가사항

http cache, nginx caching에 대한 추가적인 공부가 필요하겠다. 대충, '데이터가 변경되었는가를 확인하는 로직이 있다' 정도만 이해하고 있으니;;