개발자
cors 환경에서 api를 axios로 호출하고 있는데요. 같은 api의 클라이언트 사이드, 서버 사이드 url이 서로 상이합니다. axios 또는 fetch에서 호출한 곳이 클라이언트 사이드 인지, 서버 사이드 인지 알 수 있을까요? 알수있는 방법이 있다면 알려주세요. 감사합니다.
답변 1
인기 답변
안녕하세요 답변드립니다. 😏 먼저 말씀드리기에 앞서 작성자분이 적어주신 CSR, SSR에 대한 정의부터 다시 살펴봐야 할 것 같습니다. Client-Side Rendering 클라이언트 사이드 렌더링에서 서버는 뼈대가 되는 최소한의 HTML만 렌더링한다. 로직, 데이터, 템플릿, 라우팅을 통한 페이지 전환은 모두 브라우저에서 실행되는 JavaScript에 의해 처리된다. CSR은 SPA개발에 거의 필수적으로 쓰이며 설치해 사용하는 앱과 웹 사이트의 경계를 흐릿하게 해 주었다. Server-side Rendering 서버사이드 렌더링에서는 사용자의 페이지 요청에 대해 전체 HTML을 만들어서 응답한다. 렌더링 된 컨텐츠에는 데이터 저장소나 외부 API로부터 받은 데이터가 포함되어 있다. 데이터를 조회하고 받아오는 것, 컨텐츠를 표현하기 위한 HTML을 만들어내는 것 모두 서버에서 처리한다. 따라서 서버 사이드 렌더링을 사용하면 데이터를 조회하고 템플릿 렌더링하기 위하여 서버와 별도로 통신하지 않아도 된다. 일단 말씀주신 "같은 api의 클라이언트 사이드, 서버 사이드 url이 서로 상이" 라는 경우는 있을 수가 없습니다. 😥 클라이언트 사이드 랜더링의 경우 필요한 데이터를 "클라이언트" 환경 (크롬과 같은)에서 받아와 처리합니다. 이 때 데이터의 가공, 표시방식, 동작 등은 기본적으로 클라이언트에서 관리합니다. 서버 사이드 랜더링의 경우 이미 해당 작업이 완성되고 난 후의 페이지 (단적으로 html, css)를 가져와서 표현합니다. 클라이언트에서는 극단적으로 말하면 js코드가 없더라도 그릴 수 있습니다. Next로 각각 구성은 가능하나 url을 통해 axios로 fetch를 한다는 시점부터 이미 클라이언트 사이드 랜더링입니다. 만약 fetch를 사용해서 데이터를 가져왔다면 해당 방식은 가져온 데이터를 "클라이언트"에서 처리할 목적으로 불러온 것으로 보이며 해당 방식의 구성에서 "서버 사이드 랜더링"은 불가능합니다. 이미 fetch로 데이터를 통신하는 시점은 클라이언트가 Javascript코드를 읽고 필요한 시점에 데이터를 호출하며 받아온 데이터를 리액트가 그려주는 과정이 포함되어 있습니다. 이 과정이 리액트의 SPA , CSR을 통해 구성됩니다. 만약 작성자님이 작성하신 주소가 다르다는 것이 "Rest API를 제공하는 백엔드 서버" 와 "서버에서 사용하는 DB"라는 개념이라면 두 주소가 다른것은 당연합니다. 😁 Next.js의 경우 클라이언트 단에서 백엔드 서버를 걸치지 않고 바로 DB와 연결하여 특정 데이터를 Next의 서버리스에서 작업 및 가공하고 html을 그려 표시할 수 있습니다 (서버 사이드 랜더링) 이 경우 일반적인 fetch나 axios가 아닌 sql문법 혹은 prisma와 같은 typeORM 번역기를 사용하여 통신하게 되며 DB의 데이터를 어떻게 밀어넣을지, 가져와서 전환할지 의 코드를 작성하게 됩니다. 이 경우 백엔드의 서버를 걸치지 않은 상태가 되며 Next의 서버 사이드 렌더링 기능을 통해 해당 작업을 수행할 수 있게 됩니다.
최성수
작성자
배다른남매 프론트엔드 개발자 • 2024년 04월 27일
답변 확인이 늦었습니다 . 답변은 감사합니다만, 저는 렌더링에 대한 질문이 아니었는데 오해가 있으신 듯 하네요. 제 질문의 핵심은 getServersideProps와 클라이언트 사이드의 api 호출를 구분할 수 있는지 였습니다. 그리고 답변 주신 "같은 api의 클라이언트 사이드, 서버 사이드 url이 서로 상이" 라는 경우는 있을 수가 없습니다. 를 다시 말씀드리자면 당연히 백엔드 api의 엔드포인트는 동일하지만 cors 에러 해결을 위해 config.js에서 rewrite로 proxy를 태워서 보내야 했고, proxy를 태우고 안태우고의 분기 처리를 위해 약속된 uri 를 삽입이 필요했기 때문입니다.
지금 가입하면 모든 질문의 답변을 볼 수 있어요!
현직자들의 명쾌한 답변을 얻을 수 있어요.
이미 회원이신가요?
커리어리 AI 봇
GPT가 달아주는 답변입니다.
2024년 02월 28일
Fetch 또는 Axios에서 호출한 곳이 클라이언트 사이드인지 서버 사이드인지를 판별하는 간단한 방법은 `typeof window`를 사용하는 것입니다. Next.js에서 코드가 서버에서 실행되거나 클라이언트에서 실행될 수 있으므로, `window` 객체의 유무를 통해 코드가 어디서 실행되고 있는지 확인할 수 있습니다. 코드 하나로 예시를 들어보자면, 다음과 같습니다: ```javascript import axios from 'axios'; let apiBaseUrl; if (typeof window === 'undefined') { // 서버사이드일 때 apiBaseUrl = '[SERVER_SIDE_API_BASE_URL]'; } else { // 클라이언트사이드일 때 apiBaseUrl = '[CLIENT_SIDE_API_BASE_URL]'; } axios.get(apiBaseUrl + '/some-endpoint').then(response => { console.log(response); }).catch(error => { console.error(error); }); ``` 위 코드는 `typeof window`가 `undefined`일 경우, 즉 서버사이드에서 실행될 경우와 아닌 경우(클라이언트 사이드)에 따라 다른 API base URL을 사용하여 요청을 보낼 것입니다. 아직도 궁금한 점 있으시면 알려주세요!
지금 가입하면 모든 질문의 답변을 볼 수 있어요!