Search
📜

회고 - 축산 ERP 백엔드 개발

가. RDB 설계 역량 향상

1) ‘관계형 모델'에 가깝게 RDB를 설계할 수 있다
‘3차 논리'를 최소 허용하고 적절한 ‘인덱스’를 구상하는 등 ‘관계형 모델'에 가깝게 DB를 설계했다. RDB 중급서 학습 후, ‘관계형 모델'에 가깝게 RDB를 설계하는 것이 성능 면에서 효과적이라는 것을 이해했다. 본서에서 학습한 내용을 서비스 설계에 최대한 반영했다.
2) RDB 설계 과정을 이해하고 설계 결과물을 도출할 수 있다
서비스 설계 단계에서 RDB 설계 방법론을 적용하여 ‘설계 목표' 설정을 시작으로 ‘설계 결과물'을 도출했다. ERP 서비스의 ‘설계 결과물'로 업무 규칙 명세서, 계산된 필드 목록, 일반 필드 목록, ERD를 도출했다.
3) 시니어 개발자의 RDB 설계 노하우를 습득했다
현실적인 제약사항을 RDB 설계에 반영할 수 있다. 시니어의 조언에 따라 프로젝트의 시간적, 인적 제약사항을 설계에 반영했다. 비즈니스 로직과 밀접한 일부 테이블은 ‘제 3정규형'을 만족시키고 그렇지 않은 테이블은 일부 함수 종속성을 허용하는 방향으로 설계를 변경했다. 설계 변경은 현실과 이상 사이의 적절한 타협이었다. 왜냐하면 모든 테이블이 높은 수준의 정규형을 만족하게 되면 시스템의 무결성도 높은 수준으로 보장되지만, 설계에 따라 구현에 투입되는 시간적, 인적 비용이 많이들기 때문이다.
설계적 선택에 따른 이점과 부작용을 심층적으로 고려할 수 있다. 시니어의 조언에 따라 주요 테이블의 기본키를 ‘문자열 타입의 자연키’에서 ‘정수 타입의 인공키’로 변경했다. 설계 초안에서 ‘문자열 타입의 자연키’를 기본키로 지정한 이유는 유니크 제약의 남용에 따른 성능저하를 고려했기 때문이다. 하지만 문자열의 자연키를 기본키로 지정할 경우, JOIN 연산시 문자열의 자연키를 binary로 변환하는 연산이 지속 발생함에 따라 성능상 단점이 더욱 드러난다. 특히 이슈가 되는 테이블은 서비스에서 가장 많은 JOIN 연산이 요구되기 때문에 성능상 단점을 고려하여 ‘정수 타입의 인공키’를 기본키로 지정하는 방향으로 설계를 변경했다.

나. Django 기반 API 개발 역량 향상

1) DRF를 활용하여 단시간에 HTTP API를 개발할 수 있다
DRF(Django REST Framework)를 활용하여 실무에 필요한 API를 단시간에 개발할 수 있다. 국내에 DRF 관련 양서가 없으므로 영어 원서를 읽고 기본을 다졌다. 이후 DRF 공식문서를 토대로 필요한 지식을 보충하는 방향으로 학습했다.
2) 성능을 고려하여 Django’s ORM을 조작할 수 있다
Django 공식문서를 참고하여 ORM의 주요 사용법에 대한 개념을 잡았다. 더불어 의도에 따른 ORM 동작 여부를 점검하기 위해 실무 코드에 반영 전에 토이 프로젝트를 통해 테스트했다. 충분한 연습을 통해 모델 간 모든 관계에 대해 설정할 수 있고, prefetch_related, select_related method 활용하여 유사 쿼리의 발생 빈도를 최소화하는 방향으로 쿼리 최적화에 익숙해졌다.
3) Python과 Django 기본서를 읽고 정리함으로써 기본적인 활용 방법과 내부 동작 원리를 이해했다

다. 테스트 개발 역량 향상

1) 통합테스트와 단위테스트를 설계하고 구현할 수 있다
프로젝트 시작 시점에 Django 프레임워크에 익숙하지 않았기 때문에 API 구현 후, API에 대한 e2e 테스트를 작성했다. 이후 특정 조건에 따라 주요 비즈니스 로직을 검증하는 통합테스트를 작성했다. 또한 주요 비즈니스 로직에 대해 단위테스트를 작성했다.
2) Test Framework와 Mocking Tool을 활용하여 테스트 생산성과 신뢰성을 높일 수 있다
테스트 작업의 생산성을 높이기 위해 Test Framework인 ‘PyTest’를 도입하고 테스트의 신뢰성을 높이기 위해 Mocking Tool인 ‘Model Bakery’와 ‘Mock Queries’를 도입하였다.

라. 분산 비동기 개발 역량 향상

1) 분산 비동기’ 개발이 필요한 작업을 구분하고 구현할 수 있다
분산 비동기 기능은 이벤트 발생에 따른 작업과 정해진 일정에 따른 작업으로 구분하여 구현할 수 있다. ‘분산 비동기’ 기능이 필요한 작업은 실시간 처리가 요구되지 않고 서버에 부하가 많은 것이다.
정해진 일정에 따라 스크래핑한 데이터를 DB에 대규모 삽입(bulk insert)하는 기능을 Celery Beat을 활용하여 ‘분산 비동기’ 방식으로 구현했다.
‘스프레드시트 형식’ 데이터를 파싱하여 DB에 반영하는 기능을 HTTP API 호출에 따른 ‘분산 비동기’ 방식으로 구현했다.

마. 프로그래밍 & 테스트 설계 역량 개선 필요

1) 고품질의 Pythonic 코드를 작성할 것이다
주요 비즈니스 로직에 대한 코드가 Pythonic하지 않다는 피드백을 받았다. 다시 말해, Python 언어의 특징인 간결하고 읽기 쉬운 Code를 생산하지 못한다는 것이다.
Pythonic Code를 생산하기 위해 Python Programming 중급서를 학습하여 Pythonic 코드에 대한 이해를 높일 계획이다. 학습 참고서는 지인의 추천에 따라 ‘Effective Python 2nd’를 선택했다.
더불어 토이프로젝트를 진행하면서 학습 내용을 적용하는 방식을 통해 Pythonic Programming을 체득하겠다.
2) 오류를 사전에 발견할 수 있는 테스트 설계 역량을 갖출 것이다
기능 구현 후 주요 비즈니스 로직에 대한 테스트를 작성했지만, 테스트에서 발견하지 못한 오류가 많았다. 사전에 오류를 발견하지 못한 이유는 테스트 설계에 허점이 존재하기 때문이다.
테스트 설계 역량을 보완하기 위해 테스트 설계 방법론의 개념부터 활용법까지 깊이 있게 학습할 계획이다. 참고자료는 ‘Harry Percival, Bob Gregory’의 ‘Architecture Patterns with Python’를 선택했다.