일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자바
- Exception
- Servlet
- AOP
- http
- 김영한
- 인프런
- 스프링 핵심 기능
- Greedy
- java
- kotlin
- jpa
- spring
- Android
- 알고리즘
- pointcut
- db
- Proxy
- springdatajpa
- QueryDSL
- 스프링 핵심 원리
- 백준
- JDBC
- Thymeleaf
- JPQL
- 그리디
- SpringBoot
- 스프링
- transaction
- Spring Boot
- Today
- Total
개발자되기 프로젝트
['21.07.15] Naver 영화검색 API 본문
앞선 글에서 Naver API사용 시 에러코드 SE99(HTTP상태코드 500)가 뜨면서, 내부 서버 에러가 발생했다.
진짜로 서버 에러인줄 알고 있었는데, 네이버에서 제공하는 오류 코드를 보고 내가 잘못했구나.. 라는 의심이 생김.
HTTP 상태 코드(오류 유형) | 오류 발생 원인 | 해결 방법 |
500(서버 오류) | 필수 요청 변수가 없거나 요청 변수 이름이 잘못된 경우 | API 레퍼런스에서 필수 요청 변수를 확인합니다. |
500(서버 오류) | 요청 변수의 값을 URL 인코딩으로 변환하지 않고 전송한 경우 | API 레퍼런스에서 해당 요청 변수를 URL 인코딩으로 변환해야 하는지 확인합니다. |
500(서버 오류) | API 호출은 정상적으로 했지만, API 서버 유지 보수나 시스템 오류로 인한 오류가 발생한 경우 | 개발자 포럼에 오류를 신고합니다. |
단순히 서버 오류만 500으로 처리하는 것이 아니라, 변수 이름이 잘못되었거나, url인코딩, 진짜 서버 오류 세 가지 경우 모두 500으로 처리한다.
그리고 추가적으로 application의 play ground에 들어가면 실시간으로 api를 테스트 해볼 수 있다.
나는 안되는데, 얘는 되니까 내가 잘못했다는 걸 깨닳았다 ㅋㅋㅋㅋ
그리고 요기서 개발가이드에서 알 수 없었던, 몇 가지 정보가 있다.
1. 개발가이드에서 몰랐던 정보
1)개발가이드에서 알려주는 출력 결과와 실제 reponse가 다르다.
query만 입력을 했을 때 어떤 결과가 나오는지 확인해봤다.
그랬더니, 개발가이드에는 없던, total과 start 그리고 display가 존재한다.
"lastBuildDate": "Thu, 15 Jul 2021 21:57:57 +0900",
"total": 25,
"start": 1,
"display": 10,
"items": [
따라서 reponse객체에 세 변수를 추가해줬다.
private int display;
private int start;
private int total;
2) yearfrom은 1000이상부터 입력이 가능하다.(500, SE99)
3) 당연하지만 yearto가 yearfrom보다 작으면 에러(500, SE99)
2. 수정한 부분
1) 변수명 오타
yearfrom을 yearform으로 썼다.......
2) response객체에 display, start, total을 추가해줬다.
private int display;
private int start;
private int total;
3) uri에 queryparam을 추가하는 방식을 변경했다.
처음에는 그냥 배운대로 MultiValueMap<String,String>을 통해서 key, value 형태로 만들어
uricomponentbuilder의 queryparam에 집어넣었다.
public MultiValueMap<String, String> makeQuery(){
var multiValueMap = new LinkedMultiValueMap<String, String>();
multiValueMap.add("query", query);
multiValueMap.add("display", String.valueOf(display));
multiValueMap.add("start", String.valueOf(start));
return multiValueMap;
}
URI uri = UriComponentsBuilder.fromUriString(naverMovieSearchUrl)
.queryParams(searchMovieReq.makeQuery())
.build()
.encode()
.toUri();
근데 생각해보니 display, start를 query에 집어넣으려면 String이 아닌 int로 들어가야 한다.
그래서 queryParam에 직접 name, value를 넣어주거나 필수인 "query"를 제외하고는 빼주면 된다.
URI uri = UriComponentsBuilder
.fromUriString(naverMovieSearchUrl)
.queryParam("query", "starwars")
.queryParam("display", 10)
.queryParam("start", 1)
.queryParam("yearfrom", 1700)
.queryParam("yearto", 2021)
.build().encode().toUri();
3. 결과
짠 정상적으로 불러왔다! 네이버 서버가 잘못된 것은 아니었다..ㅎ
그리고 검색 결과가 없으면 message에 "검색 결과가 없습니다"를 보낼 수 있도록 했다.
4. GitHub : 210715, Naver API
'Project > 영화리뷰 관리' 카테고리의 다른 글
['21.07.18] 검색 결과에서 HTML Tag 제거하기 (0) | 2021.07.18 |
---|---|
['21.07.17] Null check, ENum (0) | 2021.07.17 |
['21.07.14] Entity, DTO 분리 (0) | 2021.07.15 |
['21.07.14] Service class생성, api test (0) | 2021.07.14 |
['21.07.13] Naver API 연동 (0) | 2021.07.13 |