이번 프로젝트는 drf를 이용해서 구현하였고 test-case를 자세히 보지 못하고 db 설계 후에 개발 완료시점에서 잘 못 이해했음을 알아차렸는데, 이에 대해서 공유드리겠습니다.
저는 이번 프로젝트에서 django에서 지원하는 Jsonfield를 사용하였습니다.
이유는 개발 조건에 새로운 언어가 추가 될 수 있으므로, 언어 별로 컬럼값을 고정 할 수 없다고 판단하여 Jsonfield는 json형태로 저장하면 새로운 언어가 추가되어도 상관없으니 대처가 가능하다고 생각했습니다.
(저장 예시 - Company Model)
id | company_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)
과제 조건에 따라서 동작하도록 하였지만, 효율성을 따졌을때는 안 좋은 코드를 만들게 되었습니다. 추후에는 과제조건을 더욱 면밀히 봐서 이러한 상황을 만들지 않도록 노력해야겠다고 느꼈습니다.