laneige clone 프로젝트 후기

JM·2020년 7월 21일
0

Project

목록 보기
11/11

laneige clone 프로젝트 소개

  • 뷰티 브랜드 laneige 웹사이트를 구현하는 프로젝트.
  • 스킨케어, 옴므 카테고리로 한정하여 구현.
  • 웹사이트 자체에 장바구니 기능이 없어 frontend 팀원분들과 상의하여 구현.

Github

Github_adidas_clone

Demo video

라네즈 데모 영상

구성원

  • Frontend 3명
  • Backend 3명

기간

200706 ~ 200717 (2주)

사용된 기술

  • Python, Django web framework
  • Beautifulsoup, Selenium
  • Bcrypt
  • JWT
  • MySQL
  • CORS headers
  • Kakao login api
  • Naver sms api
  • Git
  • Github
  • Postman
  • Aws
  • Docker

이번 프로젝트에 역할

  • Aquery tool을 이용하여 모델링 작성에 참여
  • 모델링을 통한 앱 작성 및 모델 작성
  • Mysql DB 구축
  • 크롤링을 통한 csv 파일 작성
  • Data uploader 작성
  • 회원가입, 로그인, social 로그인 endpoint 구현
  • 장바구니 기능 구현
  • SMS 기능
  • 각 기능에 대한 unittest 구현

잘한 점

  • 팀원들과 확실한 업무 분담.
  • 각 unittest에 대해 정확하게 이해하고 다양한 test를 구현.
  • 장바구니 기능을 구현.
  • 시간 분배.
  • Frontend 팀원들과 미리 데이터 형태를 정해서 주고받은 부분.

아쉬운 점

  • 주문 기능을 완성하지 못한 부분.
  • 클린 코드에 대한 생각 부족.
  • AWS, Docker에 대한 이해가 늦었던 부분.

아쉬운 점을 통해 느낀 점

  • 주문과 결제 API는 꼭 사용하겠다.
  • 코드에 대한 끝없는 리뷰가 필요하다.
  • AWS, Docker가 익숙해지도록 많이 사용해본다.

기억하고 싶은 코드/함수/로직

(1)

class KakaoView(View):
    def post(self, request):
        access_token = request.headers['Authorization']

        kakao_request = requests.get(
            'https://kapi.kakao.com/v2/user/me',
            headers = {
                "Host"          : "kapi.kakao.com",
                "Authorization" : f"Bearer {access_token}",
                "Content-type"  : "application/x-www-from-urlencoded;charset=utf-8"
            }
        ,timeout = 2)
        
        kakao_id        = kakao_request.json().get('id')
        kakao_properties  = kakao_request.json().get('properties')
        kakao_account     = kakao_request.json().get('kakao_account')
        
        try:
            if Account.objects.filter(is_social_user = kakao_id).exists():
                user    = Account.objects.get(is_social_user = kakao_id)
                token   = jwt.encode({'user_id' : user.id }, SECRET_KEY, algorithm = ALGORITHM)
                return JsonResponse({"access_token":token.decode('utf-8')}, status = 200)

            else:
                Account(
                    is_social_user         = kakao_id,
                    gender                 = Gender.objects.get(name=kakao_account['gender']),
                    user_email             = kakao_account['email'],
                    name                   = kakao_properties['nickname'],
                    birthdate              = kakao_account['birthday']
                ).save()

                user    = Account.objects.get(is_social_user = kakao_id)
                token   = jwt.encode({'user_id' : user.id }, SECRET_KEY, algorithm = ALGORITHM)
                return JsonResponse({"access_token":token.decode('utf-8')}, status = 200)
                
        except KeyError:
            return JsonResponse({"message":"INVALID_KEYS"}, status = 400)
  • 처음으로 외부 REST API를 사용해보았다.
  • 외부 서버와 이러한 방식으로도 정보를 전달하고 요청할 수 있다는 점을 배웠다.
  • 다음에는 다른 REST API나 다른 방식의 API를 사용해보고 싶다.

(2)

class KakaoLoginTest(TestCase):
    def setUp(self):
        Gender(
            id =1,
            name = "male"
            ).save()
        
        Account(
            name            = "홍길동",
            password        = bcrypt.hashpw('p1234'.encode('utf-8'), bcrypt.gensalt()).decode('utf-8'),
            birthdate       = "19880705",
            gender          = Gender.objects.get(name="male"),
            phone_number    = "01012345678",
            user_email      = "test@gmail.com"
        ).save()
    
    @patch('account.views.requests')
    def test_kakao_signin_success(self, mocked_request):
        class FakeResponse:
            def json(self):
                return {
                    "id"            : 12345,
                    "properties"    : {"nickname": "test_user"},
                    "kakao_account" : {"email":"test@gmail.com","gender":"male","birthday":"18000908"}
                }
        mocked_request.get = MagicMock(return_value = FakeResponse())
        
        client = Client()
        header = {'HTTP_Authorization':'fake_token.1234'}
        response = client.post('/account/kakao-login', content_type='applications/json', **header)
        self.assertEqual(response.status_code, 200)
        
    @patch('account.views.requests')
    def test_kakao_signin_keyerror(self, mocked_request):
        class FakeResponse:
            def json(self):
                return {
                    "id" : 12345,
                    "properties"    : {"username": "test_user"},
                    "kakao_account" : {"email":"test@gmail.com","gender":"male","birthday":"18000908"}
                }
        mocked_request.get = MagicMock(return_value = FakeResponse())
        
        client = Client()
        header = {'HTTP_Authorization':'fake_token.1234'}
        response = client.post('/account/kakao-login', content_type='applications/json', **header)
        self.assertEqual(response.status_code, 400)

if __name__ == '__main__':
    unittest.main()
  • account app의 tests.py 코드이다.
  • social_login 기능에 대한 unittest 부분이다.
  • 이번 프로젝트를 통해 unittest를 알게 되고 처음 구현해봤는데 처음에 정말 어렵게 다가왔다.
  • 지난 프로젝트에서 예외 처리를 하는 것에 필요성을 느꼈다면, 이번 라네즈 프로젝트를 통해 예외 처리를 unittest를 통해 미연에 방지하는 것이 얼마나 중요한지 배우게 되었다.

0개의 댓글