23.4.5 DevOps 4기, 실습과제 1 회고

쿡쿡·2023년 6월 26일

DevOps(Code States)

목록 보기
21/25


💡 4.3-4.4 정리, 회고를 적지 못했다. 그만큼 치열했어!

[DevOps] Section1 실습과제

  • 개요: WAS 실습
  • 목표
    • API 문서를 작성할 수 있습니다.
    • Fastify를 이용해 DB와 통신하는 서버를 만들 수 있습니다.
    • PostgreSQL을 이용하여 DB를 구성할 수 있습니다.
    • GitHub을 활용하여 팀원들과 협업합니다.

DAY 1

  • LMS(학습 관리 시스템)
    • 사용자는 모든 수업을 조회할 수 있다
    • 사용자는 특정 분류의 수업을 조회할 수 있다(예: 강의자/ 수업명 / 수업코드 등)
    • 사용자는 수업을 수강신청 할 수 있다
    • 사용자는 모든 수강중인 수업을 조회할 수 있다
    • 사용자는 이메일 정보와 같은 개인정보를 변경할 수 있다
    • 사용자의 타입이 강의자일 경우 새로운 수업을 생성할 수 있다
    • 사용자는 수업에 대한 수강신청을 취소 할 수 있다

담당하게 된 것은 LMS. 쇼핑몰이 걸렸음 했지만 그래도 비슷한 주제이니까 상관 없음.

  • ERD 준비

https://dbdiagram.io/home 디비 다이어그램을 사용.

최초 ERD, 생각보다 복잡함.
유저라는 사용자를 학생과 교수로 나누어서 각각의 작업을 한다 생각해서 나누었음
제대로 이해하지 못하고 정보 조회, 각 항목의 같은 값끼리 연결!

최종 ERD, 여기까지 오는데 첫 날 오전을 다 사용하고 오후에도 토론…
우리 팀의 문제는 네비게이터가 없었다.
정보 조회는 get 메서드로 가능하고 연결이 필요 없음.
사용자를 받아 나누기 보다는 시작부터 사용자를 나눔

API 문서를 제작해야 했지만 그러지 못함. 예시는 유어클래스에.
완성본이라 지금 보면 문제가 없어 보이지만 사실 토근도 구현하지 못했고 응답 코드와 바디도 알아서 응답이 뜨는 경우가 많아서 하나하나 설정하지는 않았음

발표

하필 또 준비도 못했는데 발표 1번 걸려 양해를 구하고 2번으로 바꿈.
다른 조의 발표를 들으니 분석을 하고 시작을 했음. 왜 우리는 분석 안했지 생각하면서 저렇게 했으면 더 좋았겠다 생각함

💡 프로젝트 껌이지! 처음에 들었던 생각….. 하지만 결과는 한 짤로 요약한다…

1일차 끝나고야 시간표가 있다는 것을 알았다….ㅋ


DAY 2

주어진 영상을 보고 elephantsql 사용해서 데이터 베이스를, fastify를 사용해서 프로젝트를 생성, 데이터베이스와 WAS를 연결했다.

500번 코드…….
오전 10-12까지 어떻게 해도 같은 오류가 떠서 가상환경이 아니라 윈도우로 모든 정보들을 가져와 진행해보려고 함(엔지니어분께서 윈도우 환경에서 해보라는 말씀이 있었음).

윈도우 환경에서는 아예 fastify가 실행 안되는 오류…

console.log를 통해 서버가 어디까지 읽고 오류가 나는지 파악을 해보았고
데이터베이스에 접근하지 못하는 부분을 발견함

.env 파일이 루트 폴더에 있어야 하는데 routes 폴더에 있었음.

.env 파일을 루트 폴더인 myproject폴더로 이동해서 해결

서버를 연결하고 API 문서를 보면서 서버를 구현
하고 문제가 없었다면 좋겠지만 처음에 코끼리에 입력한 데이터가 문제였다
데이터의 값을 하나하나 다 정해주고 코딩을 하니 모든 데이터 하나하나를 조회하는 코드가 필요했다…
코리끼 전면 수정… 다른 테이블에 있지만 같은 값을 갖게 해주는 references 를 사용해서 고유 id값을 정해주고 고유 id 값은 각 테이블에서 serial4를 사용해서 알아서 값이 들어갈 수 있도록 수정.
물론 처음에 계획한 db는 이게 아니긴 했지만 수정하다 보니 편리함을 위해 이렇게 되었다 .

  • 학생 정보 조회, 수정
```jsx
// 학생 정보 조회, 수정

'use strict'

module.exports = async function (fastify, opts) {
    fastify.get('/', async function (request, reply) {
        fastify.pg.connect()
        const client = await fastify.pg.connect();
        const { rows } = await client.query('SELECT * FROM students');
        client.release();
        return rows;
        }),
    fastify.put('/:stid', async (req, reply) => {
        const client = await fastify.pg.connect()
        console.log(req.params)
        console.log(req.body)
        try {
            const { email } = req.body
            const { rows } = await client.query(
                `UPDATE students SET email='${req.body.email}' WHERE stid='${req.params.stid}' RETURNING *`
            )
            
            reply.code(201).send(rows)
        } finally {
            client.release()
        }
        })
}
```
  • 수강 신청 조회
    // 수강 신청 정보 조회
    
    'use strict'
    
    module.exports = async function (fastify, opts) {
        fastify.get('/', async function (request, reply) {
          const client = await fastify.pg.connect()
          let qKey = Object.keys(request.query)
          let queryk = ''
    
          if(qKey == 'stid'){
            queryk = request.query.stid
            try {
              const { rows } = await client.query('SELECT * FROM public.registration WHERE stid =' + queryk)
    
              reply.code(200).send(rows)
            } finally {
              client.release()
            }
          } else {
              try {
                const { rows } = await client.query('SELECT * FROM public.registration')
    
                reply.code(200).send(rows)
              } finally {
                client.release()
              }
            }
        }),
        fastify.delete('/:id', async function (request, reply) {
            fastify.pg.connect()
            const client = await fastify.pg.connect();
            const { rows } = await client.query(`DELETE FROM registration WHERE id='${request.params.id}'`);
            client.release();
            reply.code(200).send("Delete complete")
            })
    }
  • 수강 신청
    // 수강 신청
    
    'use strict'
    
    module.exports = async function (fastify, opts) {
        fastify.post('/', async (req, reply) => {
            const client = await fastify.pg.connect()
            try {
                const { stid, lecid } = req.body
                const { rows } = await client.query(
                'INSERT INTO public.registration (stid, lecid) VALUES ($1, $2) RETURNING *',[stid, lecid]
                )
                
                reply.code(201).send(rows)
            } finally {
                client.release()
            }
            })
        }
  • 강의 조회
    // 강의 조회
    
    'use strict'
    
    module.exports = async function (fastify, opts) {
      fastify.get('/', async function (request, reply) {
        const client = await fastify.pg.connect()
        let qKey = Object.keys(request.query)
        let queryk = ''
    
        if(qKey == 'profid'){
          queryk = request.query.profid
          try {
            const { rows } = await client.query('SELECT * FROM public.lectures WHERE profid =' + queryk)
    
            reply.code(200).send(rows)
          } finally {
            client.release()
          }
        } else if (qKey == 'lecid'){
          queryk = request.query.lecid
          try {
            const { rows } = await client.query('SELECT * FROM public.lectures WHERE lecid =' + queryk)
    
            reply.code(200).send(rows)
          } finally {
            client.release()
          }
        } else if (qKey == 'lecname'){
          queryk = request.query.lecname
          try {
            const { rows } = await client.query(`SELECT * FROM public.lectures WHERE lecname ='${queryk}'`)
    
            reply.code(200).send(rows)
          } finally {
            client.release()
          }
        } else if (qKey == 'day'){
          queryk = request.query.day
          try {
            const { rows } = await client.query(`SELECT * FROM public.lectures WHERE day ='${queryk}'`)
    
            reply.code(200).send(rows)
          } finally {
            client.release()
          }
        } else {
            try {
              const { rows } = await client.query('SELECT * FROM public.lectures')
    
              reply.code(200).send(rows)
            } finally {
              client.release()
            }
          }
      })
    }
  • 강의 개설
    // 강의 개설
    
    'use strict'
    
    module.exports = async function (fastify, opts) {
        fastify.post('/', async (req, reply) => {
            const client = await fastify.pg.connect()
            try {
                const { profid, lecname, day } = req.body
                const { rows } = await client.query(
                'INSERT INTO public.lectures (profid,lecname, day) VALUES ($1, $2, $3) RETURNING *',[profid,lecname, day]
                )
                
                reply.code(201).send(rows)
            } finally {
                client.release()
            }
            })
        }
💡 2일차 끝. 수정, 실행의 반복. 코드를 입력해야 하는데 머리 속에 아무것도 들어있지 않음.

나 지금까지 뭐 했냐는 생각을 1억번은 한 듯

나를 바라보는 팀원들의 눈빛…


DAY 3

프론트를 만들어서 가시성이 있는 과제를 제출하려 했지만 만들다보니 시간 안에 할 수 없다고 판단.
구현 사항을 하나하나 확인하며 캡쳐 후 png파일로 깃에 제출 완료

  • 구현 사항
    • 사용자는 모든 수업을 조회할 수 있다

- 사용자는 특정 분류의 수업을 조회할 수 있다(예: 강의자/ 수업명 / 수업코드 등)
    

- 사용자는 수업을 수강신청 할 수 있다
    

- 사용자는 모든 수강중인 수업을 조회할 수 있다
    

- 사용자는 이메일 정보와 같은 개인정보를 변경할 수 있다
    

- 사용자의 타입이 강의자일 경우 새로운 수업을 생성할 수 있다
    

- 사용자는 수업에 대한 수강신청을 취소 할 수 있다
    

이슈가 있을 때 마다 체크하고 해결하고 체크하고 해야하는데 그냥 머리 속, 구글, gpt, 유어클래스 다 찾아가면서 정보를 찾느라 신경쓰지 못했다


회고(후기?)

#오만 #멍청

지금까지 배운 자료들을 통해서 나는 잘할 수 있어 라고 생각했지만 막상 시작하고 회의 할 때에도 몰랐다.

유어클래스에서 다 한 번씩 해본 도구들을 가지고 했다. 바뀐 건 없어.
내가 바뀌었다. 알고 있다 생각했다. 한 번씩 실행만 해보고 ‘어 된다’ 하고 말았던 이전의 내 모습들이 스친다.

1일차 API주소를 이야기 하면서, 2일차 메서드를 구현하면서도 아무것도 하지 못했다.
그저 옆에서 하는 척만.

좋은 경험. 유어클래스는 내 생각보다 너무나 좋은 자료다.
한달동안 공부하면서 얻은 것은 우분투 키는 방법 뿐…
앞으로의 공부 방법을 생각, 어떻게 실천할까… 많은 변화가 있을 것이다.

팀원들은 앞에서는 말하지 못했지만 나를 보면서 어떤 생각을 했을까…?

지금 드는 생각을 앞으로 실천하는지, 다음 프로젝트의 내가 이전의 회고를 보며 생각할 수 있게 적어둔다.

  1. js코드를 하나하나 뜯어서 왜 여기에 이 코드가 들어가는지 분석해서 내가 작성할 수 있도록
  2. 다른 공부 자료는 미래의 나에게 주고 지금은 유어클래스를 완벽은 힘들겠지만 어떤 자료를 어떻게 공부했는지 생각할 수 있도록
  3. 이슈가 생기면 적어두고 해결하고 해결 방법을 적는다… 이거 진짜 해야함

그래도 재미있었다. 이렇게 시간 잘 간거 오랜만이야.

profile
https://www.notion.so/a67850905fb843fc9cdcdb173f888338

0개의 댓글