@ITcat 프로젝트 회고

usnim·2024년 2월 2일
0

project

목록 보기
4/20

미뤘던 프로젝트 회고를 작성함과 동시에 다시 블로그를 작성하려한다.

우리는 소규모 극장에서의 티켓 구매 과정이 번거롭고 비효율적이라는 문제를 인식하고 대기 줄에 서서 자리를 지정받는 시스템은 많은 시간과 불편함을 초래한다고 판단했다.
그래서 우리는 뮤지컬이나 콘서트에서 흔히 볼 수 있는 티켓팅 시스템을 소규모 극장에도 도입하여 유저들에게 편의를 제공하고자 서비스를 기획했다.

우리 팀은 itcat 이라는 웹 플랫폼을 개발하여 사용자들이 인터넷을 통해 티켓을 사전에 예약하고 좌석을 선택할 수 있도록 했다. 이를 통해 대기 시간을 줄이고, 사용자들에게 더 나은 서비스를 제공할 수 있을거라고 생각했다.

이번 프로젝트를 진행하면서 우리는 사용자 중심의 서비스 개발의 중요성을 깨달았다. 초기에는 기술적인 측면에만 초점을 맞추다보니 사용자 경험 측면에서의 부족함을 경험했다. 프로젝트를 같이 진행한 팀원들과의 프로젝트는 이것이 마지막이라 부족했던 부분을 마무리하며 더 진행하길 원해 이야기를 꺼냈지만 개개인의 사정들이 있어 이 부분은 이루어지지 않았다. 다음 프로젝트를 진행하거나 한다면 이런 부분에 있어서 좀 더 신경쓰고자 한다.

개인적으로 프로젝트를 하면서 느낀점은 많았다. 팀원간의 갈등이 프로젝트를 진행함에 있어 진행속도를 현저히 느리게 만든다는 걸 깨닫게 되었고, 개개인의 의견을 잘못 받아들이거나 오해했던 부분을 풀지 못한 상태로 프로젝트를 진행하게 되면 그 갈등은 더 큰 문제를 초래할 수 있다는 것을 이번 프로젝트를 경험하면서 project leader를 하고 있던 나는 팀원들과의 원활한 커뮤니케이션과 협업이 프로젝트의 성패를 좌우하는 요소임을 몸소 깨닫게 되었다. 팀 내 갈등이 프로젝트 진행 속도를 저해하는 일은 피할 수 있었을 텐데, 반성해야겠다고 생각했다.

또한, 다음 프로젝트에서는 팀원들과의 소통을 더욱 강화하고, 갈등이 발생했을 때 적극적으로 해결하는 방법을 찾고 실천해보려 한다. 개인적으로도 프로젝트를 통해 팀원들 간의 의견을 존중하고 이를 토대로 협력하는 능력을 키워야 한다는 것을 느꼈다.

마지막으로, 프로젝트를 통해 사용자 중심의 서비스 개발의 중요성을 명확히 이해하게 되었다. 다음 프로젝트에서는 초기 단계부터 사용자 중심의 서비스라는것을 확실히 인지하고 이를 반영하여 서비스를 개선하는 것을 우선 고려할 것이다.

이번 프로젝트를 통해 많은 것을 배웠고, 앞으로의 프로젝트에서는 이러한 경험을 삶에 적용하여 더 나은 결과물을 만들어내고자 한다. 이번 프로젝트를 진행하면서 경험한 모든 것을 소중히 여기고 다음 진행하게 될 프로젝트 들에서 더욱 성장한 나를 마주했으면 한다.

개인적으로 진행하면서 개발부분에서 곤란했던 점은 트랜젝션을 구현하는 부분에서 어려움이 있었다. 직면했던 상황은

const paymentComplete = async (
  userId,
  reservationIds,
  seatIds,
  itemId,
  remainingPoint,
  totalAmount
) => {
  const resultPoint = remainingPoint - totalAmount;
  const sale = reservationIds.length;

  try {
    await appDataSource.transaction(async (transaction) => {
      await orderDao.updateUserCredit(userId, resultPoint);
      await orderDao.updateReservationStatusComplete(
        userId,
        reservationIds,
        transaction
      );
      await orderDao.updateSeatBookingStatus(seatIds, transaction);
      await orderDao.increaseItemSale(sale, itemId, transaction);
    });
  } catch (error) {
    console.error("Error in paymentComplete transaction:", error);
    throw error;
  }

  return;
};

const generateQRCodeAndUpload = async (
  reservationIds,
  userId,
  title,
  date,
  time,
  seatNames,
  s3BucketName
) => {
  try {
    const data = {
      유저아이디: userId,
      공연이름: title,
      공연날짜: date,
      공연시간: time,
      좌석번호: seatNames.map((seat) => seat.trim()).join(", "),
    };

    const dataText = JSON.stringify(data);

    const qrCodeImageBuffer = await QRCode.toBuffer(dataText);

    const combinedReservationIds = reservationIds.join("-");

    const s3UploadParams = {
      Bucket: s3BucketName,
      Key: `qrcodes/${combinedReservationIds}.png`,
      Body: qrCodeImageBuffer,
      ContentType: "image/png",
    };

    const s3UploadResult = await s3.upload(s3UploadParams).promise();

    const imageUrl = s3UploadResult.Location;

    const qrcode = await orderDao.updateReservationQRcodeUrl(
      imageUrl,
      reservationIds
    );

    return qrcode;
  } catch (error) {
    console.error("Error in generateQRCodeAndUpload:", error);
    throw error;
  }
};

module.exports = {
  addReservation,
  getReservation,
  pointCharge,
  paymentComplete,
  generateQRCodeAndUpload,
};

결제를 진행하다 예기치 못한 상황을 이유로 결제가 취소되거나 새로고침을 누르게 됐을 때 결제 상태가 결제가 된 것으로 바뀌어 있는 상태를 인지해서 appDataSource의 transaction을 사용해 유저의 point를 업데이트하고 결제상태를 업데이트 후 결제완료된 좌석의 상태를 결제가 완료된 좌석이라고 업데이트 한다. 그 후 마지막으로 공연의 티켓 개수를 업데이트 하는것으로 해결했다.

profile
🤦‍♂️

0개의 댓글