카카오 개발자 API → 애플리케이션 추가하기 → App키 생성
https://apis.map.kakao.com/
사이트에 들어가서 지도를 띄우는 코드 작성
Nest.js에서는 HTML에 접근하는 방법이 한정적이기 때문에, Head 태그를 사용해 카카오 맵 스크립트를 호출할 수 있는 코드를 추가해 줄 수 있다
return(
<>
<Head>
<script type="text/javascript" src="//dapi.kakao.com/v2/maps/sdk.js?appkey='JavaScript 앱 키 입력'"></script>
</Head>
</>
)
declare const window: typeof globalThis & {
kakao: any;
}; // window 안에 kakao도 있다고 말해주는 타입
카카오 Docs 에 지도가져온 코드를 작성 후, useRouter를 이용해 버튼을 누를 때
지도를 가져오게 했더니 오류가 일어나게 된다.
하지만<a>
태그를 이용하면 이런 에러가 발생하지 않고 넘어가게 된다.
이유가 무엇인지 알아보자.
<a>
태그가 있음에도 useRouter를 사용하는 이유<a>
useRouter를 사용하면 너무 빨라서 데이터가 안받아와져 오류가 발생하고, a태그는 너무 느린데, 어떤 방식을 사용해야 하나?
1. 모든 페이지에 kakao library를 미리 다운받게 _app.tsx에 코드 작성
- 지도 api를 안쓰는 곳에서도 다운 받기 때문에, 좋지 않은 방법
2. 스크립트가 로드될 때까지 기다린 후 처리하기
https://apis.map.kakao.com/web/documentation/#load_load
- 스크립트가 로드될 때 까지 기다렸다가 뿌려주려면 useEffect를 사용해 직접 다운로드 받아 다 받을 때까지 기다렸다가 그려주기
query string
script.src =
"//dapi.kakao.com/v2/maps/sdk.js?appkey=cc653075a49daa7a2446f11dbeae75f7&autoload=false";
// app키와 autoload를 같이쓰고싶을 때 &사용 (query string)
<Link>
<Link href="/29-03-kakao-map-routed">
<a>맵으로 이동하기 !!</a>
</Link>
router.push : 게시판 등록할 때 사용
Link : 단순 페이지 로드 시 사용
예) 특정 API 요청이 끝난 뒤, 그 결과값을 가지고 다른 요청을 실행시켜야 할 때 사용 가능
function aaa(qqq){
// 함수 로직
}
aaa(function(){})
aaa(() => {}) // 화살표 함수일 때
콜백 함수 사용 시 코드
3회의 요청만 들어갔을 뿐인데 코드의 가독성이 떨어지게 된다.
이것을 콜백지옥 이라고 부른다.
콜백 지옥을 막고자 나온 것
const onClickPromise = () => {
axios
.get("http://numbersapi.com/random?min=1&max=200")
.then((res) => {
const num = res.data.split(" ")[0];
return axios.get(`https://koreanjson.com/posts/${num}`);
})
.then((res) => {
const userId = res.data.UserId;
// prettier-ignore
return axios.get(`https://koreanjson.com/posts?userId=${userId}`)
})
.then((res) => {
console.log(res.data);
});
};
콜백에 비해 코드가 간결해졌으나, Promise 사용 시 각 요청들이 체인처럼 연결된다.
이를 프로미스 체인(Promise Chain)이라 부른다.
Promise 사용 시 실행순서가 뒤로 밀리는 문제가 발생한다.
export default function EventLoopPage() {
const onClickTimer = () => {
console.log("============ 시작합니다 ============");
// 비동기 작업 (매크로큐에 들어감) //
setTimeout(() => {
console.log(
"⭐️ 저는 setTimeout | 매크로 큐 | 0초 뒤에 실행될 거에요 ⭐️ "
);
}, 0); // 1sec
// 비동기 작업 (마이크로큐에 들어감) //
new Promise((resolve, reject) => {
resolve("철수");
}).then((res) => {
console.log("저는 Promise | 마이크로큐 | 0초 뒤에 실행될거에요🎉");
});
// 비동기 작업 (매크로큐에 들어감) //
setInterval(() => {
console.log("저는 Promise | 매크로큐 | 0초 마다 실행될거에요👀");
});
let sum = 0;
for (let i = 0; i <= 9000000000; i++) sum = sum + 1;
// 비동기 작업 (마이크로큐에 들어감) //
new Promise((resolve, reject) => {
resolve("철수");
}).then((res) => {
console.log("저는 Promise | 마이크로큐 | 0초 뒤에 실행될거에요🎉 - 2");
});
console.log("============ 종료합니다 ============");
};
return <button onClick={onClickTimer}>setTimeout 실행시키기</button>;
}
위의 문제들을 해결하기 위해 나온 것