1. 팀원 소개
▶ Front-end : 강연옥, 주철진, 조성환
→ https://github.com/wecode-bootcamp-korea/24-2nd-TomorrowsNotebook-frontend
▶ Back-end : 박지원, 이무현, 신우주
→ https://github.com/jiwon5304/24-2nd-TomorrowsNotebook-backendbackend
2. 프로젝트 기간
▶ 2021.09.13일(월) ~ 2021.10.01(금)
3. 사용 기술 스택
▶ Front-end : HTML, SCSS, JS, React, Styled-component
▶ Back-end : Python, Django, MySQL
4. 주요 구현 기능
▶ 기능별 구분
소셜로그인 기능 구현(데코레이터 함수)
메인 페이지 구현(다양한 카테고리로 필터링(출판사, 취향, 오늘의 책 등)
상세 페이지 구현(리뷰, 코멘트)
서재 기능 구현(전체도서 조회, 책장 별 도서 조회, 책장추가 & 삭제)
뷰어 기능 구현
▶ 페이지별 구분
소셜로그인 페이지
메인 페이지 구현
상세 페이지 구현
검색페이지
서재 페이지
뷰어 페이지
5. 나의 역할
▶ 서재 기능 구현 : 전체도서 조회 & 책장 별 도서 조회 & 책장 추가 및 삭제 & 책장에 도서 담기 기능
▶ 모델링 자료
처음에는 아래 3개의 항목을 libraries 테이블에 넣었다가 libraries 와 books 의 중간 테이블 library_books에 넣었다.
→ current_page, favorite, reading : 각 책 당 할당되어야 하는 값 & 유저마다 다르게 적용되는 값
→ book 과 libraries 중간 테이블인 library_books에 넣는게 좋다고 판단하였다!
* current_page : 뷰어로 책을 읽다가 껐을 때 그 상태페이지를 표시해주기 위한 값 ex) 10,22,30 등 int 자료형
* favorite : 즐겨찾기 상태를 표시해주기 위한 값 ex) True or False
* reading : 바로 읽기 상태를 표시해주기 위한 값 ex) True or False
▶ 코드 리뷰
[ ShelfListView ]
∨ POST : 책장에 도서 담기 기능
로그인 데코레이터 함수로 유저권한을 확인 → INPUT('shelf_id' & 'book_id')을 받아서 LibraryBook 테이블에 생성
* 에러처리
1) 책장 아이디 값이 안들어 올 때
2) 책 아이디 값이 안들어 올 때
3) 책장에 해당 책이 이미 들어있을 때
4) 키 에러(키값이 잘못들어올 때)
LibraryBook.objects.create(
book_id = book_id,
library_id = user_library.id,
shelf_id = shelf_id,
favorite = False,
reading = False,
current_page = 0,
)
[ ShelfView ]
∨ GET : 책장 별 도서 조회 기능
로그인 데코레이터 함수로 유저권한을 확인 → 유저의 닉네임, 프로필이미지, 읽고 있는 책, 즐겨찾기, 책장 별 도서 값 반환
* 에러처리
1) 존재하지 않는 유저 요청이 왔을 때
2) 키 에러(키값이 잘못들어올 때)
★ 기억에 남는 코드
항상 set을 사용해서 데이터에 접근했는데, select.related() 를 통해 데이터를 가져왔다.
훨씬 데이터 접근성이 좋았고, 다른 부분에도 적용해야겠다!
librarybooks = LibraryBook.objects.select_related('book','shelf').filter(library_id=user_library.id)
[ LibraryView ]
∨ POST : 책장 추가 기능
로그인 데코레이터 함수로 유저권한을 확인 → INPUT('shelf_name')을 받아서 Shelf 테이블에 생성
* 에러처리
1) 책장 이름 변수값이 들어오지 않을 때
2) 같은 책장 이름으로 이미 생성되어 있을 때
3) 키 에러(키값이 잘못들어올 때)
∨ GET : 전체 도서 조회 기능
로그인 데코레이터 함수로 유저권한을 확인 → 유저 닉네임, 프로필이미지, 책정보 반환(아이디, 이름, 이미지, 저자, 현재페이지, 출판일 등)
LibraryBook 테이블에 있는 모든 도서를 중복없이 가져와 도서의 데이터를 반화하는 식으로 구성!
* 에러처리
1) 키 에러(키값이 잘못들어올 때)
2) 유저가 존재하지 않을 때
+ 리팩토링 시 적용 부분!!
1. 모든 중복 제거 distinct() 사용하기
2. prefetch_related & select_related 활용해보기
3. 유닛테스트 추가하기
6. 프로젝트를 마치며
▶ 일정관리와 협업을 어떻게 하였나?
∨ 우리 팀은 매일 10시 30분쯤 Daily standup meeting을 진행하고, 프론트랑 백엔드 나눠서 추가로 미팅을 했다.
∨ TRELLO 라는 툴을 사용하여 일정을 관리했다.
저번 프로젝트에서와 같이 회의록을 작성하였고, 추가적으로 프론트와 백이 서로 알아야 하는 자료들을 공유했다.
▶ 밀리의 서재 프로젝트를 마치며
지금까지 프로젝트에서는 로그인과 회원가입 기능을 주로 맡았어서, 기능을 구현하는데 있어서 조금 어렵게 느껴졌던 것은 사실이다.
하지만, 코딩을 하면서 로직적인 부분을 많이 생각해볼 수 있는 기회였다.
사용자의 입장에서 여러가지 상황을 고려하면서 로직을 짜고 수정하는 것은 필수라는 생각이 들었고,
처음이다보니 놓친 부분들이 많아 아쉽기도 했지만, 리팩토링을 통해 여러가지를 보완해야겠다.
그리고 데일리미팅때 조금 더 현재 상황을 디테일하게 공유하도록 노력했었는데 그래서 소통을 많이 하고 있다는 느낌도 받았고,
"할 수 있을까?" 라는 생각이 들 때마다 팀원들이 정말 많이 도움이 되었다. 다시 한번 팀원들의 소중함을 느꼈다.
무현님, 우주님, 연옥님, 성환님, 철진님 너무 감사합니다!!!

+ 추가로, 기억에 남는 부분은
밀리의 서재 서비스를 생각해봤을 때, 회원가입을 하면 기본적으로 해당 유저에게 1개의 서재가 자동적으로 생성이 되는데,
이 부분을 고려하지 못했다. 그래서 회원가입&로그인 부분에 아래의 코드를 추가했다. 전체 코드를 붙이면서 문제점을 발견했다.
if not Library.objects.filter(user_id=user.id).exists():
Library.objects.create(
user_id = user_id
)
책장에 중복된 이름의 책장을 추가할 때 이미 책장이 있다는 메세지를 반환하는 로직인데,
a의 유저에 "책장1"이라는 이름의 책장이 있을 때, b유저가 "책장1"이라는 이름의 책장을 만들때도 에러 메세지를 반환하는 오류가 있었다.
filter 조건을 name=shelf_name 만 걸어서 생기는 문제였고, library_id=user_library.id 라는 조건도 추가해서 문제를 해결했다.
이러한 로직적인 부분은 더 디테일하게 생각해보고, 다양한 케이스를 테스트를 통해 잡도록 노력해야겠다.
if Shelf.objects.filter(library_id=user_library.id, name=shelf_name).exists():
return JsonResponse({"MESSAGE": "ALREADY EXISTED SHELF"}, status=404)
'Project' 카테고리의 다른 글
[Wecode] 밀리의서재 <내일채움공책> 1차 리팩토링 (0) | 2021.12.03 |
---|---|
[Pre-Onboarding] 8percent 회고록 (0) | 2021.11.14 |
[Pre-Onboarding] 원티드랩 회고록 (0) | 2021.11.10 |
[Wecode] 라코스테 <Lafesta> 회고록 (0) | 2021.09.27 |