Open jyh7a opened 3 months ago
트렐로 프로젝트 수고많으셨습니다.
Readme, ppt 작성이 힘들었다고 하였는데 확인해보니 너무잘 만들어서 정말 열심히 작성하신거 같습니다. 트러블 슈팅과정이나 핵심적인 기술에 조금더 다른 기능 설명이 추가되면 좋을거 같습니다. 예) 이메일 인증시 redis를 이용한 만료시간 로직 설명
아래는 프로젝트 피드백입니다.
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분 후 만료
https://github.com/KwangSoo1555/sparta-6th-week-trello-project/blob/e359b77edb7fe9853928f36b8dccc63b73be925c/src/modules/board/board.service.ts#L47-L53 현재 checkMemberRole메서드로 role체크를 적절하게 하고 있습니다. 다만 checkMemberRole가 members서비스에도 같은 로직이 반복적으로 사용되고 있습니다. 이를 해결하기 위해서
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'], });
결국 만료시간을 갱신하거나 새로 다운로드 URL을 만드는 메서드가 필요합니다. https://github.com/KwangSoo1555/sparta-6th-week-trello-project/blob/e359b77edb7fe9853928f36b8dccc63b73be925c/src/modules/file/file.service.ts#L33-L35
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}`); } }
전체적으로 많은 기능을 잘 구현 하였습니다. 앞에 언급한 이슈들을 해결하고
트렐로 프로젝트 수고많으셨습니다.
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메서드를 만들어서 각가의 키에대한 시간을 체크하지 않아도 됩니다.
예)
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서비스에도 같은 로직이 반복적으로 사용되고 있습니다. 이를 해결하기 위해서
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옵션을 이용해서 쿼리를 최적화 해주세요.
예)
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
예)
5. 나머지 기능 구형
전체적으로 많은 기능을 잘 구현 하였습니다. 앞에 언급한 이슈들을 해결하고