IT STUDY LOG

[SECTION1] <WAS, Web Server 실습> 회고 본문

devops bootcamp 4/project log

[SECTION1] <WAS, Web Server 실습> 회고

roheerumi 2023. 4. 5. 11:52

💡 node 관련 모듈 설치

원인

  • 애플리케이션 구동 오류

해결방안


💡 git permission denied 문제

원인

  • 팀원 분 중 한 분 git permission denied 문제, 에러 메세지 public key 오류

해결방안

  • 새로 SSH Public key 발급 후 git에 등록

💡 fastify-postgres DB 애플리케이션 환경 설정 과정

npm i pg @fastify/postgres
  • <애플리케이션 경로>/plugins/postgres.js 설정
'use strict'

const fp = require('fastify-plugin')
const { DB_HOSTNAME, DB_USERNAME, DB_PASSWORD, DB_DATABASE, DB_SSL } = process.env

module.exports = fp(async function (fastify, opts) {
    fastify.register(require('@fastify/postgres'), {
        connectionString: `postgres://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOSTNAME}/${DB_DATABASE}`
      })
})
  • <애플리케이션 경로>에서 .env 설정
DB_HOSTNAME=floppy.db.elephantsql.com
DB_USERNAME=username
DB_PASSWORD=password
DB_DATABASE=dbname
DB_SSL=true
  • connection_test.js
'use strict'

module.exports = async function (fastify, opts) {
  fastify.get('/', async function (request, reply) {
    const client = await fastify.pg.connect()
    try {
      const { rows } = await client.query(
        'SELECT * FROM public.user'
      )
      reply.code(200).send(rows)
    } finally {
      client.release()
    }
  })
}

💡 fastify request 객체에서 path 변수에 접근하는 방법

원인

put, post의 경우 :id 등 path parameter에 접근해야함

해결방안

fastify request 객체 document 참조 후 console.log로 request 객체 확인

참고 : fastify request document


💡 code table의 상수를 전역적으로 관리하는 방법

원인

code table의 변수의 경우 전역적으로 관리할 필요가 있어 공통으로 관리하는 게 모듈화되어 독립적일 것이라고 판단

해결방안

fastify decorators api document 참고해 db_code.js 파일을 plugin에 생성하여 register하여 관리함

참고 : fastify decorators api

/plugins/db_code.js

'use strict'

const fp = require('fastify-plugin')
// 코드 관리를 위한 상수 정의
module.exports = fp(async function (fastify, opts) {
    fastify.register(fp((fastify, opts, done) => {

        fastify.decorate('code_group', {
            "USER_TYPE" : "USER_TYPE",
            "ENROLMENT_STATUS" : "ENROLMENT_STATUS"
        })     

        fastify.decorate('USER_TYPE', {
            "학생" : "STUDENT",
            "강사" : "PROFESSOR"
        })     

        fastify.decorate('ENROLMENT_STATUS', {
            "대기" : "WAITING",
            "완료" : "COMPLETION", 
            "취소" : "CANCELLATION"
        }) 

        done()
      }))
})
// other.js 접근 방법
console.log(fastify.ENROLMENT_STATUS.취소) 

💡 enrolment table에 없는 상태명 컬럼을 응답객체에 반환

원인

enrolment table에는 상태 코드만 있는 상태이나 put 후 응답객체를 반환할 때 상태 코드명도 제출해야 함

해결방안

DML 처리 후 JOIN SELECT 문으로 조회해서 반환

SELECT pe.id, pe.user_id, pe.class_id, pe.status, pc.name, pe.reg_date, pe.mod_date 
FROM public.enrolment pe
JOIN public.code pc 
ON pe.status = pc.code 
WHERE pe.id = ${request.params.id} and pc.code_group LIKE '${fastify.code_group.ENROLMENT_STATUS}';

💡 수강 취소는 수강 취소 상태가 아닐 때에만 신청 가능하도록 유효성 검증

원인

논리적으로 수강 신청 (대기, 완료, 취소) 상태 중 취소는 (대기, 완료)에서만 가능해야하므로 수강 신청 id가 취소 상태인 경우에만 취소가 가능

해결방안

처음에 일치하는 로우 가져올 때 판단하도록 쿼리 수정

SELECT *
            FROM public.enrolment
            WHERE id = ${class_id} AND status NOT LIKE '${fastify.ENROLMENT_STATUS.취소}'

💡 class 및 enrolment json scheme 검증

원인

ajv module 사용해 request.body로 넘어오는 json 스키마 값이 유효하지 않은 경우 검증

해결방안

class, enrolment 모델 각각 scheme.js 생성

// model/enrolmentScheme.js
const Ajv = require('ajv')
const ajv = new Ajv()

module.exports = () => {
  const userSchema = 
  {
    "type": "object",
    "properties": {
      "id": {
        "type": "integer"
      },
      "user_id": {
        "type": "integer"
      },
      "class_id": {
        "type": "integer"
      },
      "status": {
        "type": "string"
      },
      "reg_date": {
        "type": "string"
      },
      "mod_date": {
        "type": "string"
      }
    },
    "required": [
      "class_id", // 무조건 넘어와야하는 값의 경우 
    ]
  }
  const validate = ajv.compile(userSchema);
  return validate;
}

// routes/enrolments/index.js
'use strict'
const validate = require('../../model/enrolmentScheme')() // return한 validate 객체

// ... 중략 ... 
if(!validate(request.body)) {
      reply
        .code(400)
        .send("유효하지 않은 값입니다.")
      return;
    }

// ... 하략 ... 
Comments