[크래프톤 정글 3기] 2/5(월) TIL

ClassBinu·2024년 2월 5일
0

크래프톤 정글 3기 TIL

목록 보기
107/120

스토리파이 오늘 밤에 1차 배포 목표로 달려 봄!

버그

'좋아요' 동시성

  1. 현재 책에 대한 '좋아요'는 배열로 관리 중
  2. 근데 '좋아요순'으로 정렬하려면 좋아요 개수가 Number로 저장되어 있어야 함.
  3. 필드 추가함.
  4. 이 경우 좋아요 배열에 userId가 추가되는 경우 likesCount로 +1이 되는 구조
  5. 하나의 책에 여러 '좋아요' 요청이 오는 경우 동시성 문제가 발생할 수 있음.
  async addLike(userId: string, bookId: string) {
    try {
      const book = await this.findBookById(bookId);
      if (!book) {
        throw new NotFoundException('Book not found');
      }
      if (!book.likes.includes(new Types.ObjectId(userId))) {
        book.likes.push(new Types.ObjectId(userId));
        book.likesCount = book.likes.length; // Increment likesCount

        return await this.updateBookLike(bookId, book);
      } else {
        throw new BadRequestException('You already liked this book');
      }
    } catch (error) {
      Logger.error(`addLike 실패: ${error.message}`);
      throw new Error(`좋아요 실패했습니다. 다시 시도해 주세요.`);
    }
  }
  1. 이를 해결하기 위해 몽고DB 원자적 연산으로 해결 가능
    (추후 팀원과 협의해서 리팩토링 예정)
async addLike(userId: string, bookId: string) {
  try {
    // ObjectId 검증
    if (!Types.ObjectId.isValid(userId) || !Types.ObjectId.isValid(bookId)) {
      throw new BadRequestException('Invalid ID format');
    }

    const updateResult = await this.bookModel.findOneAndUpdate(
      {
        _id: bookId,
        likes: { $ne: userId }, // 사용자 ID가 likes 배열에 없는 경우에만 업데이트
      },
      {
        $push: { likes: userId }, // likes 배열에 사용자 ID 추가
        $inc: { likesCount: 1 }, // likesCount 1 증가
      },
      { new: true }
    );

    if (!updateResult) {
      throw new NotFoundException('Book not found or user already liked');
    }

    return updateResult;
  } catch (error) {
    Logger.error(`addLike 실패: ${error.message}`);
    throw new Error(`좋아요 실패했습니다. 다시 시도해 주세요.`);
  }
}

fly.io 에러

간헐적이라기에는 fly.io에서 꽤 높은 빈도로 연결 refuse 에러가 발생.
일시적 오류인 줄 알았는데, 요청 대기는 0.0.0.0:3000에서 받지 않고 있어서 계속 오류가 발생하는 것 같음.

nest.js에서 연결 포트만 지정하지 않고 호스트도 함께 지정해서 해결 시도.

  await app.listen(3000, '0.0.0.0');

근데 nest는 호스트를 지정하지 않으면 기본적으로 0.0.0.0 과 :: 로 된다고 하는데 왜 0.0.0.0:3000 연결 거절 에러가 뜰까?

이 문제가 아니었음.

telegram

임시로 이벤트 수신을 위해 telegram bot 연동

https://www.npmjs.com/package/node-telegram-bot-api

성공함

nest js

telegram 모듈은 전역으로 모든 모듈에서 사용됨.
따라서 모듈마다 추가하지 않고 전역 모듈로 설정.

이렇게 하면 별도 import를 하지 않아도 됨.
단, providers에는 service를 기입해야지 의존성 주입 가능

// 글로벌 데코레이터
@Global()
@Module({
  controllers: [TelegramController],
  providers: [TelegramService],
})
export class TelegramModule {}

0개의 댓글