본문 바로가기

Project

[Wecode] 밀리의서재 <내일채움공책> 회고록

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)