나의 개발 일지

URL 경로에 맞게 함수 실행시켜서 경로에 따라 페이지 변화시키기

designer DK 2024. 11. 4. 22:07
728x90

상품 상세나 카트가 추가되면서 경로가 꽤 많아졌다.

효과적인 js파일들 관리를 위해 index.html이라는 하나의 html파일의 콘텐츠 컨네이너 안에서 상품 콘텐츠나 카트 콘텐츠 같은 것들이 바뀌도록 구성을 했는데, 이렇게하다보니 문제가 해당 경로로 갔을 때 새로고침을 하면 에러가 발생했다. 경로를 다시 불러들이면서 발생한 에러인듯했다.

 

따라서 해당 경로를 다시 불러들일 때 거기에 맞는 해당 경로에 맞는 함수를 실행시켜서 문제가 안생기도록 세팅을 했다.

 

일단 public파일들의 라우팅 처리를 해주는 코드 경로 설정을 추가해주었다.

여기서 product/* 라고 설정되어있으면 product 다음에 어떤 경로가 더 있든 index.html로 보내준다는 뜻이다.

//상품 페이지
apiRouter.get('/product/*', (req, res) => {
res.sendFile(path.join(__dirname, '../public', 'index.html'));
});
//카트
apiRouter.get('/cart', (req, res) => {
res.sendFile(path.join(__dirname, '../public', 'index.html'));
});

 

다음은 index.html의 윈도우가 로드될 때의 함수.

window.onload = function () {
 
const path = window.location.pathname;
 
if (path === "/" || path === "/product") {
getProducts(page = 1); //상품 페이지
} else if (path.startsWith("/product/")) {
const productId = path.split("/")[2];
getProductDetail(productId); //상품 디테일 페이지
} else if (path === "/cart") {
getCartPage(); // 카트 페이지
}
}

 

이렇게 path 경로를 지정해주고 거기에 맞다면 함수를 실행시킨다.

상품 상세페이지의 경우는 주소가 /product/:id로 요청이 가기 때문에 product 뒤에 추가적인 경로가 붙는다. 이 부분을 인식해서 함수를 실행해야하기 때문에 startsWith("/product/")라는 조건을 넣어서 /product/ 로 시작하는 경로를 찾아낸 후 split이라는 기능을 이용해서 /로 나눠진 부분 중 [2], 즉 3번째 배열 값을 가져오는데 지금의 경우 /product/:id 이기 때문에 :id 값을 가져올 수 있다.

그 아이디 값을 이용해서 함수를 실행하면 됨.