단진
대체로 맑음
단진
  • 분류 전체보기 (165)
    • 개발 (115)
      • 회고 (26)
      • 개발과정 (28)
      • 개념 (15)
      • JavaScript (12)
      • TypeScript (12)
      • 알고리즘 (4)
      • GitHub (4)
      • 오류 (9)
      • TMI (5)
    • 일상 (15)
      • 사진 및 여행 (6)
      • 책 소개 (4)
      • 기타 TMI (5)
    • IT (16)
      • 개념 (5)
      • 데이터베이스 (6)
      • 딥러닝 (1)
      • TMI (4)
    • TMI (4)
      • 법률 TMI (4)
    • 보안 (15)
      • Dreamhack (5)
      • Root Me (10)
hELLO · Designed By 정상우.
단진

대체로 맑음

[Vite] Vite proxy 설정 (Error: connect ECONNREFUSED ::1:8000 at TCPConnectWrap.afterConnect [as oncomplete])
개발/오류

[Vite] Vite proxy 설정 (Error: connect ECONNREFUSED ::1:8000 at TCPConnectWrap.afterConnect [as oncomplete])

2023. 11. 25. 22:13

문제상황

현재 React 프로젝트에서 Vite를 사용하고 있다.

 

리액트는 빌드되어 백엔드에서 정적 파일로 배포할 것이다.

 

따라서, 현재 리액트에서 보내는 요청은 모두 localhost:8000/api로 시작하는 주소로 보내고 있다.

 

따라서 배포가 된다면 {서버 IP}:8000/api로 보내야 할 것이다.

 

같은 서버에서 백엔드가 정적 파일을 전달할 것이기 때문에 클라이언트는 상대경로를 이용해 api 요청을 보낼 수 있을 것이다. (/api/test => {서버 IP}:8000/api/test)

 

하지만, 로컬의 경우는 여전히 localhost:8000으로 api 요청을 보내야 한다.

 

해결과정

이를 해결하기 위해 proxy 설정이 필요했다.

 

개발 환경에서 보내는 요청은 localhost:8000으로 보내고 빌드된 경우는 어차피 같은 경로기 때문에 상대 경로로 api 요청을 할 수 있기 때문이다.

 

Vite에서 proxy 설정을 하는 방법은 아래와 같다.

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  server: {
    proxy: {
      '/api': {
        target: 'http://localhost:8000',
        changeOrigin: true,
      },
    },
  },
});

 

기존 CRA 기반의 리액트에서는 단순히 package.json에서 설정했으면 되지만 Vite의 경우는 vite.config에서 설정해야 한다.

 

위와 같이 설정하여 /api로 시작하는 주소로 가는 요청을 http://localhost:8000으로 프록시 설정을 해줬다.

 

따라서, /test는 localhost:3000/test로 요청이 가게 될 것이고 /api/test는 localhost:8000/api/test로 요청이 가게 될 것이다.

 

또한, 위와 같이 프록시 설정을 해줬다면 axios(또는 fetch)에서 상대경로로 작성해줘야 한다.

axios
  .get('/api/test')
  .then((response) => {
    console.log(response.data);
    setApiTest(response.data.message);
  })
  .catch((error) => {
    console.log(error);
    setApiTest(`${error.code} ${error.message}`);
  })

 

또 다른 문제

위와 같이 작성했으나 오류가 발생했다.

연결이 제대로 되지 않는 문제가 발생했다.

 

찾아보니 localhost는 일반적으로 시스템의 loopback 네트워크 인터페이스를 참조하며, 이는 IPv4에서 127.0.0.1로 해석되고 IPv6에서는 ::1로 해석된다고 한다.

 

위의 에러를 보면 ::1로 변환되었음을 알 수 있다.

 

서버에 별도의 설정을 하지 않았기 때문에 IPv4가 필요했다.

 

따라서, 이를 해결하기 위해 localhost를 사용하는 대신 127.0.0.1을 사용하여 IPv4임을 명시해줬다.

import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [react()],
  server: {
    proxy: {
      '/api': {
        target: 'http://127.0.0.1:8000',
        changeOrigin: true,
      },
    },
  },
});

 

위의 과정을 통해 Vite 기반의 프로젝트에서 proxy 설정을 할 수 있었다.

저작자표시 (새창열림)

'개발 > 오류' 카테고리의 다른 글

[Flutter] Android toolchain 오류 (Android SDK)  (0) 2023.01.07
React (+TypeScript, Styled-Component, ResetCSS) 프로젝트에 구글폰트 적용 안됨 및 해결법  (0) 2022.11.27
WSL + VSCode Git 변경사항 감지 불가 및 속도 저하  (0) 2022.10.11
WSL 설치 에러(error: 0x8007019e)  (0) 2022.06.30
'mysql'은(는) 내부 또는 외부 명령, 실행할 수 있는 프로그램, 또는 배치 파일이 아닙니다. 해결법  (0) 2022.03.26
    '개발/오류' 카테고리의 다른 글
    • [Flutter] Android toolchain 오류 (Android SDK)
    • React (+TypeScript, Styled-Component, ResetCSS) 프로젝트에 구글폰트 적용 안됨 및 해결법
    • WSL + VSCode Git 변경사항 감지 불가 및 속도 저하
    • WSL 설치 에러(error: 0x8007019e)
    단진
    단진

    티스토리툴바