KwangSoo1555 / sparta-6th-week-trello-project

0 stars 2 forks source link

트렐로 프로젝트 피드백 - 정영훈 튜터 #127

Open jyh7a opened 3 months ago

jyh7a commented 3 months ago

트렐로 프로젝트 수고많으셨습니다.

Readme, ppt 작성이 힘들었다고 하였는데 확인해보니 너무잘 만들어서 정말 열심히 작성하신거 같습니다. 트러블 슈팅과정이나 핵심적인 기술에 조금더 다른 기능 설명이 추가되면 좋을거 같습니다. 예) 이메일 인증시 redis를 이용한 만료시간 로직 설명

아래는 프로젝트 피드백입니다.


1. Redis TTL(Time To Live)사용

https://github.com/KwangSoo1555/sparta-6th-week-trello-project/blob/e359b77edb7fe9853928f36b8dccc63b73be925c/src/modules/auth/email/email-verification.service.ts#L61 redis를 이용해서 랜덤 코드를 발송하고 인증하는 기능을 잘 만들었습니다. isExpired메서드를 통해서 만료시간을 체크하는 로직도 잘 만들어서 사용했습니다. 이 방식 말고도 Reids에서 TTL기능 즉 키에대한 만료 시간을 설정하여서 5분이 지난 메일은 키를 삭제해서 구현할 수 있습니다. 이렇게 하면 굳이 isExpired메서드를 만들어서 각가의 키에대한 시간을 체크하지 않아도 됩니다.

예)

await this.redisClient.set(email, verificationToken, 'EX', 5 * 60 ); // 5분 후 만료




2. checkMemberRole 중복 수정

https://github.com/KwangSoo1555/sparta-6th-week-trello-project/blob/e359b77edb7fe9853928f36b8dccc63b73be925c/src/modules/board/board.service.ts#L47-L53 현재 checkMemberRole메서드로 role체크를 적절하게 하고 있습니다. 다만 checkMemberRole가 members서비스에도 같은 로직이 반복적으로 사용되고 있습니다. 이를 해결하기 위해서

  1. RoleService를 만들어서 하나의 공통 메서드로 관리(중복 제거)
  2. Roles데코레이터와 RolesGuard를 사용해서 간편하게 role확인. 이 방식으로 구현하게되면 코드 재사용성이 올라가고, role확인을 더욱 간결하게 할 수 있습니다.




3. findBoards 쿼리 최적화

https://github.com/KwangSoo1555/sparta-6th-week-trello-project/blob/e359b77edb7fe9853928f36b8dccc63b73be925c/src/modules/board/board.service.ts#L148-L150 보드를 찾고 보드에 속한 리스트, 카드를 찾아서 잘 return하고 있지만 쿼리 최적화가 되어 있지않아서 서버성능에 부담이 될 수 있습니다. 일반적으로 board, list, card는 각각 1:N으려 연관관계가 맺어져 있으니 이를 사용해서 쿼리 한번에 board에 속한 모든 정보를 가져오게 만들면 쿼리 성능을 높일 수 있습니다.(여러번 조회 하는것은 성능적으로 좋지 않습니다.)

아래 예시처럼 reloatins옵션을 이용해서 쿼리를 최적화 해주세요.

예)

  const board = await this.boardRepository.findOne({
    where: { id: boardId },
    relations: ['lists', 'lists.cards'],
  });




4. file.service 수정

4.1. uploadFile로 파일을 올린후 preSignedUrl을 1시간동안 설정하여서 1시간 동안 파일 다운로드가 가능하지만 1시간 이후에 다시 파일을 받을 수 없습니다.

결국 만료시간을 갱신하거나 새로 다운로드 URL을 만드는 메서드가 필요합니다. https://github.com/KwangSoo1555/sparta-6th-week-trello-project/blob/e359b77edb7fe9853928f36b8dccc63b73be925c/src/modules/file/file.service.ts#L33-L35

4.2. fileDelete메서드를 통해서 db에 파일을 지우는 로직은 잘 구현하였지만

S3에 저장된 파일을 삭제하는 부분이 보이지 않습니다. 아래 예시처럼 삭제하는 로직이 필요합니다. https://github.com/KwangSoo1555/sparta-6th-week-trello-project/blob/e359b77edb7fe9853928f36b8dccc63b73be925c/src/modules/file/file.service.ts#L68-L70

예)

  async fileDelete(cardId: number, fileId: number) {
    const data = await this.fileRepository.findOne({ where: { cardId, id: fileId } });
    if (!data) {
      throw new BadRequestException(MESSAGES.FILES.NOT_EXISTS);
    }

    try {
      const deleteCommand = new DeleteObjectCommand({
        Bucket: this.configService.get("AWS_BUCKET"),
        Key: data.fileUrl,
      });

      await this.s3.send(deleteCommand);
      await this.fileRepository.delete(data.id);
    } catch (error) {
      throw new BadRequestException(`File deletion failed: ${error.message}`);
    }
  }




5. 나머지 기능 구형

전체적으로 많은 기능을 잘 구현 하였습니다. 앞에 언급한 이슈들을 해결하고

  1. lexorank를 이용한 카드, list 순서 변경
  2. 테스트 코드 작성 등 기능을 작성하면 됩니다.