Notice
Recent Posts
Recent Comments
Link
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- 2375
- Programming
- jenkins
- RESTful
- while
- 알고리즘
- MariaDB
- WebFlux
- 검색 API
- 컴퓨터공학기초
- search api
- bitbucket
- 백준
- 스프링 번역
- 자바
- 다이나믹프로그래밍
- DP
- 알고리즘다지기프로젝트
- Reactive stream
- 젠킨스
- 11053
- 도커
- event_scheduler
- 페이징
- 빗버킷
Archives
- Today
- Total
쑥로그
Restful 하게 검색 API 만들기 본문
사용스펙
Kotlin, MongoDB
왜 찾게 되었을까?
자원관리 모듈을 맡아 API를 만드는 중에 '자원은 검색이 용이해야하지 않을까?' 라는 생각을 했다. 방식을 찾을 때 염두한 것은 세 가지가 있다.
- 보수 비용이 적게 들 것
- 개발이 보다 쉬울 것
- 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해서 들어온 필드의 타입을 확인한 후 알맞게 검색 쿼리를 만들어 실행한다.