프리온보딩 과제 3

Tasic·2021년 11월 9일
3

과제 정보 요약

  • 구현 기간 : 21.11.08(17시) ~ 21.11.10 (10시)
  • 자세한 내용은 Github 참조

들어가며

이번 프로젝트는 drf를 이용해서 구현하였고 test-case를 자세히 보지 못하고 db 설계 후에 개발 완료시점에서 잘 못 이해했음을 알아차렸는데, 이에 대해서 공유드리겠습니다.

Model에 Jsonfield를 사용한 이유 및 발생 한 문제점

저는 이번 프로젝트에서 django에서 지원하는 Jsonfield를 사용하였습니다.
이유는 개발 조건에 새로운 언어가 추가 될 수 있으므로, 언어 별로 컬럼값을 고정 할 수 없다고 판단하여 Jsonfield는 json형태로 저장하면 새로운 언어가 추가되어도 상관없으니 대처가 가능하다고 생각했습니다.

(저장 예시 - Company Model)

idcompany_name
1{"ko": "라인 프레쉬", "tw": "LINE FRESH", "en": "LINE FRESH"}

또한 Jsonfield 내의 있는 key 값들을 이용해서 ORM을 작성할 수 있으므로 model 구조의 단순성과 검색의 편의성 두가지를 가질 수 있다고 판단하였습니다.

하지만 기능 중 2. 회사 이름으로 회사 검색 은 영어로된 url이 들어와도, header가 한국어면 한국어의 대한 결과를 출력하는 유형이였습니다.

# Wantedlab: url은 영어 이고, header 가 'ko' 이여도 한국어로 출력되는 test code
    resp = api.get(
        "/companies/Wantedlab", headers=[("x-wanted-language", "ko")]
    )

    company = json.loads(resp.data.decode("utf-8"))
    assert resp.status_code == 200
    assert company == {
        "company_name": "원티드랩",

맨 처음에 이 기능을 header가 한국어면 무조건 한국어로된 url이 들어온다고 생각했습니다. 그래서 검색조건도 특정 언어를 포함 시켜서 검색을 했습니다.

(검사 조건 예시)

company = Company.objects.get(company_name__ko="라인 프레쉬")

이 점이 문제가 되는 이유는 첫번째로 언어가 row마다 다를 수 있습니다. 그러므로 특정언어의 대한 조건으로 검색 못합니다.

또한 Jsonfield 내의 존재하는 key 를 검사할 방법은 있지만 values를 검사할 수 있는 방법은 없습니다.

그래서 비슷한 내용이 있는 data를 가져오는 filter를 실행 후, 각각의 결과를 url과 일치하는 지 비교 후, 완전하게 일치하면 찾은 것으로 로직을 변경하기로 하였습니다.

        found_company = None
        companies = Company.objects.filter(company_name__icontains=name)
        for company in companies:
            if name in company.company_name.values():
                found_company = company
                break

        if not found_company:
            raise Http404()

        company_serializer = CompanySerializer(found_company, many=False)

과제 조건에 따라서 동작하도록 하였지만, 효율성을 따졌을때는 안 좋은 코드를 만들게 되었습니다. 추후에는 과제조건을 더욱 면밀히 봐서 이러한 상황을 만들지 않도록 노력해야겠다고 느꼈습니다.

profile
블로그 옮겼습니다 (https://jotasic.github.io)

0개의 댓글