본문 바로가기

Project

[Wecode] 밀리의서재 <내일채움공책> 1차 리팩토링

안녕하세요!

위코드 2차 프로젝트로 "내일채움공책" 프로젝트를 열심히 했지만...!!!

부족한 부분도 많았어서 조금씩 계속 수정을 해보면서 리팩토링을 할 예정입니다!

 

1. views.py에 작성한 코드에서 조금 더 간결하게 처리할 수 있는 부분이 없을까에 대한 고민을 해봤습니다.

2. 컨벤션 & 에러코드 등 놓친 부분들이 있어서 같이 수정을 했습니다.

 

아래는 같이 읽어보면 좋은 포스팅이에요.

<내일채움공책> 프로젝트 보러 가기

<리팩토링에서 적용된 기술(distinct & value_list) 보러 가기>

 

 

1차 리팩토링 을 시작합니다!!

 


 

 

 

▶ 기능 : 해당 도서를 서재에 담고 있는 유저의 프로필을 반환

 

▶  로직

1. librarybook 테이블에서 책의 아이디값 같은 것 필터링
2. library_id 값을 중복 없이 뽑기
3. 서재(유저)의 수 카운트
4. 서재의 유저 프로필 찾기

 

▶ 리팩토링 내용 : 중복 제거할 때 distinct()를 사용하여 코드 간결화

 

class LibraryListView(View):
    def get(self, request, book_id):
        librarybooks = LibraryBook.objects.filter(book_id=book_id)
        libraries    = librarybooks.values_list('library_id', flat=True).distinct()

        results = []
        results.append({"total_libraries_count" : len(libraries)})

        for library in libraries:
            users = Library.objects.get(id=library).user_id
            user  = User.objects.get(id=users)

            results.append({
                "user_nickname" : user.nickname,
                "user_url"      : user.profile_image_url
            })
        return JsonResponse({"results": results}, status=200)

 

 


 

 

▶ 기능 : 전체 도서에 대하여 책 상세 내용 조회

 

▶ 리팩토링 내용 : 중복 제거할 때 distinct()를 사용하여 코드 간결화, 에러코드 수정(잘못된 요청-400)

 

class LibraryView(View):
    @login_decorator
    def get(self, request):
        try:                
            user         = User.objects.get(id=request.user.id)                    
            user_library = Library.objects.get(user_id=request.user.id)
            totalbooks   = user_library.librarybook_set.all()
            books = totalbooks.values_list('book_id', flat=True).distinct()

            totalbook_list = []

            for book in books:
                favorite     = LibraryBook.objects.filter(book_id=book).values_list('book_id', flat=True).distinct().values()[0]['favorite']
                book         = Book.objects.get(id=book)
                bookauthor   = book.bookauthor_set.all().values()[0]['author_id']
                author       = Author.objects.get(id=bookauthor).name
                publisher    = Publisher.objects.get(id=book.publisher_id).name

                ...
            
            results = [{
                "user_nickname"   : user.nickname,
                "user_image"      : user.profile_image_url,
                "user_totalbooks" : totalbook_list,
            }]
            return JsonResponse({"results": results}, status=200)
            
        except KeyError:
            return JsonResponse({"MESSAGE": "KEY ERROR"}, status=400)

        except User.DoesNotExist:
            return JsonResponse({"MESSAGE": "User Does Not Exists"}, status=400)

추가로는 컨벤션을 맞춰주고 마무리했습니다.

 

다음에는 유닛 테스트로 2차 리팩토링을 할 예정이에요  :)