본문 바로가기

인턴 프로젝트

미니 요기요 프로젝트(1) - 카테고리

기획 의도, 화면, 코드, 테스트 코드, 어려웠던 점, 해결방법, 느낀점 등을 설명한다.

 

1. 카테고리

  • 기획 의도
    • 요기요 카테고리랑 비스무리하게 만드는 것이 목표
  • 화면

홈 화면의 카테고리 리스트

  • 코드

config 디렉토리의 urls.py에 path('home/', home, name='home'),가 있다. 이 경로로 접속하면 홈 화면이 켜지고 path('api/category/', include('category.api.urls')), 이 경로가 호출된다. 카테고리 api 디렉토리에는 역시 urls.py가 있고 이 안에는 위 경로가 호출될 때 호출되는 클래스 뷰가 있다. 클래스 기반 뷰를 함수로 호출한다. views.CategoryListAPIView.as_view(), 이렇게.

class CategoryListAPIView(View):
    def get(self, request, *args, **kwargs):
        category_list = Category.objects.all().values('pk', 'name', 'img')
        if request.user.is_authenticated:
            json_data = {
                'category_list': list(category_list),
                'user_addr': request.user.address,
            }
        else:
            json_data = {
                'category_list': list(category_list),
            }
        return HttpResponse(
            json.dumps(json_data),
            content_type='application/json'
        )

카테고리 리스트를 읽는 부분이므로 get함수를 사용한다. 홈 화면에는 모든 카테고리를 보여줘야 하기 때문에 ORM에서 all() 함수를 사용한다. 그리고 필요한 필드인 pk, name, img를 선택한다. 응답값은 json 직렬화를 해서 이 api를 호출한 ajax로 보낸다.

  • 테스트 코드
class CategoryTestClass(TestCase):
    def test_home_page_should_be_opened_on_request(self):
        # Given
        url = reverse("home")
        # When
        response = self.client.get(url)
        # Then
        self.assertEqual(response.status_code, HTTPStatus.OK)

    def test_category_should_be_shown_on_request(self):
        # Given
        url = reverse("category_api:category_list_api")
        # When
        response = self.client.get(url)
        # Then
        self.assertEqual(response.status_code, HTTPStatus.OK)

단순히 홈화면과 요청한 카테고리 리스트 api가 응답 성공인지 확인하는 테스트다.

  • 어려웠던 점
    • 저 테스트 코드 짜는 것도 힘들었다.. 뭐가 뭔지 몰랐어서..
    • ORM 작성과 직렬화에 대한 개념이 없었다.
  • 해결 방법
    • 다른 분이 짠거 참고했고, 뭘 테스트해야 하는 지 명확히 했다. 결국 홈 화면이 잘 나오는가? 그리고 api 호출이 성공했는가?에 대해서 테스트했다.
    • 맥북에서 주피터 노트북 켜놓고 계속 ORM 연습했다. 자료구조가 Queryset인 것을 list()로 list화하고 json.dumps로 문자화된 json 객체를 만들거나 JSONResponse()을 써서 처리했다.
  • 느낀점
    • 아주 초기에 짠 코드라 단순하다.
    • 반복하는 게 중요하다.