할 일 목록 관리 서비스 만들기
export default로 외부에 공개한 컴포넌트를 같은 폴더(또는 원하는 폴더 위치)의 index.ts에서 export { default as components } from './경로'로 정의해 주면, 외부에서 공개된 컴포넌트들을 받아와 사용할 때 경로를 간결하게 사용할 수 있다.
- 예를 들어,
components 밑에 있는 Button.tsx, Input.tsx, Menu.tsx, Toggle.tsx가 있을 때, 네 개 파일에서 각각 임포트해오려면 import 문만 네 줄이다. 그런데, components 폴더 하위에 있는 index.ts 파일에 외부 공개된 컴포넌트를 등록해 두면 4개의 컴포넌트들을 ./components라는 같은 경로에 가져올 수 있어서 편리하다.
- 이번 프로젝트에선 API 요청을
axios로 해보려고 한다. axios는 비동기 통신 라이브러리다. Javascript나 브라우저 API가 기본 제공해 주는 도구가 아닌, 별도 설치(npm i axios)와 불러오기(import axios from 'axios')가 필요하다.
axios는 fetch와 유사하게 정해진 인자를 전달 호출해 주면 Promise 객체가 값으로 반환된다.
fetch는 첫 번째 인자로 요청을 보낼 URL, 두 번째 인자로 method, header, body 등의 정보가 들어가는 옵션 객체가 전달된다.
axios는 axios.get 또는 axios.post 처럼 메서드 형태로 호출할 수 있다. HTTP method가 메서드 명에서 이미 특정되기 때문에 관련 정보는 다시 보내줄 필요가 없다.
axios는 첫 번째 인자로 URL 경로, 두 번째 인자로 fetch의 body에 담던 요청 데이터를 넘긴다. 이때, axios는 기본적으로 직렬화를 지원하기 때문에 JSON.strigify를 사용할 필요가 없다.
axios는 인스턴스를 만들어서 기본 config 설정을 추가해 둘 수 있다. axios 인스턴스는 아래와 같이 만든다.
// Axios 인스턴스 생성
const instance = axios.create({
baseURL: 'https://example.io/api/', // 기본 URL 미리 설정해두고, 이후에 실제 요청 보낼 땐 path 정보만 활용
timeout: 5000, // 5000ms 경과 시점까지 서버의 응답이 없으면 에러 반환
header: {
"Content-Type": "application/json",
}
});
- 만약에 인증/인가가 필요한 접근이고, 토큰 방식으로 인가가 이뤄지며, Access Token을 로컬에서 관리해야 한다고 했을 때, 토큰 정보를 API 요청이 이뤄지는 전역에서 접근 가능하면서, 동시에 어느 정도의 보안으로 감춰두는 노력이 필요할 수 있다. 이럴 때
instance의 header로 미리 토큰을 정의해 두고, 이후에 instance.get instance.post 처럼 요청을 사용하면 도움이 된다.
- 아니면
axios.defualt.headers.commont['Authorization'] =Bearer ${accessToken}` 과 같은 방식으로 axios 라이브러리를 통해 전역 설정으로 Access Token을 관리할 수도 있다.
- 하지만,
axios.default.headers에 전역으로 등록할 수 있는 토큰 숫자는 한계가 있으며, 또한 프로젝트의 모든 곳에서 사용하는 axios 호출에 설정이 적용되기 때문에 의도치 않은 문제가 발생할 수 있다. 때문에, API 인가 토큰 키를 가지고 있는 axios 인스턴스를 별도로 만들어서 정보를 관리하는 것이 조금 더 안전하다.