개요

vue를 통해 front-end측 로직 처리 중 이상한 오류가 발생하여 공유한다. api 호출 시 특정 상황에서 CORS 오류가 발생하는데, CORS 오류와 함께 504 에러가 발생하는 것이다. 서버측 CORS 설정은 한참전에 완료되었기 때문에 다른 문제라고 바로 생각이 들어서, CORS + 504 에러가 발생하는 경우로 검색해봤다.

아래의 블로그가 나와 비슷한 현상이 발생하는것 같아서 적용해보니 해결할 수 있었다.

504 (Gateway Timeout) 에러 해결 (AWS EB, Node.js)

또한 CORS와 함께 504 에러가 발생하는 이유는 아래의 글에서 확인할 수 있었다.

https://github.com/kubernetes/ingress-nginx/issues/2134

정리

문제의 원인은 nginx측에서 기본적으로 proxy 연결 시간이 60초로 설정되는데, 이 시간이 넘어가면서 nginx측에서 504 에러를 리턴한 것이다. 그와 더불어 504 에러를 리턴할 때에 header에 CORS 관련 정보가 포함되지 않아 두 오류가 동시에 발생하는 것이다.

따라서, nginx측 오류만 수정한 후 다시 시도하니 성공적으로 API를 요청할 수 있었다.

개요

SSAFY 2학기 특화 프로젝트에서 front-end를 담당하며 생긴 trouble shooting 로그를 남겨본다.

책을 넘기는 듯한 ui를 구현하기 위해 turn.js 라이브러리를 활용했으나, 환경적인 문제로 인하여 jquery 적용에 어려움을 느꼈다. 이를 해결한 방법을 정리해보자.

환경

  • vue ^3.3.0
  • vuetify ^3.0.0
  • typescript
  • vite

JQuery 적용하기

먼저 JQuery 적용 및 turn.js 사용을 위해 js 파일을 다운로드 한 후 index.html 파일에 추가해줬다.

<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <link rel="icon" href="./src/assets/logo-1.svg" />

    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>동동주</title>
  </head>

  <body>
    <div id="app"></div>
    <script src="src/js/jquery-3.7.1.min.js"></script>
    <script src="src/js/turn.min.js"></script>
    <script type="module" src="/src/main.ts"></script>
  </body>
</html>

여기까지 설정 후 바로 npm run dev 명령어를 통해 실행 시 정상적으로 표시되지만 빌드하여 서버에 업로드 시 아래의 오류 발생하며, turn.js 라이브러리가 정상 적용되지 않은것처럼 표시된다.

index-Cb6_uoSS.js:13 ReferenceError: $ is not defined
    at index-Cb6_uoSS.js:29:67165
    at index-Cb6_uoSS.js:13:11187
    at B3 (index-Cb6_uoSS.js:13:38)
    at T1 (index-Cb6_uoSS.js:13:109)
    at c.__weh.c.__weh (index-Cb6_uoSS.js:13:11068)
    at pn (index-Cb6_uoSS.js:13:1502)
    at Hn (index-Cb6_uoSS.js:13:1798)

원인파악

빌드 시 발생한 문제로 보이기 때문에, 관련 키워드로 검색 시도하여 아래의 게시글 발견

게시글의 댓글에서 script 태그에서 type=”module” 설정 이후 동작했다는 글이 있었지만, 동작하지 않았다.

ReferenceError: $ is not defined, Jquery Import with vite

또다른 게시글을 통해 방법을 찾아봤다. Jquery는 vite를 위해 일반적인 방식을 허용하지 않는다는 내용이 있었다. 또한 이를 위해서는 롤업 플러그인 삽입을 통해 동작한다는 것이다.

I am having problem using jquery with Vite. Used rollup-plugin-inject but still couldn't seem to make it work

Setup jQuery on Vite

이를 위해 아래의 명령어 실행 후 vite.config.mts 파일에 jquery를 추가하는 코드 작성했다.

$ npm i @rollup/plugin-inject --save-dev
$ npm i jquery
import inject from "@rollup/plugin-inject";
...

inject({
      jQuery: "jquery",
      "window.jQuery": "jquery",
      $: "jquery",
    }),

또한 rollup.config.mts 파일 생성 후 아래의 코드 추가

import inject from "@rollup/plugin-inject";

export default {
  input: "src/main.ts",
  output: {
    dir: "output",
    format: "cjs",
  },
  plugins: [
    inject({
      Promise: ["es6-promise", "Promise"],
    }),
  ],
};

이후 build한 파일을 서버를 업로드하여 jquery를 사용할 수 있었지만, 반대로 develop 환경에서는 다시 오류가 발생했다.

Uncaught (in promise) TypeError: $(...).turn is not a function
    at StoryBook.vue:8:21
    at chunk-2FDUVFJ5.js?v=4baee24c:4317:88
    at callWithErrorHandling (chunk-2FDUVFJ5.js?v=4baee24c:1660:19)
    at callWithAsyncErrorHandling (chunk-2FDUVFJ5.js?v=4baee24c:1667:17)
    at hook.__weh.hook.__weh (chunk-2FDUVFJ5.js?v=4baee24c:4297:19)
    at flushPostFlushCbs (chunk-2FDUVFJ5.js?v=4baee24c:1834:41)
    at flushJobs (chunk-2FDUVFJ5.js?v=4baee24c:1872:5)

해결방안

시간 관계상 해당 버그를 찾는데 너무 오랜 시간을 사용할 수 없으므로 우선 빌드 환경에서는 파일을 바꿔치는 방식을 이용하던지 해야할 것 같다.

Reference

[ Vue ] vue 프로젝트에 Jquery 설치하기

[Vue] jQuery 사용하기 #eslint 설정

Setup jQuery on Vite

ReferenceError: $ is not defined, Jquery Import with vite

I am having problem using jquery with Vite. Used rollup-plugin-inject but still couldn't seem to make it work

개요

vue project 개발 중 로컬에서 앱 시작 시 오류 발생하며, 처음 페이지 로딩 시 콘솔에 아래의 로그가 표시됨.

GET <http://localhost:3000/@id/__x00__plugin-vuetify:components/VDivider/VDivider.sass> net::ERR_ABORTED 404 (Not Found)
chunk-GGIT7KZK.js:46 
        
GET <http://localhost:3000/@id/__x00__plugin-vuetify:components/VImg/VImg.sass> net::ERR_ABORTED 404 (Not Found)
chunk-GGIT7KZK.js:49 
        
GET <http://localhost:3000/@id/__x00__plugin-vuetify:components/VResponsive/VResponsive.sass> net::ERR_ABORTED 404 (Not Found)

오류 환경

OS : Windows 10 Enterprise

Vue 3.3.0 + Vuetify 3.0 + typescript

npm run dev 실행

오류 내용 분석

로그를 읽어보면 vuetify의 sass 파일을 찾지 못해 페이지를 보여주지 못하는 것으로 보인다. 관련 내용으로 구글링 해보자.

오류 확인

관련 이슈를 vuetify 공식 github 페이지에서 찾았다.

https://github.com/vuetifyjs/vuetify/issues/7950

나의 경우 위 포스팅의 아래 댓글을 확인하여 해결 했다.

  1. node_modules 제거rm -r .\\node_modules\\
  2. package-lock.json 제거rm -r .\\package-lock.json
  3. "sass": "1.32.13"
  4. devDependency 섹션 아래 package.json에 한 줄을 추가합니다 .

오류 수정

내 코드의 경우 프로젝트 생성 시 아래처럼 1.69.0 버전으로 추가 되었다.

이를 1.32.13으로 수정해주니 더이상 문제가 발생하지 않았다.

버전 충돌로 인하여 발생한 문제 같다.

개요

프로젝트 진행 중 vuetify의 VWindowItem 컴포넌트를 사용했었는데, 첫번째 VWindowItem을 로딩할 때 props 전달이 정상적으로 이뤄지지 않는 경우가 있었고, 이를 어떻게 해결했는지 공유하고자 글을 작성합니다

 

문제점 확인

소스코드의 경우, v-window-item 컴포넌트의 value가 변경되면 표시할 하위 컴포넌트가 변경되는 방식인데 v-window-item의 value에 해당하는 컴포넌트가 최초 1회 실행시에는 데이터를 표시하지 못하는 현상이었습니다.

컨벤션이 조금 다른부분은 양해해주길 바랍니다..

 

아래의 화면을 보면 문제점이 쉽게 이해가 될 것이다. 최초로 마커를 클릭했을 때 단지 정보를 표시하지 못하고, 이후부터는 정상적으로 동작하는 것을 볼 수 있다.

 

 

소스 코드 분석

왜 이러한 문제가 발생했는지 로그를 통해 확인해보자. 먼저 props 값을 전달하는 부분, 컴포넌트가 props를 받는 부분, 하위 컴포넌트가 Mounted 되는 부분에 로그를 남겼고, 결과는 아래와 같았다.

 

 

이후 두번째로 마커를 선택하여 다시한번 로그를 확인해봤다. 

 

 

이로써 현재 발생하고 있는 문제점은 첫번째로 마커 클릭 이벤트를 보냈을 때, TabTest 컴포넌트에 props가 정상적으로 전달되지 않는다는 점이다. 그렇다면 왜 이러한 문제가 발생하는지 다시 한번 고민해보자.

 

첫번째 props값이 업데이트 될 때 값이 업데이트 된 이후에 "하위 컴포넌트 Mounted" 로그가 발생했으므로, 컴포넌트가 생성되지 않은 시점에 props가 전달되었을 확률이 높아보인다. 따라서, VWindowItem 컴포넌트와 관련지어 같은 문제가 발생한 경우가 있는지 알아보자.

 

문제 해결

구글링에 앞서, Vuetify의 VWindowItem 컴포넌트 API 문서를 확인해보니 관련 props가 존재하는걸 확인했다.

 

 

또한, 구글링한 문서에서도 eager props를 통해 문제를 해결한 유사 사례를 발견했다.

https://stackoverflow.com/questions/69796214/i-cannot-watch-vuex-state-in-components-within-v-tabs-until-first-visit

 

I cannot watch Vuex state in components within v-tabs until first visit

vuetify: ^2.5.10 vuex: ^3.6.2 vue: ^2.6.14 I have an application developed in v-tabs. In the child component in the first of these tabs, I have a <v-file-input v-model="file"

stackoverflow.com

 

따라서, eager props를 설정하고 다시 한번 결과를 확인해보자.

 

하위 컴포넌트가 Mounted 되는 시점이 위로 올라갔고, 첫번째 호출에서도 props 값을 잘 수신하는것을 볼 수 있다.

Reference

https://vuetifyjs.com/en/api/v-window-item/#links

 

https://vuetifyjs.com/en/api/v-window-item/#links

 

vuetifyjs.com

 

+ Recent posts