인프런 커뮤니티 질문&답변

최상현님의 프로필 이미지
최상현

작성한 질문수

배달앱 클론코딩 [with React Native]

react-native-config 문제 해결하기

wifi 환경에서 axios 통신이 로컬서버에서 안됩니다.

작성

·

91

·

수정됨

0



안녕하세요 강사님 강사님의 리액트 네이티브 강의를 보면서

직접 자신만의 리액트 네이티브 프로젝트도 직접 다뤄보면서 하고 있는 학생입니다.

https://github.com/Dongrang072/carPoolTeamProject-server

이게 로컬 서버의 코드이고

 

https://github.com/Dongrang072/carpoolTeamProject

이게 프론트의 코드입니다

 

axios 통신에 현재 문제가 있습니다.

동일한 코드인데도 wi-fi로 인터넷이 연결되는 노트북의 환경에서는 http:10.0.0.2로 접속이 안되고,

로그캣을 보니 두 요청이 확연하게 달랐는데

모든 api를 axios로 요청 시에 와이파이 환경에서만 되질 않았습니다

 

로그캣.png.webp

이건 랜선에서 연결된 pc에서 로컬 서버와 통신 시 요청에서 성공했을 때의 로그캣 로그이고

로그캣-노트북에서.png.webp

이건 와이파이 환경의 노트북에서 로컬 서버와 통신했을 시에 생기는 로그캣 로그입니다

 

혹시나 해서 프로젝트 루트 폴더의 androidManifestxml의 파일에 누락된게 있나 봤는데

 

<manifest xmlns:android="http://schemas.android.com/apk/res/android">     <uses-permission android:name="android.permission.INTERNET"/>     <uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>     <uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>     <uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>     <uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION"/>     <application             android:usesCleartextTraffic="true"             android:name=".MainApplication"             android:label="@string/app_name"             android:icon="@mipmap/ic_launcher"             android:roundIcon="@mipmap/ic_launcher_round"             android:allowBackup="false"             android:theme="@style/AppTheme"             >         <!-- Google Maps API Key -->         <meta-data                 android:name="com.google.android.geo.API_KEY"                 android:value="@string/GOOGLE_MAPS_API_KEY"/>         <activity                 android:name=".MainActivity"                 android:label="@string/app_name"                 android:configChanges="keyboard|keyboardHidden|orientation|screenLayout|screenSize|smallestScreenSize|uiMode"                 android:launchMode="singleTask"                 android:windowSoftInputMode="adjustResize"                 android:exported="true">             <intent-filter>                 <action android:name="android.intent.action.MAIN"/>                 <category android:name="android.intent.category.LAUNCHER"/>             </intent-filter>         </activity>      </application> </manifest> 

이상은 없는 것 같습니다....

혹시 방화벽의 문제인가요?

 

노트북으로 실행시에 직접 ipConfig로 내부 ip(ip4)를 이용해서 api를 호출해봤는데도 여전히 network 오류가 뜹니다

 

 

 LOG  Verification code response: <HTML> <HEAD> <TITLE>GiGA WiFi home</TITLE> <LINK REL="shortcut icon" HREF="icon.ico" TYPE="image/x-icon"> <LINK REL="icon" HREF="icon.ico" TYPE="image/x-icon"> <meta http-equiv="content-type" content="text/html; charset=UTF-8"> <script language='JavaScript' type='text/javascript' src='/script/jquery.js?version=Aug252023180743'></script> <script language='JavaScript' type='text/javascript' src='/script/jquery-migrate-1.2.1.min.js?version=Aug252023180743'></script> <script language='JavaScript' type='text/javascript' src='/script/mcr_common_new.js?version=Aug252023180743'></script> <script language='JavaScript' type='text/javascript' src='/script/mcr_common.js?version=Aug252023180743'></script> <script language='JavaScript' type='text/javascript' src='/script/mcr_common_kt.js?version=Aug252023180743'></script> <script language='JavaScript' type='text/javascript' src='/script/mcr_jq_util.js?version=Aug252023180743'></script>  <style type="text/css"> <!-- a { font-style:normal; font-weight:normal; text-decoration:none; } body {         margin-left: 10px;         margin-top: 10px;         margin-right: 10px;         margin-bottom: 10px;         background-color: #ffffff; }  .table {         border-top-width: 2px;         border-top-style: solid;         border-top-color: #333333; } .font100 {         FONT-FAMILY: "돋움",  "arial";         FONT-SIZE: 14px;         LINE-HEIGHT: 14pt;         COLOR: #000000 } .font101 {         FONT-FAMILY: "돋움",  "arial";         FONT-SIZE: 12px;         LINE-HEIGHT: 12pt;         COLOR: #666666 } -->   </style> <script language="JavaScript" type="text/javascript" src="/script/jquery.js"></script> <script language="JavaScript" type="text/javascript" src="/script/captcha.js?version=Aug252023180743"></script> <script type="text/javascript" src="/lang/b28n.js"></script> <script type="text/javascript">  Butterlate.setTextDomain("main");  redirectTopWindow(); var UserPrivilege = getUserPrivilege(); var Privilege = parseInt(UserPrivilege, 10);  function redirectTopWindow(){         if( top != self ){                 var URL = "http://" + window.location.host;                 top.location.replace(URL);         } } var captcha;  function CheckAll() {         if("8899" == window.location.port){                 if( captcha.validate( $("input[name='captchatext']").val() ) == true ){                         if(document.Login.UserID.value == "")                         {                                 alert("사용자ID를 확인해 주세요.");                                 document.Login.UserID.focus();                                 return false;                         }                         if(document.Login.Password.value == "")                         {                                 alert("비밀번호를 확인해 주세요.");                                 document.Login.Passw

직접적으로 front내의 src 파일의 api/auth.ts 내의 이메일 post 관련 함수를

 

const sendVerificationCode = async (email: string): Promise<string> => {
    try {
        console.log('Sending verification code request:', email);

        const response = await axiosInstance.post("http://10.0.0.2/mail/send-code", {
            email: email.trim()  // 이메일을 서버에 전달
        });

        console.log('Verification code response:', response.data);
        return response.data;  // 반환된 인증 코드 반환
    } catch (error: any) {
        console.error('Verification code error:', {
            email,
            error: error.message,
            response: error.response?.data
        });
        throw new Error(
            error.response?.data?.message ||
            '인증 코드 전송에 실패했습니다.'
        );
    }
};

http://10.0.0.2를 명시했더니 res data를 console.log로 찍으니 이렇게 나왔습니다

json으로 받아야 하는데 왜 res가 html 형식으로 받아진건지 모르겠습니다 덤으로 smtp로 설정했던

이메일 인증 코드는 실제 이메일에 오지 않은 상태입니다. html 로그 관련은 인프런에서 질문 글에 1만자 이하로 제한되어있어서 어느정도 삭제했습니다

답변 2

0

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

지금 환경이 에뮬레이터인가요? 실기기인가요?

https://github.com/facebook/react-native/issues/36094

비슷한 이슈는 이거 하나만 있는데 해결책은 없네요.

일단 10.0.0.2 대신에 127.0.0.1이나 localhost로도 시도해보세요. 노트북에 랜선을 꼽는 경우도 테스트해봐야할 것 같습니다.

최상현님의 프로필 이미지
최상현
질문자

현재 에뮬레이터에서 실행중이고
에뮬레이터-로컬서버-로컬db 간에 통신이 안되는 중입니다.
127.0.0.1이나 localhost로도 시도해보해봤는데 안됩니다.
현재 랜선을 직접 꽂아서 노트북에서 캐시를 다시 지우고, 안드로이드 스튜디오에서 캐시도 지우고 새 에뮬레이터 기기로 연결을 하고 통신을 시도했는데 여전히
pipe는 그대로인 상태이고 wifi_bound에서 여전히 오류 로그가 납니다.
랜선으로 연결된 데스크탑과 와이파이 노트북의 네트워크 환경 차이에 의해서 이런것일까요?
adb reverse tcp:3000 tcp:3000 로 3000포트에(로컬 서버 포트)에 에뮬레이터를 포트포워딩 했는데도 여전히 오류가 납니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

네트워크 관련 이슈로 보이는데 검색해봐도 정보가 너무 부족하네요

최상현님의 프로필 이미지
최상현
질문자

결국 어쩔 수 없이 데스크탑의 환경으로 개발해야겠네요... 혹시 앱을 배포하지 않고 릴리즈 모드로 와이파이 환경의 네트워크에서 테스트 할 시에 이런 문제가 또 생기진 않을까 걱정입니다.

최상현님의 프로필 이미지
최상현
질문자

현재 질문글 수정한거와 같이 직접 10.0.0.2로 설정했을 시에 json이 아니라 html 형식으로 받아지는거 같습니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

지금 보시면 html이 Giga WIFI Home이라는 사이트입니다. 10.0.2.2가 해당 주소를 가리키는 것 같습니다.

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

아, 지금보니까 10.0.0.2로 하고계신데 10.0.2.2입니다. 질문 내용의 단순 오타인가요? 아니면 진짜로 10.0.0.2로 하고계셨던 건가요?

최상현님의 프로필 이미지
최상현
질문자

아 오타입니다 10.0.2.2입니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

하나 더 찾아낸 것이 있는데 10.0.2.2:3105 입니다. 포트를 안 쓰셨네요

최상현님의 프로필 이미지
최상현
질문자

.env에

포트.png.webp
import axios from 'axios';
import Config from "react-native-config";

const axiosInstance = axios.create({
    baseURL: Config.API_URL,
    withCredentials: true,
})

export default axiosInstance;



이런식으로 적용했는데 포트번호가 제대로 적용이 안되었던 것인가요?

 

혹시 몰라서 Config를 콘솔로그로 찍어봤는데

Config로그.png.webp


10.0.2.2:3000으로 잘 나오는거 같습니다. 서버 포트도 3000으로 맞췄습니다

제로초(조현영)님의 프로필 이미지
제로초(조현영)
지식공유자

const response = await axiosInstance.post("http://10.0.0.2/mail/send-code", { email: email.trim() // 이메일을 서버에 전달 });

여기에 env 값을 안 쓰셨습니다.

최상현님의 프로필 이미지
최상현
질문자

아 그땐 오타냈었었고 실제로는

http://10.0.2.2:3000/mail/send-code 이렇게 했었는데도

Wifi_forwarder 에러 로그가 로그캣에 출력되었습니다

최상현님의 프로필 이미지
최상현
질문자

해결되었습니다 왜인지는 모르겠지만 재부팅 몇번 하니깐 환경변수가 제대로 불러와져서 되었네요. 바로 반영이 안되었던것 같습니다. 도와주셔서 감사합니더

0

안녕하세요, 인프런 AI 인턴입니다. 최상현님.

Wi-Fi 환경에서의 axios 통신 문제는 다양한 원인으로 발생할 수 있습니다. 주로 고려해야 할 요소들은 다음과 같습니다:

  1. 내부 IP 주소 확인: Wi-Fi 환경에서는 PC나 노트북의 내부 IP가 변경되는 경우가 있습니다. 반드시 현재 연결된 네트워크의 내부 IP 주소를 확인하시고, axios 요청 URL에 올바르게 설정되어 있는지 확인해 주세요.

  2. 방화벽 설정: Wi-Fi 네트워크의 방화벽이 로컬 서버와의 통신을 차단할 수 있습니다. 방화벽 설정에서 로컬 서버 포트가 외부에서 접근 가능하도록 허용되어 있는지 확인하세요.

  3. 명확한 네트워크 설정 확인: 특히 서버가 실행 중인 PC와 클라이언트를 실행하는 노트북이 동일한 네트워크에 있는지, 동일한 서브넷에 있는지 확인해야 합니다. 만약 네트워크가 분리되어 있다면 통신이 안 될 수 있습니다.

  4. IP 주소 및 포트의 명시적 설정: AndroidManifest.xml에서 usesCleartextTraffic이 true로 설정되어 있다는 것은 HTTP로 통신하도록 허용한 상태입니다. 하지만, IP 주소나 포트가 정확하지 않다면 요청이 성공하지 않을 수 있습니다. PC에서는 제대로 작동하는 것처럼 로그에 보인다고 하셨으니, 노트북의 IP 주소가 제대로 설정된 것인지 다시 한 번 확인해보세요.

다행히 이러한 문제는 개발 커뮤니티에서 흔히 겪는 이슈 중 하나이므로, 추가로 다음의 링크들을 통해 도움을 받을 수도 있습니다:

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

최상현님의 프로필 이미지
최상현

작성한 질문수

질문하기