Giter VIP home page Giter VIP logo

akchak-nodejs-server's Introduction

akchak-nodejs-server

악착 feature

akchak

어플 체험해보기

https://play.google.com/store/apps/details?id=com.juann.akchak

API Document 보기

https://akchak.com/api/docs/


프로젝트 소개

많은 사람들이 악기 연습을 할 때 여러 가지 이유로 어려움을 겪습니다. 악기를 연습해도 실력이 빠르게 늘지 않거나, 혼자 연습하느라 지루하고 동기부여가 될만한 자극이 부족할 때도 있습니다. 이런 문제들을 해소하기 위해 제작한 앱이 '악착'입니다.

'악착'은 시작할 때 목표를 정하도록 합니다. 정할 수 있는 목표의 종류는 음악과 교본이 있습니다. 연습할 목표를 정하고나면 본격적으로 연습을 시작할 수 있습니다.

연습을 시작하면 '악착'이 카메라를 통해서 사용자의 모습을 녹화하게 됩니다. 악기를 연습할 때 자기의 연주를 녹화해서 모니터링하는 것은 정말 중요합니다. 카메라로 녹화된 영상에서는 자신의 연주 자세나 박자나 소리에 어떤 문제가 있는지 알 수 있게 됩니다. 하지만 많은 사람들이 귀찮다는 이유로 하지 않고 있습니다. '악착'을 통해서 자신의 연주를 녹화해서 내 실력을 점검할 수 있습니다.

연습을 끝내면 '악착'에서는 다른 사용자들과 자신의 연주 영상을 공유할 수 있도록 영상 자르기 기능을 제공합니다. 별도의 툴 없이 영상에서 잘 연주했다고 생각한 부분만 잘라서 영상을 업로드할 수 있습니다. 손쉽게 섬네일 제작할 수 있는 기능도 제공합니다.

영상 업로드를 완료하면 자신의 연습 시간이 업데이트 되며, 프로필 화면에서 주간 평균 연습 시간과 함께 연습 시간을 차트로 확인할 수 있습니다. 다른 사람들의 연주영상을 홈화면에서 조회할 수 있습니다. 다른 사람들의 연습하는 모습을 보면서 자극을 받을 수 있습니다.

기술스택

  • typescript
  • nodejs
  • mysql

서버

  • express

클라우드

  • aws

CI

  • github

주요 패키지

  • bcryptjs
  • datefns
  • express-validator
  • http-status-codes
  • jsonwebtoken
  • nodemailer
  • sequelize
  • swagger-jsdoc

ERD

akchak-erd

infrastructure

악착 인프라

구현한 기능

  • Mysql event scheduler를 이용해서 테이블 내 이래 조건에 해당되는 row 삭제

    • 유저가 회원가입한 이후 12 시간 이내에 이메일 인증하지 않을 경우
    화면 캡처 2022-05-19 140659
    • refresh token이 30일 동안 사용되지 않았을 경우
    화면 캡처 2022-05-19 140659
    • 인증코드 발급된지 5분이 지났을 때
    화면 캡처 2022-05-19 140659
  • 한글 텍스트 입력 및 조회가 가능하도록 sequelize.js와 aws rds 환경에 charset: utf8, collate: utf8_general_cli 적용

  • 삭제되는 데이터를 참조하는 다른 데이터들도 자동으로 삭제되도록 cascade 적용

  • elastic beanstalk로 배포 환경 구축

화면 캡처 2022-05-19 140659

  • aws route53 사용하여 akchak.com 도메인 주소를 사용하여 aws elasticbeanstalk 환경에 routing 되도록 함.

화면 캡처 2022-05-19 140659

  • aws acm을 이용해서 akchak.com에 ssl 적용해서 https 통신이 가능하도록 함.

  • aws api gateway를 이용해서 aws lambda function 사용

  • 동영상, 섬네일 업로드는 aws lambda function에서 presigned url을 통해 처리하여 server 부담을 덜어냄.

  • api 문서를 조회할 수 있도록 swagger-jsdoc과 swagger-ui-express 사용

화면 캡처 2022-05-19 140659

  • 회원가입할 때 유저가 입력한 이메일로 인증코드 보낼 수 있도록 nodemailer 사용

화면 캡처 2022-05-19 140659

  • sequelize를 이용한 마이그레이션과 데이터 모델링 구현
  • express-validator를 middleware로 사용하여 http(s) request input type 검사
    • input validation 통과하면 http request를 controller로 보냄
    • input validation 에서 type error 발생하면 status code 400 (BAD REQUEST) response를 client로 보냄
  • date-fns 를 이용해서 데이터베이스에 utc 기준으로 저장되어 있는 datetime을 client의 timezone을 기준으로 제공할 수 있도록 함
  • http-status-codes 를 이용해서 코드의 가독성을 높임
  • bcryptjs를 이용해서 비밀번호를 hashing하여 데이터베이스에 저장
  • jsonwebtoken을 이용해서 user authentication 구현
    • 보안을 위해서 access token의 유효 사용기간이 짧을 수록 좋기 때문에 4시간 뒤에 expire 되도록함
    • 1달 이내에 앱에 접속한 사용자는 로그인이 유지되도록 refresh token이 30일 뒤에 expire 되도록함
    • refresh token의 expire time이 너무 길면 보안에 안좋은 것을 고려해서 access token이 바뀔 때마다 refresh token도 바뀌도록 함

구현해야하는 기능

  • tdd
    • 이유 : 해당 프로젝트를 진행하면서 코드를 수정할 때마다 서버가 정상적으로 기능하는지 매번 테스트하느라 시간을 많이 써야했다. tdd를 통해서 매번 테스트를 해야하는 부담을 덜어낼 수 있을 것으로 생각한다.
  • aws cloudfront를 이용한 동영상 스트리밍 구현
    • 이유 : 현재 aws lambda function으로 동영상 url을 받게되면 스트리밍 기능을 제공하지 않아서 영상이 다 다운로드 되기전까지 영상을 재생할 수 없다. aws cloudfront에서는 동영상 스트리밍과 함께 다양한 region에서 빠른 속도로 영상을 다운로드할 수 있고, 추가적으로 네트워크 보안 기능도 있는 것으로 확인된다.

프론트엔드 구경하기

https://github.com/dlwndks9436/akchak-react-native-app

akchak-nodejs-server's People

Contributors

dlwndks9436 avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.