API는 몇번 다뤄봐서 간단히 정리하고 넘어가려했는데,
토요일에 본 주차 테스트에서 말도 안되는 점수를 받아서 혼자서 복습을 했다.
react-create-app
을 이용해서 프로젝트를 만들어주자npm install axios
을 해준다.import { BiListCheck, BiSearchAlt2 } from "react-icons/bi";
function SerarchBar({ onClick, onChange }) {
return (
<>
<div className="input-group">
<input
type="search"
className="form-control rounded"
placeholder="영화 이름 입력"
onChange={onChange}
/>
<button type="button" id="search_btn" onClick={onClick}>
<BiSearchAlt2 className="search_icon"></BiSearchAlt2>
</button>
</div>
</>
);
}
.input-group {
text-align: center;
width: 100px;
margin: 0 auto;
display: flex;
}
.input-group #search_btn {
background-color: transparent;
}
url 작성
const key = "발급받은 키";
const url = `http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=${key}`;
console.log(url)
; 을 통해 url을 출력해서 들어가보면 영화 목록 데이터가 쭉 뜬다.?
로 하고, 파라미터간 구분은 &
으로 한다.const url = http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=${key}&movieNm=${query};
1. 검색어 저장하기
- 뒤에 movieNm으로 한국어를 넣어주려면 UTF-8 변환을 해줘야한다.
- 리액트에서는 encoding을 encodeURIComponent(item)
을 이용해서 해준다고한다.
- 예시
const query = encodeURIComponent("안녕");
const url = http://www.kobis.or.kr/kobisopenapi/webservice/rest/movie/searchMovieList.json?key=${key}&movieNm=${query};
2. 영화 목록을 가져올 fetchMovie 함수 만들기
1. App컴포넌트 안, 최상단에 변수들을 선언해준다.
```
const [movie, setMovie] = useState([]);
const [item, setItem] = useState("");
```
import axios from 'axios';
를 해준다. ```jsx
const fetchMovie = async () => {
console.log("클릭");
try {
//1
const response = await axios.get(url);
console.log(response);
console.log(response.data.movieListResult.movieList);
//2
const newMovieList = response.data.movieListResult.movieList;
console.log(newMovieList);
//3
setMovie(newMovieList);
console.log(movie);
} catch (e) {
console.log(e);
}
};
1. response 변수에 `awiat axios.get(url)`을 통해 받아온 데이터를 넣어준다.
콘솔로그로 response의 값을 확인한뒤, 우리가 필요한 값인 movieList에 접근해서 값이 잘 나오는지 확인한다.
2. newMovieList에 영화 목록만 할당해준다.
콘솔로그로 값이 잘 찍히는지 확인한다.
3. 위에서 선언한 movie 배열에 값을 넣어준다.
→ 검색 결과마다 movie 배열의 값이 바뀌어야하기때문에 복사를 해서 넣어주지않았다.
3. 받아온 데이터를 출력하기 result 함수를 선언해서 movie의 값을 <ol>
태그로 바꿔줬다.
map 을 사용할 수도 있을 것 같은데 하다가 안돼서,,, for문으로 선언했다. ㅠ
function Result({ movie }) {
//1
var lis = [];
for (var i = 0; i < movie.length; i++) {
var item = movie[i];
lis.push(
<ol key={item.movieCd}>
영화 제목 :{item.movieNm}
<br />
//2
개봉일 : {item.openDt == "" ? "미정" : item.openDt}
</ol>
);
}
//3
return (
<>
<div className="result">
<div id="result_text">{lis}</div>
<br />
</div>
</>
);
}
/////
<Result movie={movie}></Result>
```
const searchItem = event => {
setItem(event.target.value);
console.log(item);
};
///
<SerarchBar onClick={fetchMovie} onChange={searchItem}></SerarchBar>
사진
코드
TIL/practice/react_practice2/movie_search at master · wooneeS2/TIL
아쉬운점
만약... 보고 따라하실 분이 있다면 깃허브에 올리기 전에 발급 받은 api key는
https://velog.io/@jason_sj/create-react-app-에서-API-key-숨기기
요 포스팅을 보고 따라하시길..!