안녕하세요!
위코드 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차 리팩토링을 할 예정이에요 :)
'Project' 카테고리의 다른 글
[Pre-Onboarding] 8percent 회고록 (0) | 2021.11.14 |
---|---|
[Pre-Onboarding] 원티드랩 회고록 (0) | 2021.11.10 |
[Wecode] 밀리의서재 <내일채움공책> 회고록 (0) | 2021.10.01 |
[Wecode] 라코스테 <Lafesta> 회고록 (0) | 2021.09.27 |