I. 개요


swagger로 API와 .env로 환경변수 관리를 위해 경로를 설정하는 과정에서 오류가 발생했다.

구글링해서 그대로 따라했는데 안되는 경우가 많아 어려웠다.

// /swagger/swagger.js
// Swagger로 관리할 api들을 연결할때 오류 발생.

const swaggerUi = require("swagger-ui-express");
const swaggerJsdoc = require("swagger-jsdoc");
const options = {
  swaggerDefinition: {
    openapi: "3.0.0",
    info: {
      version: "1.0.0",
      title: "미니 프로젝트",
      description:
        "Express Swaager swagger-jsdoc 방식 RestFul API 클라이언트 UI",
    },
    servers: [
      {
        url: "http://localhost:3000", // 요청 URL
      },
    ],
  },
    apis: ["./routers/*.js"], 
    // s에러 발생
}

swagger와 routers폴더가 같은 디렉토리에 있어서 이렇게 경로를 설정했지만 에러가 발생했다. 다른 블로그와 비슷한 구조라 똑같이 작성했는데 에러가 발생하여 _dirname+"/../routers/*.js" 처럼 절대 경로를 넣어 해결했다.

// .env 에서 환경 변수를 가져오는 중 오류 발생.

require('dotenv').config();
console.log(process.env.DB_HOST);
// undefined

require('dotenv').config({'path': __dirname + '/.env'});
console.log(process.env.DB_HOST);
//localhost

그런데 env파일에서도 같은 오류가 발생해서 같은 문제임을 느끼고 제대로 알고자 공부한 뒤 해결했다.

II. 경로

1. 경로 작성법


  1. 절대 경로
    • 고유 경로.
    • 항상 /로 시작한다.
  2. 상대 경로
    • 위치한 곳을 기준으로 경로를 파악하는 법.
    • . 현재 디렉토리, .. 부모 디렉토리.

2. 현재 작업 경로 확인법


1) __filename

  • file명을 포함한 절대 경로

2) __dirname

  • 현재 파일의 폴더 경로 (파일 명 제외)

3) process.cwd()

  • node명령을 호출한 작업 디렉토리의 절대 경로

III. 문제 해결


결국 노드 명령을 어디에서 호출했냐에 따라 경로가 설정 되므로 process.cwd()를 기준으로 상대 경로를 설정해야 한다.

vscode로 연 폴더는 /Programmers 이다.

console.log('cwd 경로:'+process.cwd())
console.log('dirname 경로:'+__dirname)

/*
cwd 경로: C:\Users\yoobi\Documents\Programmers
dirname 경로: C:\Users\yoobi\Documents\Programmers\express-demo
*/

디버깅은 “program”: “${file}”로 해놔서 터미널 위치 상관없이 잘 돌아가지만, 실제 노드가 돌아가는 곳은 process.cwd()이다.

// swagger.js
// "./routers/*.js"는 잘못된 상대 경로 
apis: ["./express-demo/routers/*.js"], 

//require('dotenv').config()에서는 process.cwd()기준으로 실행되므로 
// 처리되므로 programmers/.env로 자동 들어가기에 경로 오류 
require('dotenv').config({path:'./express-demo/.env'});

연결해야 할 swagger와 .env는 express-demo폴더 안에 있으므로, ./express-demo/routers/*.js 이렇게 상대 경로를 작성하면 된다.

열심히 찾고 그대로 해도 오류가 안 고쳐져서 몇 시간 골머리를 앓았지만 기회로 삼고 공부하니 이제서야 제대로 알아가는 느낌이 난다.

여담으로 express-demo/routers/*.js 로 작성해도 똑같이 경로가 들어가는데, Node.js에서는 ./를 붙이던 안붙이던 큰 차이가 없이 상대 경로로 인식 된다. Python이나 PHP도 비슷하게 동작하지만 경우에 따라 다르고, (import문 모듈 로드 시 등등.. ) 상황에 따라 다르게 해석될 수 있으므로 생략하지 않고 ./ 를 붙이고 쓰는게 좋다.