IT STUDY LOG
[SECTION1] <WAS, Web Server 실습> 회고 본문
💡 node 관련 모듈 설치
원인
- 애플리케이션 구동 오류
해결방안
- 애플리케이션 구동에 필요한 모듈을 package.json에 추가
- fastify 모듈 : https://www.fastify.io/docs/latest/Guides/Getting-Started/#install
- fastify-cli 모듈 설치 : https://www.npmjs.com/package/fastify-cli
- dotenv 모듈 설치
- 기타 참고할 모듈 의존성
- @fastify/autoload": "^5.4.1
- @fastify/cors": "^8.2.0"
- @fastify/sensible": "^5.1.1"
- ajv": "^8.11.2"
- dotenv": "^10.0.0"
- fastify-plugin": "^4.3.0"
- sinon": "^12.0.1"
- "pg": "^8.8.0”
💡 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 객체 확인
💡 code table의 상수를 전역적으로 관리하는 방법
원인
code table의 변수의 경우 전역적으로 관리할 필요가 있어 공통으로 관리하는 게 모듈화되어 독립적일 것이라고 판단
해결방안
fastify decorators api document 참고해 db_code.js 파일을 plugin에 생성하여 register하여 관리함
/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;
}
// ... 하략 ...
'devops bootcamp 4 > project log' 카테고리의 다른 글
[SECTION2] <AWS 배포 자동화> DAY 4 LOG (0) | 2023.05.02 |
---|---|
[SECTION2] <AWS 배포 자동화> DAY 3 LOG (0) | 2023.05.01 |
[SECTION2] <AWS 배포 자동화> DAY 2 LOG (0) | 2023.04.28 |
[SECTION2] <AWS 배포 자동화> DAY 1 LOG (0) | 2023.04.27 |
[SECTION 1] <WAS, Web Server 실습> Introduction (0) | 2023.04.03 |
Comments