[1st Project] Brokurly?! ver 0.5 - 기능정의서&.csv

제갈창민·2021년 12월 10일
0

작업물

목록 보기
4/9
post-thumbnail

1. 기능정의서

  • 기능명세서 라고도 하는데, 처음에 들었을 때는 기능을 다 구현한 뒤 작성하는 보고서의 일종이라고 생각했으나, 정반대의 역할이었다.
  • 각 기능들을 어떤 관계에 의해서 만들어 나갈 것이고, 어떤 url 명, class 명, func 명을 사용할 것인지 등등등 그야말로 '명세서'와 같이 세세하게 써야하는 것이었다.
    (실제로 API 구현 도중 열어봤는데, 빠뜨린 부분을 발견하고 채워넣었음)
  • 기능정의서를 작성하면서 기능별 각자 역할분담도 병행했는데, 이번 프로젝트에서 나의 파트는,
    1) 정규표현식 유효성검사를 모듈화하여 회원가입 View에 적용하기
    : ValidationError 를 잡아주는 validator.py 작성
    2) decorator 구현하기
    : 로그인이 필요한 매 페이지마다 토큰을 확인하고 인증하는 함수를 decorator 로 만들어서 코드의 가독성과 작업의 편리성을 증대하는 작업
    3) MainPage API 구현
    : 이번에 기획한 메인페이지는 제품의 간략한 정보가 나열되는 형태여서 각 제품의 이미지도 가져와야한다.
  • validator 는 한번 해본 적 있었고, decorator는 해보고 싶었던 것, 메인페이지 API는 전혀 모르는 새로운 종류의 도전이다.

2. .csv & uploader.py

"uploader.py code 전문"
import os, django, csv, sys

from products.models import *

# system setup
os.chdir('.')
print('Current dir의 경로 : ', end=''), print(os.getcwd())
# os가 파악한 현재 경로를 표기
print('os.path.abspath(__file__)의 경로 : ',os.path.abspath(__file__))    
# 현재 작업중인 파일을 포함 경로를 구체적으로 표기
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
print('BASE_DIR=', end=''), print(BASE_DIR)
print('똑같나? 다르나?', BASE_DIR == os.getcwd())

sys.path.append(BASE_DIR)  
# sys 모듈은 파이썬을 설치할 때 함께 설치되는 라이브러리 모듈이다. 
# 이 sys 모듈을 사용하면 파이썬 라이브러리가 설치되어 있는 디렉터리를 확인할 수 있다.

os.environ.setdefault("DJANGO_SETTINGS_MODULE", 'brokurly.settings') 
 # python이 실행될 때 DJANGO_SETTINGS_MODULE라는 환경 변수에 현재 프로젝트의 
 settings.py 파일 경로를 등록

django.setup() 
# python manage.py shell 을 실행하는 것이랑 비슷한 방법이다. , 파이썬 파일에서도 django를 실행 시킬수 있다.

menu = './menus.csv'
category = './categories.csv'
product = './products.csv'
image = './images.csv'
# insert data while reading csv file into table
# open csv file and insert row data in MySQL

# Menu Table
def insert_menu():    
    with open(menu, newline='', encoding='utf8') as csvfile:
        data_reader = csv.DictReader(csvfile)
        for row in data_reader:
            menu_id = Menu.objects.create(
                name = row['menu'] )
    print('MENU DATA UPLOADED SUCCESSFULY!')    

def insert_category():    
    with open(category, newline='', encoding='utf8') as csvfile:
        data_reader = csv.DictReader(csvfile)
        for row in data_reader:
            menu_id = Menu.objects.get(name=row['menu'])
            Category.objects.create( name = row['category'],menu = menu_id)

    print('CATEGORY DATA UPLOADED SUCCESSFULY!')    

def insert_products():    
    with open(product, newline='', encoding='utf8') as csvfile:
        data_reader = csv.DictReader(csvfile)
        for row in data_reader:
            category_id = Category.objects.get(name=row['category'])
            
            Product.objects.create(
                name         = row['name'],
                price        = row['price'], 
                introduction = row['introduction'], 
                description  = row['description'], 
                unit         = row['unit'], 
                shipping     = row['shipping'], 
                package      = row['package'], 
                origin       = row['origin'], 
                weight       = row['weight'], 
                stock        = row['stock'],
                category     = category_id
            ) 
              
        print('PRODUCT DATA UPLOADED SUCCESSFULY!')    

def insert_image():    
    with open(image, newline='', encoding='utf8') as csvfile:
        data_reader = csv.DictReader(csvfile)
        for row in data_reader:
            print(row)
            product_id = Product.objects.filter(name=row['name'])
            
            Image.objects.create(url = row['url'],product = product_id[0])

    print('CATEGORY DATA UPLOADED SUCCESSFULY!') 

insert_menu()
insert_category()
insert_products()
insert_image()

-> 대략 11번정도 DB를 엎었던 것 같다.
-> 중간에 image 테이블을 만들지 않았다는 것을 깨달았고, models.py를 다시 작성하여 git push 후 merge를 받는 등 여러 해프닝이 있었지만, 결과적으로 더미 데이터가 잘 입력되었다.
-> 물론, 맨땅에 코드를 작성할 수 없었기에 구글신의 도움을 받아 가져온 뒤, 3명이서 머리를 맞대고 하루종일, 한줄 한줄 코드 해부쇼를 펼치기도 했다.
-> 요약하자면, 엑셀파일에 대량의 데이터를 입력해서 csv 포맷으로 저장한 뒤, 파이썬에서 업로드 목적으로 만든 코드를 이용해, DB에 일괄 입력하는 것이다.
-> 대량의 코드가 한꺼번에 입력되기 때문에 엑셀에 타이포가 생기지 않게 조심해야하며, 업로드용 코드를 작성할 때에도 일치하는 테이블과 필드에 정확히 위치하는지도 잘 살펴야 한다.
-> 상위 테이블을 정참조하고 있는 테이블은 코드 구성에 해당 테이블을 연결해줘야 함을 잊지 않아야 DB를 엎는 사태가 벌어지지 않는다.

profile
자기계발 중인 신입 개발자

0개의 댓글