Hello-LSY / Baenang

여행과 관련된 전자문서를 관리하는 여행 어플리케이션, Beanang
0 stars 3 forks source link

순환참조 문제 #65

Closed MyYeonbi closed 2 weeks ago

MyYeonbi commented 4 weeks ago

KakaoTalk_Photo_2024-10-10-09-32-08 002 KakaoTalk_Photo_2024-10-10-09-32-08 001

문제 : 안드로이드 스튜디오에 코드 변경이 적용이 되지 않는다.

이 오류는 “Require cycle” 경고로, 이는 파일 간의 상호 참조(순환 참조)가 발생할 때 나타나는 경고이다 즉, AppInfo.js 파일이 자기 자신을 임포트하고 있어서 순환 참조가 발생하고 있는 것이다.

해결 방법:

1. 순환 참조 문제 확인 및 수정:

•   AppInfo.js 파일에서 다른 파일을 임포트하는데, 그 파일들이 다시 AppInfo.js를 임포트하는 구조일 가능성이 크다. 
            코드를 재구성하여 이러한 순환 참조를 피해야 한다.
•   예를 들어 CustomerService.js에서 AppInfo.js를 임포트하고, AppInfo.js가 다시 CustomerService.js를 임포트하면 이 문제를 해결해야 한다.

2. 파일 분리:

•   순환 참조를 피하기 위해, 의존성 관계를 줄이기 위해 로직을 분리하거나 중복된 코드를 별도의 파일로 빼서 관리하는 것도 좋은 방법이다.
3.  순환 참조 제거 후 반영:
•   순환 참조를 제거한 후 앱을 다시 빌드하여 변경사항이 제대로 반영되는지 확인한다.
MyYeonbi commented 4 weeks ago

해당 경고문은 “Require Cycle” 경고로, 이것은 두 파일이 서로를 동시에 참조하면서 순환 참조가 발생하는 경우에 나타낸다. 이 문제는 코드의 구조에서 순환 참조가 일어나지 않도록 리팩토링해야 한다. 아래 단계로 해결할 수 있다.

1. 순환 참조의 원인 파악

경고 메시지에 따르면 AppInfo.js와 CustomerService.js 파일이 서로를 참조하고 있다. 이 상황에서 두 파일이 서로를 의존하는 상태가 되어, 이는 초기화되지 않은 값들을 사용할 가능성이 있다.

import AppInfo from './AppInfo';

이 줄에서 AppInfo를 불러오고 있는데, 동시에 CustomerService.js가 AppInfo.js를 참조할 가능성이 있다.

2. 해결 방안

이 문제를 해결하려면 순환 참조를 없애기 위해 의존성 구조를 변경해야 한다.

1) CustomerService.js에서 직접 AppInfo를 불러오는 대신, 상위 컴포넌트로 AppInfo를 전달받도록 바꾸기

이렇게 하면 두 파일이 서로를 직접 참조하지 않게 된다.

// AppInfo.js는 CustomerService.js에서 직접 import하지 않는다. // 대신, AppInfo 컴포넌트를 부모 컴포넌트에서 CustomerService에 전달한다.

const serviceItems = [ { id: '1', title: '자주 묻는 질문', component: FAQ }, { id: '2', title: '1:1 문의', component: Inquiry }, { id: '3', title: '공지사항', component: Notice }, { id: '4', title: '이용약관', component: Terms }, { id: '5', title: '개인정보 처리방침', component: Privacy }, // AppInfo는 상위 컴포넌트에서 전달받는다. ];

2) 혹은 구조를 리팩토링하여 AppInfo와 CustomerService가 서로를 참조하지 않도록 설계

1.  CustomerService.js가 AppInfo.js를 필요로 하는 경우, AppInfo.js를 CustomerService.js에 전달하는 방식으로 구조를 변경할 수 있다.
2.  두 파일이 참조하는 공통의 부모 컴포넌트를 만들어서, 해당 부모 컴포넌트가 자식 컴포넌트들에 필요한 데이터를 전달하도록 설계할 수 있다.
  1. 다시 빌드 시도

수정이 완료되면 npm start 또는 react-native run-android 명령어로 다시 빌드한다.

MyYeonbi commented 4 weeks ago

KakaoTalk_Photo_2024-10-10-10-13-59 003 KakaoTalk_Photo_2024-10-10-10-13-58 002 KakaoTalk_Photo_2024-10-10-10-13-58 001

“Cannot connect to Metro” 오류는 React Native에서 Metro bundler와의 연결에 문제가 발생할 때 나타난다. 이 문제는 몇 가지 원인에 의해 발생할 수 있으며, 이를 해결하기 위해 다음 단계를 따라 진행해 볼 수 있다.

1. Metro Bundler 실행 확인

Metro Bundler는 JavaScript 코드를 번들링하여 앱에서 사용할 수 있도록 하는 도구입니다. Metro가 실행 중인지 확인해야 합니다.

해결 방법:

•   터미널에서 Metro가 실행되고 있는지 확인합니다.

npx react-native start

터미널이 반응 없이 중지되었다면, Metro가 실행되지 않는 것입니다. 위 명령어로 Metro를 다시 실행시킵니다.

2. Metro 서버 연결 확인

기기(혹은 에뮬레이터)와 Metro가 동일한 네트워크에 연결되어 있어야 합니다. Wi-Fi 네트워크가 끊기거나 변경되면 연결 문제가 발생할 수 있습니다.

해결 방법:

•   Android 디바이스나 에뮬레이터와 Metro가 동일한 네트워크에 연결되어 있는지 확인합니다.
•   만약 개발 중에 USB 디버깅을 사용하고 있다면, 디바이스가 컴퓨터에 제대로 연결되어 있는지 확인하세요.

3. 앱을 다시 빌드

때로는 Metro가 잘 실행 중이더라도 앱이 변경된 코드를 제대로 반영하지 못할 수 있습니다. 이런 경우에는 앱을 다시 빌드해 보는 것이 좋습니다.

해결 방법:

•   터미널에서 다음 명령어를 실행하여 앱을 다시 빌드합니다.

npx react-native run-android

또는,

npx react-native run-ios

4. USB 디버깅 및 기기 연결 확인 (Android)

Android 디바이스에서 USB 디버깅이 제대로 설정되지 않으면 연결 문제를 겪을 수 있습니다.

해결 방법:

•   USB 디버깅이 활성화되어 있는지 확인하려면:
1.  Android 디바이스에서 설정 > 개발자 옵션 > USB 디버깅을 활성화합니다.
2.  USB로 연결된 경우, 컴퓨터에서 adb devices 명령을 실행하여 연결된 디바이스가 제대로 인식되는지 확인합니다.

adb devices

디바이스가 인식되지 않으면 USB 케이블을 교체하거나 연결 상태를 확인해야 합니다.

5. 네트워크 문제 해결

Wi-Fi 네트워크가 불안정하거나 연결이 끊기면 Metro와의 연결이 끊길 수 있습니다.

해결 방법:

•   Wi-Fi를 껐다가 다시 켜거나, 인터넷 연결을 확인해 봅니다.
•   만약 디바이스가 모바일 네트워크에 연결되어 있으면, 동일한 네트워크에 연결하도록 Wi-Fi로 변경합니다.

6. Metro 캐시 지우기

Metro의 캐시 문제로 인해 연결이 실패할 수 있습니다.

해결 방법:

•   터미널에서 Metro 캐시를 지우는 명령을 실행합니다.

npx react-native start --reset-cache

7. React Native 프로젝트 정리

React Native 프로젝트에서 불필요한 상태나 캐시 문제로 Metro와의 연결에 실패할 수 있습니다.

해결 방법:

1.  node_modules와 watchman 캐시를 지우고 프로젝트를 다시 설정합니다.

rm -rf node_modules npm install

2.  다음 명령을 통해 watchman을 재시작합니다:

watchman watch-del-all

3.  다시 Metro 서버를 시작하고 앱을 빌드합니다:

npx react-native start npx react-native run-android

위 방법들로도 해결되지 않는다면, 추가로 에러 메시지나 설정 파일에서 더 많은 정보를 확인해 봐야 할 수도 있습니다.