원티드 프리온보딩 기업과제 1차 회고록

전준영·2022년 10월 23일
0

프로젝트 회고록

목록 보기
4/6
post-thumbnail

📌 회원관리 및 운동 능력 기록 앱 만들기

1. 프로젝트 소개

Node.js와 RDB를 이용하여 회원관리 및 운동 능력 기록 앱을 만듭니다.

1. 프로젝트 진행기간 및 인원

  • 2022.9.19 ~ 2022.9.30
  • FE : 3명
  • BE : 1명

2. 기술스택

  • Back-End : JavaScript, Node.js, Express, MySQL
  • Common : RESTful API, Git, Github
  • Communication : Slack, Notion, Zep

3. 맡은 기능

  • 특정 회원에 대한 측정 기록과 측정 데이터 생성
  • 측정기록 삭제하기

👉 Github link

4. db모델링

👉 DB diagram link

image

2. 프로젝트를 진행하며 느낀점

해당 기업이 제시한 여러가지 요구사항이 있었고 그에 맞추어 운동능력 기록 앱을 만드는 프로젝트였다.
요구사항 중에

  • 적절한 처리를 통해 시스템의 안정성을 확보합니다.
    • 필요한 경우에는, 비지니스 로직에서 트랜잭션 사용하여야 합니다.
    • 서비스상 필요하다고 판단된 경우, 기타 예외처리를 적용하여야 합니다.

이 부분을 읽고 트랜잭션 이라는 단어를 처음으로 들어보았다.

트랜잭션이란?

  • 트랜잭션은 데이터베이스의 상태를 변환시키는 하나의 논리적 기능을 수행하기 위한 작업의 단위 또는 한꺼번에 수행되어야할 일련의 연산들을 의미한다.
    출처: https://code-lab1.tistory.com/51 [코드 연구소:티스토리]

구글링을 통해 트랜잭션의 개념에 대해 파악을 하고 내가 작성한 코드에 적용시킬 부분이 있는가에 대해 고민을했는데, 내가 맡은 기능중에 특정 회원에 대한 측정 기록과 측정 데이터 생성 이라는 기능이 records 테이블에 먼저 데이터를 입력하고 그 데이터의 아이디를 가져와 record_data에 데이터를 입력하는 과정이 있었기 때문에 트랜잭션을 구현하여야 겠다고 생각했다.
마침 기업의 요구사항 중 ORM을 사용하지 않고 직접 쿼리문을 작성합니다. 라는 요구사항에 맞추어
초기 세팅을 지금까지 해오던 Typeorm을 사용하지 않고 MySQL만으로 연동하고 코드를 작성했는데
npm MySQL 공식문서에 트랜잭션 기능에 대한 설명을 읽고 참고하여 트랜잭션을 구현했다.

//controllers/record_controller.js

const pool = require("../models/common");

const recordDataController = async (req, res) => {
  const { id } = req.headers;
  const { weight } = req.body;
  const typeData = req.body.type_data;
  // pool이라는 변수로 common.js에 데이터베이스에 연결하는 설정파일을 만들어두고 require해온다.
  const conn = await pool.getConnection(async (conn) => conn);
  
      ....
  
 try{
   	// 트랜잭션 시작 명령어
    await conn.beginTransaction(); 
    await recordService.recordDataService(id, weight, typeData, conn);
   //모든 과정이 성공적으로 끝날 시 commit으로 데이터베이스에 저장
    await conn.commit();
    res.status(200).json({ message: "create success" });
  } catch (err) {
    // 에러가 발생했을 시 지금까지 데이터베이스에 실행됐던 부분들 rollback
    await conn.rollback();
    console.log(err);
    res.status(400 || err.statusCode).json(err.message);
  } finally {
    // 모든 과정이 끝난 후 데이터베이스에서 연결해제
    conn.release();
  }

이런식으로 conn이라는 변수를 Dao파일까지 보낸다음에 Dao단에서 conn.query('SQL query') 로 쿼리문을 작성하고 일부러 에러도 내보았는데 트랜잭션 기능이 잘 작동하는 것을 확인했다.
이번 기업과제를 하면서 새로운 기능에 대해 알게되면서 동시에 공부하고 그를 직접 구현해보며 정말 좋은 경험이 되었다고 생각한다.

이번 과제를 진행하면서 이 기능이 어디에 쓰일것인지 또 어떤 유저들이 주로 사용할 것인지를 정확히 우선적으로 파악하고나서 그 용도에 맞게끔 데이터베이스 모델링과 로직을 구현하는 것이 중요하다고 생각되었다.

아쉬운 점은 트랜잭션이라는 기능을 구현할때마다 저렇게 코드의 상단에 conn이라는 변수를 만들어 dao까지 함수의 인자로 계속 포함시켜 보내는 부분이 번거로웠다.
더 나은 트랜잭션 방법을 앞으로도 계속 공부하면서 구현해봐야겠다고 생각했다.

profile
Just do it!

0개의 댓글