나는 이렇게 논다/Suulgo_# 술취향 매칭

#3_Faker만 있으면 DB업로드가 두렵지 않아

daco2020 2022. 1. 22. 18:29
반응형

페이커와의 만남

Faker는 디비에 가짜 데이터를 생성해주는 모듈이다. 맨 아래에 공식 페이지 링크를 남겨놓겠다. 만약 더 쉽게 사용하고 싶다면 구글에 검색해보라. 자주 사용하는 페이커 메서드를 잘 정리해 놓은 블로그들이 많다.

 

페이커는 1차 때 브랜치 팀에서 데이터를 넣을 때 사용했었다. 그 당시에 우리팀은 모든 상품과 데이터들을 직접 일일이 찾고 직접 입력하는 식으로 진행하였는데 (65개 상품을 입력하는데 하루를 모두 사용했었다..ㅜㅜ) 페이커를 이용한 브랜치 팀은 수십만 개의 데이터를 손쉽게 입력하였다.

 

그래서 이번에 우리는 페이커를 이용하여 디비에 데이터를 넣기로 하고 여러 글들을 보며 공부를 했다. 그리고 브랜치팀에서 이를 사용했던 도원님에게도 찾아가 조언을 구했다. 페이커는 생각보다 어렵지 않았고 매우매우매우매우 유용했다.(강조) 한글 이름은 물론, 주소, 아이피, 문장, 이메일, 등등을 메서드 하나로 간편하게 넣을 수 있었다. 또한 내가 직접 넣을 항목들을 만들어 입맛대로 랜덤 값을 넣을 수도 있었다. (이걸 아주 유용하게 사용하였다.)

 

 

 

페이커로 데이터를 넣어보자!

파이썬 셀에서 몇시간 동안 연습해보고 확신이 든 나는 본격적으로 페이커 코드를 짰다.

그렇게 짠 페이커 코드는 다음과 같다.

# db_uploader.py

from faker import Faker
from faker.providers import DynamicProvider

fake = Faker("ko_KR") # 한글로 바꿔준다.

# mbti의 경우 내가 직접 항목을 만들어 사용할 수 있도록 하였다.
mbti_provider = DynamicProvider(
    provider_name="mbti",
    elements=[
		'INTJ','INTP','ENTJ','ENTP',
		'INFJ','INFP','ENFJ','ENFP',
		'ISTJ','ISFJ','ESTJ','ESFJ',
		'ISTP','ISFP','ESTP','ESFP'
		],
)
fake.add_provider(mbti_provider)

for i in range(40):
# users upload
    image = "http://www.irobotnews.com/news/photo/201709/11610_26562_331.png"

    User.objects.create(
        kakao_id          = fake.unique.word(),
        name              = fake.name(),
        profile_image_url = image,
        email             = fake.unique.email(),
    )

# # surveys upload
    comment = "술은 모두 달다."
    favorite_place = "유럽 지중해"
    favorite_food = "엽떡"
    hobby = "니트"

    Survey.objects.create(
        gender            = Gender.objects.get(name=fake.gender()),
        mbti              = Mbti.objects.get(name=fake.mbti()),
        class_number      = fake.pyint(min_value=1,max_value=30),
        stack             = fake.pyint(min_value=1,max_value=2),
        alcohol_limit     = fake.pyint(min_value=1,max_value=4),
        alcohol_level     = fake.level(),
        comment           = comment+str(i+1),
        favorite_place    = favorite_place+str(i+1),
        favorite_food     = favorite_food+str(i+1),
        hobby             = hobby+str(i+1),
        user              = User.objects.get(id=i+1)
    )

# 다대다 테이블 넣기
for i in range(40):

    survey = Survey.objects.get(id=i+1)
    drinking_method = DrinkingMethod.objects.get(id=fake.pyint(min_value=1,max_value=5))
    flavor = Flavor.objects.get(id=fake.pyint(min_value=1,max_value=5))
    alcohol_category = AlcoholCategory.objects.get(id=fake.pyint(min_value=1,max_value=10))

    if not SurveyAlcoholCategory.objects.filter(alcohol_category=alcohol_category,survey=survey).exists():
        SurveyAlcoholCategory.objects.create(
            alcohol_category =  alcohol_category,
            survey = survey
    )

    if not SurveyDrinkingMethod.objects.filter(drinking_method=drinking_method,survey=survey).exists():
        SurveyDrinkingMethod.objects.create(
            drinking_method =  drinking_method,
            survey = survey
    )

    if not SurveyFlavor.objects.filter(flavor=flavor,survey=survey).exists():
        SurveyFlavor.objects.create(
            flavor =  flavor,
            survey = survey
    )

코드는 순서대로 동작하므로 가장 우선적으로 필요한 유저 테이블을 시작으로 서베이, 그 외 나머지 다대다 중간 테이블에 데이터가 입력되도록 하였다. (가장 앞단의 1 관계 테이블들은 csv로 데이터를 넣은 후 페이커를 사용해야 한다)

 

다대다의 경우 유저 1명 당 여러 개를 선택할 수 있으므로 2번 3번 정도 더 돌리면 된다. 하지만 이 과정에서 '동일한 유저'와 '동일한 선택지'가 테이블에 중복 추가될 수 있는 문제가 있기 때문에 이 부분은 if 문을 통해 중복 저장되지 않도록 코드를 짰다. 이렇게 하면 한 명의 유저가 중복선택을 3개, 혹은 2개, 혹은 1개로 선택한 것이 되어 보다 더 현실적인 데이터 입력이 가능했다.

 

물론 페이커가 만능은 아니다. 아쉬운 점도 분명히 있었다. 위에 코드를 보면 알다시피, 이미지는 모두 한 장으로 통일했다. 페이커는 이미지도 지원하긴 하지만 직접 사용해보니 이미지가 없는 링크이거나 잘못된 링크도 더러 있었다. 그래서 이미지는 페이커를 사용하지 못하고 그냥 하나의 샘플 이미지를 사용하기로 했다. 어차피 목 데이터가 필요한 것이었으므로 현재 우리에게는 상관이 없었다.

 

그리고 한글 이름이나 주소는 가능하지만 문장은 한글로 변환이 안 되는 것 같았다. 앞서 말했듯이 이는 목 데이터였으므로 일단 임의의 입력값이 똑같이 반복되도록 하였다. 다만 구별을 위해서 문구 뒤에 해당 유저의 아이디 번호가 입력되도록 하였다. 예를 들어 아이디 1번의 유저가 좋아하는 음식은 ‘엽떡 1’ 이 되는 것이다.

 

 

 

마무리

페이커를 더 자세히 공부하거나 혹은 이와 유사한 다른 툴을 함께 사용한다면 더 그럴싸한 목 데이터를 만들 수 있을 것 같다. 하지만 현재로서는 이 정도로도 충분했기 때문에 데이터 입력은 여기까지 하고 넘어가기로 했다. 이제부터는 본격적으로 뷰 로직을 짜고 프론트와 통신을 주고받을 차례였다.

 

 

 


 

레퍼런스

페이커 공식 페이지
Welcome to Faker's documentation! - Faker 10.0.0 documentation

 

 

 

 

반응형