뱅크샐러드의 정기 컨퍼런스, 3차 콘샐러드에서 발표한 백엔드팀의 파이썬 이야기입니다. 백엔드팀이 왜 파이썬을 사용하고, 어떤 방식으로 활용하고 있는지 얘기하며, 같이 잘 일하기 위해 어떤 노력을 하고 있는지 소개합니다.
뱅크샐러드 파이썬맛 레시피정겨울
View Slide
정겨울Jung Winter뱅크샐러드 백엔드 엔지니어발표자
Index재료01조리법02식사03
Index환경01패턴02협업03
Index환경01패턴02협업03어떤 환경에서파이썬을 사용하게 되었나
Index환경01패턴02협업03어떤 환경에서파이썬을 사용하게 되었나어떤 방식으로사용하고 있나
Index환경01패턴02협업03어떤 환경에서파이썬을 사용하게 되었나어떤 방식으로사용하고 있나어떻게 함께잘 사용하는가
오늘은 백엔드 팀의파이썬 이야기데이터팀의 이야기가 궁금하다면 1차 콘샐러드!Disclaimer
백엔드팀의 환경01
01 환경린(Lean)한 학습
01 환경⚒ 빠른 개선과 배포린하게 움직여 제품에 반영하고사용자의 피드백을 통한 개선의 반복→ 빠른 실행과 저렴한 학습!
01 환경마이크로서비스 아키텍쳐파이썬⚙
01 환경네트워크 IO가 많은 MSA 환경
01 환경네트워크 IO가 많은 MSA 환경→ 적극적인 비동기 활용
01 환경gevent 경량 스레딩 방식이벤트 루프 비동기 방식
gevent ҃ झۨ٬ ߑध01 환경
01 환경이벤트 루프 비동기 방식
01 환경이벤트 루프 비동기 방식어떤 방식이든 비동기면 원하는 성능 달성 가능가장 일반적인 익숙한 패턴언어 레벨에서 나이스한 문법 제공특정 파이썬 라이브러리 종속으로 인한 장벽 방지
01 환경파이썬 3.7과 함께하는 뱅크샐러드비동기의 장점을 최대한 활용가능한 런타임 버전
01 환경Python 3.5New syntaxasync/awaita @ b*, ** unpacking 동작 확장 (e.g. {'x': 1, **{'y': 2}})New modulestyping
01 환경Python 3.6New syntaxF 문자열 포매팅 f'Answer is {value}'변수 타입 힌팅async 제네레이터
01 환경Python 3.7New modulesdataclassesEnhancementࡈۄ typing ݽٕഛػ asyncio ݽٕо ࡅܲ CPython ߡ✨
파이썬을 사용하는 패턴02
02 패턴⚠ 조금 길 수 있습니다
02 패턴
02 패턴애플리케이션
02 패턴애플리케이션 테스트
02 패턴 - 애플리케이션Sanic - 비동기 웹 프레임워크sanic
02 패턴 - 애플리케이션aiohttp와 flasksanic
더 빠르고간결한 문법과확장된 기능을 제공하며잘 관리되고 있다02 패턴 - 애플리케이션sanic
জ ಂషܻ ಁఢ02 패턴 - 애플리케이션크게 다르지 않아 보이지만sanic
ۄ02 패턴 - 애플리케이션중첩가능하고 추상화된 블루프린트일일이 넘기는 메서드, 경로와 함수ؘۨఠ ցޖ જইsanic
Ӗ۽ߥ ࣁ࣌җ ܻझց02 패턴 - 애플리케이션내가... 직접... append...? @=(^o^)@ 데코레이터sanic
02 패턴 - 애플리케이션sanicஶೖӒ ಂషܻ ಁఢ
02 패턴 - 애플리케이션ܽইఃఫ클린아키텍쳐
02 패턴 - 애플리케이션제품 관점협업 관점개발 환경 관점WHY?클린아키텍쳐
도메인을 중심으로 개발 가능02 패턴 - 애플리케이션클린아키텍쳐
공통된 구조를 통해유지보수성 증가02 패턴 - 애플리케이션클린아키텍쳐
ҕాػ ҳઑ02 패턴 - 애플리케이션클린아키텍쳐Service A Service B
일관성 있는 코드 확장02 패턴 - 애플리케이션클린아키텍쳐
다른 서비스나 DB에서 값을 꺼내오는 로직 data의 repository우리의 도메인을 표현하는 자료 구조 entity유저와 거래내역을 사용하는 비즈니스 로직 service엔드포인트 라우팅 route / presentation / http02 패턴 - 애플리케이션클린아키텍쳐
entity + dataclass = 02 패턴 - 애플리케이션비즈니스 로직엔 entity만타입 힌트와 함께 풍부하게 표현 가능한 dataclass클린아키텍쳐
02 패턴 - 애플리케이션필요할 땐 dict로 바꿔서클린아키텍쳐entity + dataclass =
이렇게 만든 앱을02 패턴 - 애플리케이션docker
Docker 컨테이너로02 패턴 - 애플리케이션docker
02 패턴 - 애플리케이션dockerݣ౭ झప ࠽٘파이썬도 할 수 있다!
300 MB 100 MB02 패턴 - 애플리케이션docker
만들었는데 제대로 만든거 맞나02 패턴
02 패턴 - 테스트pytestunittest + nose < pytest간결하고 깔끔한 테스트 코드읽기 쉬운 에러 리포트fixture플러그인pytest
02 패턴 - 테스트pytestunittest + nose < pytest간결하고 깔끔한 테스트 코드읽기 쉬운 에러 리포트fixture플러그인pytest모든 unittest 코드는 pytest로 테스트 가능
02 패턴 - 테스트간결하고 깔끔한 테스트 코드The cleaning hand of pytestpytest
02 패턴 - 테스트간결하고 깔끔한 테스트 코드The cleaning hand of pytestpytest일일이 기억해 사용해야 하는 assertXXX 패밀리
02 패턴 - 테스트간결하고 깔끔한 테스트 코드The cleaning hand of pytestsetUp, tearDown 를 사용하면 더 차이나는 코드pytest일일이 기억해 사용해야 하는 assertXXX 패밀리네이티브 문법을 활용해 가독성 확보
02 패턴 - 테스트pytest읽기 쉬운 에러 리포트
02 패턴 - 테스트pytestfixture와 플러그인fixture와 pytest의 내장 기능을 통해 테스트 로직에 집중
02 패턴 - 테스트pytestfixture와 플러그인Pytest۽ Flask DB పझ ജ҃ ҳ୷ೞӝPython pytest fixtureSwitching from nose to py.test at Mozilla
02 패턴 - 테스트DB పझpytestMocking한 repositoryservice에 mocked repository를 전달해 내부 로직에 사용
02 패턴 - 테스트외부 API 테스팅aioresponses를 활용한 mockingpytest
02 패턴 - 테스트외부 API 테스팅어떤 URL로 요청이 오면 정해진 응답을 반환pytest
02 패턴 - 테스트외부 API 테스팅실제 로직은 mocking을 고려하지 않고 평소같이 작성pytestਗېח పझ ٘ী חѱ ইפۄ ࢲ࠺झ ٘ী ઓೞח ࠗ࠙
02 패턴 - 테스트외부 API 테스팅클라이언트가 해당 API를 호출했을 때 정해진 응답pytest
02 패턴 - 테스트외부 API 테스팅mocking에는 한계가 존재 다만 외부 API의 응답을 보장하는건 여기서 다룰 책임은 아님pytest
02 패턴 - 테스트커버리지Coveragepytest-cov۽ ழߡܻ ܻನ ࢤࢿ ழߡܻח ݾо ইצ ࢚క
02 패턴 - 테스트isortpylintOptional[black]린트와 스타일
02 패턴 - 테스트isort린트와 스타일 -
02 패턴 - 테스트Git hookGit hook을 통한 테스트 자동화$ ./bin/install_hooks.sh
02 패턴 - 테스트Git hookGit hook을 통한 사전 테스트실수 방지오늘 할 일을 내일로 미루지 말자빠른 피드백을 통한 지속적인 코드 품질 관리bin/pre-push
함께하는 개발03
03 협업isortpylintOptional[black] 사실 협업의 영역코드 컨벤션
Rainist/styleguide03 협업코드 컨벤션트레일링 콤마, 1줄의 최대 길이, indent, 네이밍 등
03 협업코드 컨벤션전원 합의를 거친 코드 컨벤션이슈와 PR
03 협업프로젝트 템플릿앞서 말했던걸 템플릿으로 관리docker, CI 설정, 컨벤션, hook, 폴더 구조 등
Rainist/python03 협업프로젝트 템플릿 Rainist Python project template based on Cookiecutter
Rainist/python03 협업프로젝트 템플릿 Rainist Python project template based on Cookiecutter✨ ✨
03 협업GitHubഈস GitHub э ੜ ॳӝ
ISSUE_TEMPLATE.md 맥락 파악 + 레거시화 + 의사소통 비용 감소PULL_REQUEST_TEMPLATE.md 코드 리뷰 효율 향상 + 체크리스트를 통한 실수 방지03 협업GitHubIssue / PR మ݁
03 협업GitHubIssue / PR మ݁
03 협업GitHub이슈 라벨링
03 협업코드리뷰(c) 2008 Focus Shift/OSNews/Thom Holwerda건강한 코드리뷰 문화를 위해
03 협업코드리뷰코드리뷰는 500줄 이내로
03 협업코드리뷰리뷰어를 위한 정보 제공
03 협업코드리뷰컨텍스트 공유를 위한 자리 마련-
03 협업코드리뷰서로서로 리뷰 요청
Remind환경01패턴02협업03
Remind환경01패턴02협업03빠른실행과 저렴한학습MSA와 파이썬
Remind환경01패턴02협업03빠른실행과 저렴한학습MSA와 파이썬sanic 클린아키텍쳐docker pytest lint
Remind환경01패턴02협업03빠른실행과 저렴한학습MSA와 파이썬sanic 클린아키텍쳐docker pytest lint컨벤션 템플릿 GitHub 코드리뷰
오늘 백엔드 팀의파이썬 이야기
Thank You