2차 프로젝트 구현 상세 내용

Kiyong Lee·2021년 12월 1일

포트폴리오

목록 보기
2/3

Git Repository

해당 프로젝트 Git Repository

1. 카카오 회원가입 및 로그인

FrontEnd에서 카카오로부터 받은 토큰을 보내주면, 카카오 디벨로퍼에서 설정한 URL로 토큰을 다시 보냅니다.
토큰을 보내서 카카오 유저정보를 받게 되며, get_or_create를 통해 회원DB에 존재하는 유저일 시
신규가입과 함께 로그인 시켜준 뒤 토큰 발급을 해줍니다.
기존재하는 유저일 시, 로그인 후 토큰만 발급해줍니다.
자세한 구현 사항은 제가 작성한 해당 글 링크로 대체하겠습니다.


2. icontains를 이용한 검색 기능 구현

  1. 리디북스 홈페이지는 검색을 할 때, 아래 이미지처럼 대소문자를 구분하지 않고 데이터가 조회됩니다.
    Django에서 조회에 대한 필터링을 사용할 때, containsicontains를 사용하는데,
    icontains가 대소문자 구분없이 필터링해주기 때문에 사용했습니다.

  2. 검색한 내용을 keyword라는 Query Parameter로 받아서, 책과 작가 이름에 keyword가 들어가는지
    icontains를 이용해서 필터링해주는 것입니다.

검색 내용이 들어간 책 혹은 작가가 없을 시 아무데이터도 없으며 그 부분도 반영되어 있습니다.

keyword = request.GET.get('keyword')
...
for author in Author.objects.filter(name__icontains=keyword)
for book in Book.objects.filter(main_name__icontains=keyword)

3. get_or_create를 이용한 코드 간소화

이전까지는 코드를 작성할 때, 기존의 데이터가 있는지 조회 후 경우에 따라 아래와 같이 Model.objects로 계속 접근하여 확인을 해야 했습니다.
아래는 최초에 작성했던 코드입니다.

#로그인 유저가 특정 작가를 구독한 상황에서 구독을 한 번 더 눌렀다면(구독 취소했다면)
if Subscribe.objects.filter(author_id=author_id, user_id=request.user.id).exists() :
    Subscribe.objects.filter(author_id=author_id, user_id=request.user.id).delete()
    return jsonresponse({'message':'해당 작가 구독 취소 완료'}, status=201)

#DB에 구독한 기록이 없으면 생성
Subscribe.objects.create(author_id=author_id, user_id = request.user.id)
return jsonresponse({'message':'해당 작가 구독 추가 완료'}, status=201)

하지만 get_or_create를 함으로써, 같은 접근 횟수여도 코드를 간소화할 수 있었습니다..
get_or_create는 접근 시, 없으면 생성해주고, 있으면 조회해주며, 그에 따라 상태를 반환합니다.
데이터가 존재해서 get 할 수 있을 시 False를, 없어서 create 했다면 True를 리턴합니다.
그래서 상태에 따라 추가/삭제도 할 수 있게 코드가 작성될 수 있었습니다.

subscribe, state = Subscribe.objects.get_or_create(
    author_id = author_id,
    user_id   = request.user.id
)

if not state :
    subscribe.delete()
    return JsonResponse({'message' : 'delete success'}, status=201)

4. faker 라이브러리를 이용한 데이터 생성

1차 프로젝트 때는 csv파일을 이용해서 데이터를 생성했었습니다.
그리고 2차 때 대량의 랜덤데이터를 생성해주기 위한 faker 라이브러리를 이용했습니다.

import os
import django

os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'ridibooksl.settings')

django.setup()

from faker    import Faker
from datetime import date, datetime, timedelta

from users.models    import User
from products.models import Book, Rating, ViewCount
from django.db       import transaction

fake = Faker()

with transaction.atomic() :
    Rating.objects.bulk_create([Rating(book_id=1, user_id=1, 
    rating=fake.pyint(min_value=1, max_value=5)) for _ in range(30)])
  1. 우선 os.environ.setdefault를 통해 운영체제에 등록되어 있는 환경변수에 접근하여,
    DJANGO.SETTINGS.MODULE이라는 이름으로, ridibooksl.settings를 등록하곘다는 의미입니다.
    그 다음 django.setup()을 해줌으로써, 데이터 INSERT를 위한 기본적인 세팅을 완료하게 됩니다.
    faker 라이브러리는 pip install faker 명령어를 이용하여 설치해주고, from faker import Faker
    사용할 준비를 완료합니다.
    그리고 importFaker 클래스를 fake라는 변수에 대입하여 이용한다고 선언합니다.

  2. 별점 데이터를 생성하는 걸 예시로 하겠습니다.
    다양한 모델에서 데이터를 생성해주기 위해, transaction을 설정했습니다.
    faker 라이브러리의 pyint 메소드를 이용해 별점데이터를 생성할건데, 최소값과 최대값을 1~5사이로 정해줘서
    그 사이의 값이 랜덤 생성되도록 해주는 것입니다.

profile
ISTJ인 K-개발자

0개의 댓글