쑥로그

Restful 하게 검색 API 만들기 본문

프로그래밍/Restful

Restful 하게 검색 API 만들기

SOOOOOK 2020. 5. 9. 16:47

사용스펙

Kotlin, MongoDB

 

왜 찾게 되었을까?

자원관리 모듈을 맡아 API를 만드는 중에 '자원은 검색이 용이해야하지 않을까?' 라는 생각을 했다. 방식을 찾을 때 염두한 것은 세 가지가 있다.

  1.  보수 비용이 적게 들 것
  2. 개발이 보다 쉬울 것
  3. Restful할 것

 

그러면 어떻게 검색하면 좋을까? 

첫 번째, 모든 필드들을 query parameter로 받는다.

예) GET ?a=b&c=d&e=f&page=0&size=10

  • 장점
    • 타입을 별도로 체크할 필요 없다. 예를 들어서 a는 int이고 c는 string이 명확하기 때문에 확인할 필요 없이 타입변환하면 된다. 
    • 필드 수가 적으면 개발이 빠르다. 체크하는 로직이 추가될 필요 없이 query parameter로 받겠다고 선언만 해놓으면 바로 쓸 수 있다.
  • 단점
    • 필드에 변경사항이 생기면 query parameter추가를 그때마다 해주어야한다.(클래스의 필드 스캔 로직이 없을 경우)
    • 검색 parameter와 다른 parameter와의 구분이 어렵다.

 

두 번째, 하나의 Parameter에 검색할 필드와 값을 배열로 받아 검색한다.

예) GET  ?query=a=b,c=d,e=f&page=0&size=10

  • 장점 
    • 필드를 스캔하는 로직을 추가하면 필드에 변경이 일어나도 확인하는 로직을 변경하지 않아도 된다. -> 이 부분은 위의 첫 번째 방식에서도 스캔하는 로직을 추가하면 장점이 될 수 있는 부분이다. 하지만 어차피 들어올 필드가 고정되어 있으니 확인할 필요 없이 즉시 형변환할 수 있다는 점에서 필요없지 않을까? 해서 첫 번째 방식은 스캔하지 않는다는 것을 전제로 작성하였다.
    • 첫 번째 방식에서 나왔던 단점 중 하나인 다른 parameter와의 구분이 어렵다는 점을 보완할 수 있다.
  • 단점 
    • 필드의 타입을 확인하는 로직이 필요하다. 왜냐하면 int형 타입에 string을 equals하여 검색할 수 없기 때문이다.

 

나는 이 중에서 2번이 가장 나에게 맞는다고 생각했다. 일단 필드 수가 많았고 변경 사항도 매일 일어나는 상황이었기 때문이다. 

 

 

시나리오

클래스 필드 스캔 -> 타입 추출 -> 쿼리를 ,와=로 split해서 들어온 필드의 타입을 확인한 후 알맞게 검색 쿼리를 만들어 실행한다.