불여우의 길 2023. 4. 5. 15:27

[WAS 실습]

 

Section1 실습과제가 끝났당

3일차인 오늘은 과제를 진행하면서 막혔던? 부분들을 정리하는 회고를 작성한당

 

1. DB 수정

users 테이블에서 type 컬럼으로 나누었던 학생과 강의자를 teachers 테이블을 만들어  학생과 강의자를 테이블로 분리해 주었다.

데이터베이스 관리의 목적으로도 두 테이블을 나누는게 맞다고 생각된다.

나누고 나니 ERD도 훨씬 깔끔하게 변경된 것 같당ㅎㅎ

 

2. 낯선 fastify 프로젝트

 

fastify.put('/', async function (request, reply) {
  //fastify-postgres에서 생성한 pg 인스턴스에서 데이터베이스 서버에 연결
  const client = await fastify.pg.connect()
  try {
    let rows;
    if (request.query.id) {
      let content = request.body;
      const result = await client.query(
        // 하단 [] 에 값들을 순차적으로 번호를 매기면서 파라미터로 사용
        'UPDATE CLASS SET TITLE=$2, TEACHER=$3, CODE=$4, TEACHER_ID=$5 WHERE id = $1',
        //request에서 쿼리로 보내는 id와 request body로 보내는 데이터
        [request.query.id, content.title, content.teacher, content.code, content.teacher_id]
      )
    }
    reply.code(201).send('Updated')
  }finally {
    // client 객체 풀에 반환
    client.release()
  }


})

수업시간에 한번 사용한적은 있었지만, fastify 프로젝트 js를 코딩하는게 조금 어렵게 느껴졌다.

코드를 작성하는 형식이 처음 볼때는 조금 낯설게 느껴졌다.

하지만 GET 메소드로 api 하나를 구현하고 나니 코드가 이해가 되면서 작성방법을 익히게 되었다.

소스 코드를 구글링해가면서 주석으로 작성해보았다.

 

3. 토큰 인증 구현

 

'use strict'
/*
module.exports = {
  createCOURSE : async(token, data) => {
    const id = await tokenValidator(token);
    const student_id = data.student_id;
    const class_id = data.class_id;
    return await createCOURSE(id,student_id,class_id)
  }
}
*/

module.exports = async function (fastify, opts) {
 
  /*
  const tokenValidator = async (token) => {
    console.log(token)
    let result;
    if(token === 'aaa'){
      result = 1;
    } else if (token === 'bbb'){
      result = 2;
    }
    console.log(result)
    return result
  }
  */

  // 데코레이션
  // fastify.decorateRequest('tokenValidator', tokenValidator);

  fastify.get('/', async function (request, reply) {

    const client = await fastify.pg.connect()
    try {
      let rows;
      if (request.query.student_id) {
        // code 값이 존재하면 해당 코드와 일치하는 데이터만 반환
        const result = await client.query(
          'SELECT * FROM COURSE JOIN CLASS ON COURSE.class_id = CLASS.id WHERE student_id = $1',
          [request.query.student_id]
        )
        rows = result.rows;
      } else {
        // code 값이 없으면 전체 데이터 반환
        const result = await client.query('SELECT * FROM COURSE JOIN CLASS ON COURSE.class_id = CLASS.id')
        rows = result.rows;
      }
        reply.code(200).send(rows)
    } finally {
        client.release()
    }
  })

  fastify.post('/', async function(request, reply) {
    //const token = request.headers.authorization.split('')[1]
    const client = await fastify.pg.connect()
    try{
      let content = request.body;
      const result = await client.query(
        'INSERT INTO COURSE (student_id, class_id) VALUES ($1, $2)',
        [content.student_id, content.class_id]
      )
      reply.code(201).send('Created')
     

      }
      /*
      catch(err){
        console.error(err)
        reply.code(403).send('Forbidden')
      }
      */
    finally {
        client.release()
    }
  })

  fastify.delete('/', async function(request, reply) {
    const client = await fastify.pg.connect()
    try{
      const result = await client.query(
        'DELETE FROM COURSE WHERE ID=$1;',
        [request.query.id]
      )
      reply.code(200).send('Deleted')
      }
    finally {
        client.release()
    }
  })

}

토큰을 인증하는 방식을 코드로 작성하였는데

완벽한 코드로 보임에도 불구하고 제대로 동작하지 않았다.

 

지금은 주석이 되어버렸지만...

 

나중에 다시 구현해보면 좋을 것 같다.

결국은 해결하지 못했다닌 이야기~

 

4. 멀티패스 환경에서의 리눅스 서버에서의 코딩..

 

멀티패스를 사용하여 프로젝트를 진행하다보니 쉘에서 코딩하는게 상당히 번거로웠다.

그래서 VS Code에 ssh 접속으로 연동에 성공하였다.

과정에서 오류가 많이 생겨서 포스팅을 해보았당ㅎㅋㅎ

https://itfirefox.tistory.com/3

 

VSCode에 ssh로 접속하여 멀티패스 서버 연동하기

수업을 들으면서 멀티패스로 vi로 열어서 코딩하다보니까 아.. 나도 툴로 개발하고싶다... 생각하다가 결국 맥북을 사고싶어졌다. 하지만 살 수 없으니 VS Code에 멀티패스 서버를 연동해야겠다고

itfirefox.tistory.com

 

이제 다시 사용할 지는 모르겠지만..?

 


아무튼 우리 팀은 큰 문제 없이 수월하게 잘 진행이 되었다.

중간에 고비도 있었지만 빨리 잘 해결해서 프로젝트를 나름 뿌듯하게 마쳤다.

이제 섹션2가 시작되니까 다시 열심히 시작해 봐야겠당.

섹션1도 차근차근 정리해서 올려봐야지


https://itfirefox.tistory.com/2

 

Section1 실습과제 Day 1

[WAS 실습] Day1 Achievement Goal - API 문서 작성 Bare Minimum - 관계형 데이터베이스를 위한 데이터를 모델링하고, API 문서화를 진행한다. Advanced - 주어진 기능 명세 외 필요하다고 생각되는 명세를 추가

itfirefox.tistory.com

https://itfirefox.tistory.com/4

 

Section1 실습과제 Day 2

[WAS 실습] Day2 Achievement Goal - Fastify를 이용해 DB와 통신하는 서버 만들기 - PostgreSql을 이용하여 DB를 구성 Bare Minimum - CRUD 기능을 가진 API 서버 환성 어제에 이어서 LMS 앱 애플리케이션을 만들게 되

itfirefox.tistory.com