Wecode|二次プロジェクトの最後の回顧

35699 ワード

サブプロジェクトのレビュー


振り返るとは、過去を振り返り、過去を振り返ることです.
そのため、プロジェクトでの感想やアイデアが発見される前に、できるだけ早く記録することが重要です.
以上のコードでできる最後の二次プロジェクトはすべて完了しました.こんなに速く???最後のプロジェクトを終えて、残念でうれしくて、百感が交錯しました.こんなに早く2回のプロジェクトを終えて、企業協力をして、できますか?最初のプロジェクトを始めたばかりのような感じで、最初は迷いますが、最終的には適応してできますか?このような自信を持っています.
要するに、本題に戻り、2番目の項目は에어비앤비をテーマとして項目を行う.

Groundbnbプレゼンテーションビデオリンク

🕺🏿✈️Team Groundbnb

  • Frontend:白珍秀、朴賢燦
  • Backend:劉炳健、黄福実、韓成峰(私)

  • Groundbnb backend github link
  • テクノロジーの使用

  • Front-End : React.js , StyledComponent , HTML , JavaScript
  • Back-end : Python , Django web framework , MySQL , Bcrypt , JWT , Redis
  • common : AWS(EC2, RDS, S3, Docker) , RESTful API
  • コラボレーションツール

  • Github
  • TrelloGroundbnb Trello link
  • AQuerytool
  • Postman
  • プロジェクトをするときの感想


    共通

  • 잘한점最初のプロジェクトの欠点を補うために努力し、チームメンバーとコミュニケーションし、合意の内容を記録します.毎日会議の記録にStand Up Meetingの内容が記録されているので、互いに混同することはなく、APIドキュメントとチームメンバーの間で共有すべき内容がすべて記録されているので、同じ内容を聞くことはありません.
  • 아쉬운점多くの機能に挑戦しようとします.最終的には完了したが、締め切り日までにすぐに機能を実現し、最終リリース日までに機能実装部分のチェックを継続した.スリル満点の発表でしたが、開発企画を行うにあたり、なるべく控えめにスケジュールを組むべきだと思います.
  • バックエンド

  • 잘한점最初の種目では、コミュニケーションが良かったのですが、キャプテンの欠席は残念だと思います.キャプテンが1人いればいいと思っていたのですが、2回目の時にリーダーを務めた方が1人いました.明らかな長所と短所があり、大きなプロジェクトには必ずリーダーシップがあると思います.コミュニケーションがうまくいっても、最終的な決定に責任を負う人がいないという良い考えが隠されているのは残念だ.そのため、2回目のプロジェクトでは、さまざまな意見を集め、果敢に実施することで、作業を少し速めることができます.
  • 아쉬운점今回も残念だったのが造形部分Air(初三適用)は機能が豊富で、モデリングがどんなに慎重であっても、実施中に何度も修正されています.最初のモデリングは100%完璧ではありませんが、設計過程で柔軟に修正できるように、いくつかの案を考慮して設計すべきだと思います.遠くて危険なモデリングの道...プロジェクト期間中にやることがたくさんあったので、絶対的な時間が短かったので、今回のプロジェクトではソーシャルログイン以外に特別な機能が追加されなかったのが残念です.
  • プライベート

  • 잘한점今回はソーシャルログイン部を担当していますが、実際にバックエンド部では、クライアントサーバからソーシャルログインを提供しているサーバからEXタグを受信するのではなく、EXタグを受信しているサーバから機能を取得して実施すればよいのですが、私が前にソーシャルログインサービスを提供しているサーバから認証を取得する過程は?自分のコンセプトを知りたくて、全部自分でやりました.一つの機能のために、最初から概念を理解しようと努力しています.これで、この部分に自信がついて、自信を持って他の人に説明することができて、過程も私を喜ばせました.
  • 아쉬운점上の良い点が残念になりました.前のすべての概念を勉強したので、長い時間がかかりました.だから一つの機能に時間がかかりすぎて、他の機能に時間をかけられなかったのは残念です.心は煙突のようで、他の機能をすべて試したいのですが、締め切りが近づいていて、完成できませんでした.しかし、プロジェクトが終わっても、後で梱包し直したり、他の機能を追加したりできるので、あまり悲しくはありません.
  • プロジェクトの収穫をする。


    このプロジェクトに新しいスキルを適用しようとする時間です.Django-RedisAWSDockerなどの新技術を使用して、あなたの感じは:これはどんな技術なのか、概念を聞くだけでは理解しにくいが、何であれ、善誘に従えばできる.どんな技術に出会っても、今回の経験で学んだ問題解決能力で問題を解決する自信がある.もちろん、学習段階では、応用がスムーズになる確率が高く、今の仕事ではさらに困難になりますが、このような積極的に問題を解決する態度を通じて、きっと良い結果が得られると思います.

    使用するテクノロジースタックの感じ


    Redis

    私が実施した機能


  • ソーシャルログイン:kakaoGoogle,ログアウト

  • デコレーション
  • 소셜 로그인 구현 코드
  • import json, jwt, requests
    
    from django.views     import View
    from django.http      import JsonResponse
    
    from groundbnb.settings.local import LOCAL_SECRET_KEY, ALGORITHM
    from users.models             import User, SocialFlatform
    
    class KakaoAPI:
        def __init__(self, token):
            self.token = token
        
        def get_kakao_user(self):
            kakao_userinfo_url = "https://kapi.kakao.com/v2/user/me"
            headers            = {"Authorization" : f"Bearer {self.token}"}
            
            response = requests.get(kakao_userinfo_url, headers = headers, timeout=1000) 
            
            if response.status_code != 200:
                return JsonResponse({'MESSAGE' : 'RESPONSE_ERROR'}, status=400)
    
            return response.json()
    
        def request_kakao_logout(self):
            kakao_logout_url = 'https://kapi.kakao.com/v1/user/logout'
            headers          = {"Authorization" : f"Bearer {self.token}"}
    
            response = requests.get(kakao_logout_url, headers = headers, timeout=1000)
    
            if response.status_code != 200:
                return JsonResponse({'MESSAGE' : 'RESPONSE_ERROR'}, status=400)
            
            return response.json()
    
    class GoogleAPI:
        def __init__(self, token):
            self.token = token
    
        def get_google_user(self):
            google_userinfo_url = 'https://www.googleapis.com/oauth2/v2/userinfo?access_token='
            response            = requests.get(f'{google_userinfo_url}{self.token}')
    
            if response.status_code != 200:
                return JsonResponse({'MESSAGE' : 'RESPONSE_ERROR'}, status=400)
                
            return response.json()
    
    class KakaoLoginView(View):
        def get(self, request):
            try:
                access_token = request.headers.get('Authorization')
    
                if not access_token:
                    return JsonResponse({'MESSAGE': 'TOKEN REQUIRED'}, status=400)
    
                kakao_api  = KakaoAPI(access_token)            
                kakao_user = kakao_api.get_kakao_user()
                
                user, created = User.objects.get_or_create(socialflatform__provider_id=kakao_user["id"])
    
                if created:
                    user.name  = kakao_user["kakao_account"]["profile"]["nickname"]
                    user.email = kakao_user["kakao_account"]["email"]
                    user.save()
                    
                    SocialFlatform.objects.create(
                        provider_name = 'kakao',
                        provider_id   = kakao_user["id"], 
                        profile_image = kakao_user["kakao_account"]["profile"]["profile_image_url"],
                        nick_name     = kakao_user["kakao_account"]["profile"]["nickname"],
                        user          = user
                    )
                
                access_token = jwt.encode({'id' : user.id, 'is_host' : user.host}, LOCAL_SECRET_KEY, algorithm=ALGORITHM)
    
                return JsonResponse({'access_token': access_token}, status=200)
    
            except KeyError:
                return JsonResponse({'MESSAGE': 'KEY_ERROR'}, status=400)     
    
    class KakaoLogoutView(View):
        def post(self, request):
            access_token = request.headers.get('Authorization')
            kakao_user   = KakaoAPI(access_token)
            user_logout  = kakao_user.request_kakao_logout()
            
            return JsonResponse({'access_logout' : user_logout}, status=200)
    
    class GoogleLoginView(View):
        def get(self, request):
            try:
                access_token = request.headers.get('Authorization')
    
                if not access_token:
                    return JsonResponse({'MESSAGE': 'TOKEN REQUIRED'}, status=400)
                
                google_login_api = GoogleAPI(access_token)
                google_user_info = google_login_api.get_google_user()
    
                user, created = User.objects.get_or_create(socialflatform__provider_id=google_user_info["id"])
    
                if created:
                    user.name  = ''
                    user.email = google_user_info['email']
                    user.save()
    
                    SocialFlatform.objects.create(
                        provider_name = 'google',
                        provider_id   = google_user_info['id'],
                        profile_image = google_user_info['picture'],
                        nick_name     = '',
                        user          = user
                    )
    
                access_token = jwt.encode({'id' : user.id, 'is_host' : user.host}, LOCAL_SECRET_KEY, algorithm=ALGORITHM)
    
                return JsonResponse({'access_token': access_token}, status=200)
    
            except KeyError:
                return JsonResponse({'MESSAGE': 'KEY_ERROR'}, status=400)
    最初に実装されたコードは削除してアップロードすることはできませんが、これは再パッケージされたコードです.当初,ソーシャルログインAPI情報を受信する論理を直接ログインクラスに反映していたが,指導者のフィードバック後,APIのみを受信する論理自体をクラスから除外した.これにより,コードがより毒性になり,API情報を受信する論理がわからなくても,モジュールのように導入すれば利用できる.
  • ソーシャルログイン機能による学習
  • ## 카카오서버에서 인가 코드 발행 로직
    class KaKaoSignInView(View):
        def get(self, request):
            REST_API_KEY = "MY_REST_API_KEY"
            ## 카카오 애플리케이션에서 설졍한 Redirect_uri
            REDIRECT_URI = "http://localhost:8000/users/signin/kakao/callback"
    
            API_HOST = f'https://kauth.kakao.com/oauth/authorize?response_type=code&client_id={REST_API_KEY}&redirect_uri={REDIRECT_URI}'
    
            return redirect(API_HOST)
    
    ## 카카오서버에서 받은 인가 코드로 토큰/리프레쉬 토큰 발행 로직
    class KakaoSignInCallbackView(View):
        def get(self, request):
            auth_code       = request.GET.get('code')
            kakao_token_api = 'https://kauth.kakao.com/oauth/token' # 토큰 발행받는 URL
            
            params = {
                'grant_type'      : 'authorization_code',
                'client_id'       : 'my_client_id',
                'redirection_uri' : 'http://localhost:8000/users/signin/kakao/callback',
                'code'            : auth_code,
            }
    
            token_response = requests.post(kakao_token_api, params=params)
            
            return JsonResponse({"token" : token_response.json()})
    
    ## 카카오 서버에서 유저 정보 받아오는 로직
    class KakaoSignInCallbackView(View):
        def get(self, request):
            auth_code       = request.GET.get('code')
            kakao_token_api = 'https://kauth.kakao.com/oauth/token' 
            
            params = {
                'grant_type'      : 'authorization_code',
                'client_id'       : 'my_client_id',
                'redirection_uri' : 'http://localhost:8000/users/signin/kakao/callback',
                'code'            : auth_code,
            }
    
            token_response     = requests.post(kakao_token_api, params=params)
            access_token       = token_response.json().get('access_token')
            user_info_response = requests.get('https://kapi.kakao.com/v2/user/me', headers={"Authorization": f'Bearer ${access_token}'})
            
            return JsonResponse({"user_info" : user_info_response.json()})
    ソーシャルログイン機能により、上記の手順はフロントエンドで実施され、KACAサーバから出口トークンを取得し、そのトークンをバックエンドに転送し、バックエンドでその論理を実現すればよいが、ソーシャルログインの全体的なメカニズムを理解し、クライアントサーバがKACAサーバからトークンを取得する必要があるのだろうか.自ら実現した.上記のコードを実装して知った内容は、ソーシャルログインをより詳細に紹介し、レビューします.本当にすべて体現していると簡単に見えますが、これをするのに1週間かかったようです.初めてなので、知らないことが多すぎます.ううう

    プロジェクトの感想


    2つ目のプロジェクトも急いで行われた.チームプロジェクトはいつもおもしろいようです.一緒に何かを創造する楽しさが、このような状況で、私が努力して創造したものが応用され、助けられました.これからも私の実力が発展して、チームのためにもっとすばらしい、もっと必要なウェブサイトを創造することを望んでいます.