virtual Schema

실제로 DB에 존재하는 값은 아니지만 DB 데이터에 접근할 때, 값을 조작해 가상의 속성 값(virtual) 으로 데이터를 접근할 수 있게 해주는 기능
DB의 getter , setter 역할을 한다.

EX)

const userSchema = mongoose.Schema({
  email: String
});
// Create a virtual property `domain` that's computed from `email`.
userSchema.virtual('domain').get(function() {
  return this.email.slice(this.email.indexOf('@') + 1);
});
const User = mongoose.model('User', userSchema);

let doc = await User.create({ email: 'test@gmail.com' });
// `domain` is now a property on User documents.
doc.domain; // 'gmail.com'

virtual schema 사용시 getter 내부에서 findOne과 같은 비동기 함수를 통해 값을 찾아 리턴해주려 해보았는데
정상적인 값이 리턴되지 않았다.

찾아보니 virtual은 반드시 동기적으로 반환이 되어야 하므로 virtual 속성 내에서 비동기 함수는 사용이 불가능하다고 한다.

https://stackoverflow.com/questions/69344848/can-we-use-query-inside-mongoose-virtuals

대신 populate를 이용해 다른 스키마에 접근하고 값을 가져올 수 있다고 한다. sql에서 join의 역할을 하는 것으로 보인다.
관련된 내용은 내일 공식문서를 비롯한 글을 읽어보고 TIL에 정리할 예정이다

pm2 로그 출력 옵션

CLI
When running pm2 start app.js [OPTIONS] you can pass any of this options to the CLI:

-l --log [path] specify filepath to output both out and error logs
-o --output specify out log file
-e --error specify error log file
--time prefix logs with standard formated timestamp
--log-date-format prefix logs with custom formated timestamp
--merge-logs when running mutiple process with same app name, do not split file by id

pm2 로 서버 실행시 다음과 같은 옵션을 통해 로그를 확인할 수 있다.

https://pm2.keymetrics.io/docs/usage/log-management/#size-limited-log-rotation

자세한 내용은 위 링크 참고

Prettier, ESLint 이용한 포매팅

Prettier는 Code Formatter이다. 즉, 작성한 코드를 정리해 주는 Tool이다. ESLint가 설정한 룰에 따라 룰에 맞지 않는 코드를 알려주는 Tool이라면, Prettier는 설정한 규칙이 맞게 코드를 맞춰주는(바꿔주는) Tool이다.
ESLint에는 강제성이 없지만, Prettier에는 강제성이 있다는 차이점이 있다.

https://velog.io/@josworks27/ESLint-Prettier-%EC%84%A4%EC%A0%95-%EB%B0%B1%EC%97%94%EB%93%9C

위 설정대로 진행하면 된다.

추가로 config파일을 분리해 주었기 때문에 환경 설정의 prettier:require config를 체크해주고

default formatter 는 prettier로 되어있는지 확인하자.

formatOnSave 도 체크해주어야 저장시 포매팅이 된다.

//settings.json
{
"editor.formatOnSave": true,
"terminal.integrated.defaultProfile.windows": "Git Bash",
"editor.defaultFormatter": "esbenp.prettier-vscode",
"workbench.iconTheme": "material-icon-theme",
"workbench.editorAssociations": {
  "*.dart": "default"
},
"[javascript]": {
  "editor.defaultFormatter": "esbenp.prettier-vscode"
},
"editor.bracketPairColorization.enabled": true,
"window.zoomLevel": 1,
"prettier.requireConfig": true
}
///prettierrc
{
  "singleQuote": true,
  "printWidth": 100,
  "tabWidth": 4,
  "useTabs": false,
  "semi": true,
  "quoteProps": "as-needed",
  "jsxSingleQuote": false,
  "trailingComma": "es5",
  "arrowParens": "always",
  "bracketSpacing": true,
  "endOfLine": "auto",
  "jsxBracketSameLine": false,
  "requirePragma": false,
  "insertPragma": false,
  "proseWrap": "preserve",
  "vueIndentScriptAndStyle": false
}
  //.eslintrc
{
    // 코드 포맷을 prettier로 설정
    "plugins": ["prettier"],

    // eslint의 룰을 기본 권장설정으로 설정
    "extends": ["eslint:recommended", "plugin:prettier/recommended"],

    "parser": "@babel/eslint-parser",
    // 코드를 해석하는 parser에 대한 설정
    "parserOptions": {
        // 자바스크립트 버전, 7은 ECMA2016
        "ecmaVersion": 7,
        // 모듈 export를 위해 import, export를 사용 가능여부를 설정, script는 사용불가
        "sourceType": "script",
        // jsx 허용을 설정, back-end 설정이기 때문에 사용 안함
        "ecmaFeatures": {
            "jsx": false
        },
        "requireConfigFile": false
    },
    //"parser": "babel-parser",
    // linter가 파일을 분석할 때, 미리 정의된 전역변수에 무엇이 있는지 명시하는 속성
    "env": {
        // 브라우저의 document와 같은 객체 사용 여부
        "browser": false,
        // node.js에서 console과 같은 전역변수 사용 여부
        "node": true
    },
    // ESLint가 무시할 디렉토리, 파일을 설정
    "ignorePatterns": ["node_modules/"],

    // ESLint 룰을 설정
    "rules": {
        // prettier에 맞게 룰을 설정
        "prettier/prettier": "error"
    }
}
//package.json
  "devDependencies": {
      "@babel/eslint-parser": "^7.17.0",
      "eslint": "^8.9.0",
      "eslint-config-prettier": "^8.3.0",
      "eslint-plugin-prettier": "^4.0.0",
      "prettier": "2.5.1"
  }

VSCode Debugging

그 동안 알고리즘 풀이때만 디버거를 활용하고 서버 개발을 할때는 주로 콘솔을 활용해 디버깅을 해왔는데...
오늘은 서버 개발 중 디버거가 굉장히 유용하다는 것을 새삼 느꼈다...

콘솔로는 보이지 않는 특정 오브젝트의 내부구조가 있었는데 콘솔에 보이는 부분만 보고 오브젝트에 key:value를 삽입하려다 한참 삽질을 했다..

실행 및 디버그 => 자바스크립트 디버그 터미널 => 디버그 콘솔에서 로컬 서버 실행 => 중단점과 f5, f10 을 활용한 디버깅!! 지금까지 개발 손해봤다.

0개의 댓글