$30 off During Our Annual Pro Sale. View Details »

Banksalad recipe - Python flavor

Banksalad recipe - Python flavor

뱅크샐러드의 정기 컨퍼런스, 3차 콘샐러드에서 발표한 백엔드팀의 파이썬 이야기입니다. 백엔드팀이 왜 파이썬을 사용하고, 어떤 방식으로 활용하고 있는지 얘기하며, 같이 잘 일하기 위해 어떤 노력을 하고 있는지 소개합니다.

Winter Jung

March 16, 2019
Tweet

More Decks by Winter Jung

Other Decks in Programming

Transcript

  1. 뱅크샐러드 파이썬맛 레시피
    정겨울

    View Slide

  2. 정겨울
    Jung Winter
    뱅크샐러드 백엔드 엔지니어
    발표자

    View Slide

  3. Index
    재료
    01
    조리법
    02
    식사
    03

    View Slide

  4. Index
    환경
    01
    패턴
    02
    협업
    03

    View Slide

  5. Index
    환경
    01
    패턴
    02
    협업
    03
    어떤 환경에서
    파이썬을 사용하게 되었나

    View Slide

  6. Index
    환경
    01
    패턴
    02
    협업
    03
    어떤 환경에서
    파이썬을 사용하게 되었나
    어떤 방식으로
    사용하고 있나

    View Slide

  7. Index
    환경
    01
    패턴
    02
    협업
    03
    어떤 환경에서
    파이썬을 사용하게 되었나
    어떤 방식으로
    사용하고 있나
    어떻게 함께
    잘 사용하는가

    View Slide

  8. 오늘은 백엔드 팀의
    파이썬 이야기
    데이터팀의 이야기가 궁금하다면 1차 콘샐러드!
    Disclaimer

    View Slide

  9. 백엔드팀의 환경
    01

    View Slide

  10. 01 환경
    린(Lean)한 학습

    View Slide

  11. 01 환경
    ⚒ 빠른 개선과 배포
    린하게 움직여 제품에 반영하고
    사용자의 피드백을 통한 개선의 반복
    → 빠른 실행과 저렴한 학습!

    View Slide

  12. 01 환경
    마이크로서비스 아키텍쳐
    파이썬



    View Slide

  13. 01 환경
    네트워크 IO가 많은 MSA 환경

    View Slide

  14. 01 환경
    네트워크 IO가 많은 MSA 환경
    → 적극적인 비동기 활용

    View Slide

  15. 01 환경
    gevent 경량 스레딩 방식
    이벤트 루프 비동기 방식

    View Slide

  16. gevent ҃۝ झۨ٬ ߑध
    01 환경

    View Slide

  17. 01 환경
    이벤트 루프 비동기 방식

    View Slide

  18. 01 환경
    이벤트 루프 비동기 방식
    어떤 방식이든 비동기면 원하는 성능 달성 가능
    가장 일반적인 익숙한 패턴
    언어 레벨에서 나이스한 문법 제공
    특정 파이썬 라이브러리 종속으로 인한 장벽 방지

    View Slide

  19. 01 환경
    파이썬 3.7과 함께하는 뱅크샐러드
    비동기의 장점을 최대한 활용가능한 런타임 버전

    View Slide

  20. 01 환경
    Python 3.5
    New syntax
    async/await
    a @ b
    *, ** unpacking 동작 확장 (e.g. {'x': 1, **{'y': 2}})
    New modules
    typing


    View Slide

  21. 01 환경
    Python 3.6
    New syntax
    F 문자열 포매팅 f'Answer is {value}'

    변수 타입 힌팅
    async 제네레이터


    View Slide

  22. 01 환경
    Python 3.7
    New modules
    dataclasses
    Enhancement
    ࡈۄ૓ typing ݽٕ
    ഛ੢ػ asyncio ݽٕ
    о੢ ࡅܲ CPython ߡ੹


    View Slide

  23. 파이썬을 사용하는 패턴
    02

    View Slide

  24. 02 패턴
    ⚠ 조금 길 수 있습니다

    View Slide

  25. 02 패턴

    View Slide

  26. 02 패턴

    View Slide

  27. 02 패턴
    애플리케이션

    View Slide

  28. 02 패턴
    애플리케이션 테스트

    View Slide

  29. 02 패턴 - 애플리케이션
    Sanic - 비동기 웹 프레임워크
    sanic

    View Slide

  30. 02 패턴 - 애플리케이션
    aiohttp와 flask
    sanic

    View Slide

  31. 더 빠르고
    간결한 문법과
    확장된 기능을 제공하며
    잘 관리되고 있다
    02 패턴 - 애플리케이션
    sanic

    View Slide

  32. জ ಂషܻ ಁఢ
    02 패턴 - 애플리케이션
    크게 다르지 않아 보이지만
    sanic

    View Slide

  33. ۄ਋౴
    02 패턴 - 애플리케이션
    중첩가능하고 추상화된 블루프린트
    일일이 넘기는 메서드, 경로와 함수
    ؘ௏ۨ੉ఠ ցޖ જই
    sanic

    View Slide

  34. Ӗ۽ߥ ࣁ࣌җ ܻझց
    02 패턴 - 애플리케이션
    내가... 직접... append...? @=(^o^)@ 데코레이터
    sanic

    View Slide

  35. 02 패턴 - 애플리케이션
    sanic
    ஶೖӒ ಂషܻ ಁఢ

    View Slide

  36. 02 패턴 - 애플리케이션
    sanic
    ஶೖӒ ಂషܻ ಁఢ

    View Slide

  37. 02 패턴 - 애플리케이션
    ௿ܽইఃఫ୛
    클린아키텍쳐

    View Slide

  38. 02 패턴 - 애플리케이션
    제품 관점
    협업 관점
    개발 환경 관점
    WHY?
    클린아키텍쳐

    View Slide

  39. 도메인을 중심으로 개발 가능
    02 패턴 - 애플리케이션
    클린아키텍쳐

    View Slide

  40. 공통된 구조를 통해
    유지보수성 증가
    02 패턴 - 애플리케이션
    클린아키텍쳐

    View Slide

  41. ҕాػ ҳઑ
    02 패턴 - 애플리케이션
    클린아키텍쳐
    Service A Service B

    View Slide

  42. 일관성 있는 코드 확장
    02 패턴 - 애플리케이션
    클린아키텍쳐

    View Slide

  43. 다른 서비스나 DB에서 값을 꺼내오는 로직

    data의 repository
    우리의 도메인을 표현하는 자료 구조

    entity
    유저와 거래내역을 사용하는 비즈니스 로직

    service
    엔드포인트 라우팅

    route / presentation / http
    02 패턴 - 애플리케이션
    클린아키텍쳐

    View Slide

  44. entity + dataclass =
    02 패턴 - 애플리케이션
    비즈니스 로직엔 entity만
    타입 힌트와 함께

    풍부하게 표현 가능한 dataclass
    클린아키텍쳐

    View Slide

  45. 02 패턴 - 애플리케이션
    필요할 땐 dict로 바꿔서
    클린아키텍쳐
    entity + dataclass =

    View Slide

  46. 이렇게 만든 앱을
    02 패턴 - 애플리케이션
    docker

    View Slide

  47. Docker 컨테이너로
    02 패턴 - 애플리케이션
    docker

    View Slide

  48. 02 패턴 - 애플리케이션
    docker
    ݣ౭ झప੉૑ ࠽٘
    파이썬도 할 수 있다!

    View Slide

  49. 300 MB 100 MB
    02 패턴 - 애플리케이션
    docker

    View Slide

  50. 만들었는데 제대로 만든거 맞나
    02 패턴

    View Slide

  51. 02 패턴
    애플리케이션 테스트

    View Slide

  52. 02 패턴 - 테스트
    pytest
    unittest + nose < pytest
    간결하고 깔끔한 테스트 코드
    읽기 쉬운 에러 리포트
    fixture
    플러그인
    pytest

    View Slide

  53. 02 패턴 - 테스트
    pytest
    unittest + nose < pytest
    간결하고 깔끔한 테스트 코드
    읽기 쉬운 에러 리포트
    fixture
    플러그인
    pytest
    모든 unittest 코드는 pytest로 테스트 가능

    View Slide

  54. 02 패턴 - 테스트
    간결하고 깔끔한 테스트 코드
    The cleaning hand of pytest
    pytest

    View Slide

  55. 02 패턴 - 테스트
    간결하고 깔끔한 테스트 코드
    The cleaning hand of pytest
    pytest
    일일이 기억해 사용해야 하는 assertXXX 패밀리

    View Slide

  56. 02 패턴 - 테스트
    간결하고 깔끔한 테스트 코드
    The cleaning hand of pytest
    setUp, tearDown 를 사용하면 더 차이나는 코드
    pytest
    일일이 기억해 사용해야 하는 assertXXX 패밀리
    네이티브 문법을 활용해 가독성 확보

    View Slide

  57. 02 패턴 - 테스트
    pytest
    읽기 쉬운 에러 리포트

    View Slide

  58. 02 패턴 - 테스트
    pytest
    fixture와 플러그인
    fixture와 pytest의 내장 기능을 통해 테스트 로직에 집중

    View Slide

  59. 02 패턴 - 테스트
    pytest
    fixture와 플러그인
    Pytest۽ Flask੄ DB పझ౟ ജ҃ ҳ୷ೞӝ
    Python pytest fixture
    Switching from nose to py.test at Mozilla

    View Slide

  60. 02 패턴 - 테스트
    DB పझ౟
    pytest
    Mocking한 repository
    service에 mocked repository를 전달해 내부 로직에 사용

    View Slide

  61. 02 패턴 - 테스트
    외부 API 테스팅
    aioresponses를 활용한 mocking
    pytest

    View Slide

  62. 02 패턴 - 테스트
    외부 API 테스팅
    어떤 URL로 요청이 오면 정해진 응답을 반환
    pytest

    View Slide

  63. 02 패턴 - 테스트
    외부 API 테스팅
    실제 로직은 mocking을 고려하지 않고 평소같이 작성
    pytest
    ਗېח పझ౟ ௏٘ী ੓חѱ ইפۄ ࢲ࠺झ ௏٘ী ઓ੤ೞח ࠗ࠙

    View Slide

  64. 02 패턴 - 테스트
    외부 API 테스팅
    클라이언트가 해당 API를 호출했을 때 정해진 응답
    pytest

    View Slide

  65. 02 패턴 - 테스트
    외부 API 테스팅
    mocking에는 한계가 존재

    다만 외부 API의 응답을 보장하는건 여기서 다룰 책임은 아님
    pytest

    View Slide

  66. 02 패턴 - 테스트
    커버리지
    Coverage
    pytest-cov۽ ழߡܻ૑ ܻನ౟ ࢤࢿ

    ழߡܻ૑ח ݾ಴о ইצ ࢚క

    View Slide

  67. 02 패턴 - 테스트
    isort
    pylint
    Optional[black]
    린트와 스타일

    View Slide

  68. 02 패턴 - 테스트
    isort
    린트와 스타일
    -

    View Slide

  69. 02 패턴 - 테스트
    Git hook
    Git hook을 통한 테스트 자동화
    $ ./bin/install_hooks.sh

    View Slide

  70. 02 패턴 - 테스트
    Git hook
    Git hook을 통한 사전 테스트
    실수 방지
    오늘 할 일을 내일로 미루지 말자
    빠른 피드백을 통한 지속적인 코드 품질 관리
    bin/pre-push

    View Slide

  71. 함께하는 개발
    03

    View Slide

  72. 03 협업
    isort
    pylint
    Optional[black]
    사실 협업의 영역
    코드 컨벤션

    View Slide

  73. Rainist/styleguide
    03 협업
    코드 컨벤션
    트레일링 콤마, 1줄의 최대 길이, indent, 네이밍 등

    View Slide

  74. 03 협업
    코드 컨벤션
    전원 합의를 거친 코드 컨벤션
    이슈와 PR

    View Slide

  75. 03 협업
    프로젝트 템플릿
    앞서 말했던걸 템플릿으로 관리
    docker, CI 설정, 컨벤션, hook, 폴더 구조 등

    View Slide

  76. Rainist/python
    03 협업
    프로젝트 템플릿
    Rainist Python project template based on Cookiecutter

    View Slide

  77. Rainist/python
    03 협업
    프로젝트 템플릿
    Rainist Python project template based on Cookiecutter
    ✨ ✨

    View Slide

  78. 03 협업
    GitHub
    ഈস੄ ੢ GitHub

    э੉ ੜ ॳӝ

    View Slide

  79. ISSUE_TEMPLATE.md

    맥락 파악 + 레거시화 + 의사소통 비용 감소
    PULL_REQUEST_TEMPLATE.md

    코드 리뷰 효율 향상 + 체크리스트를 통한 실수 방지
    03 협업
    GitHub
    Issue / PR మ೒݁

    View Slide

  80. 03 협업
    GitHub
    Issue / PR మ೒݁

    View Slide

  81. 03 협업
    GitHub
    Issue / PR మ೒݁

    View Slide

  82. 03 협업
    GitHub
    이슈 라벨링

    View Slide

  83. 03 협업
    GitHub
    이슈 라벨링

    View Slide

  84. 03 협업
    GitHub
    이슈 라벨링

    View Slide

  85. 03 협업
    GitHub
    이슈 라벨링

    View Slide

  86. 03 협업
    코드리뷰
    (c) 2008 Focus Shift/OSNews/Thom Holwerda
    건강한 코드리뷰 문화를 위해

    View Slide

  87. 03 협업
    코드리뷰
    코드리뷰는 500줄 이내로

    View Slide

  88. 03 협업
    코드리뷰
    코드리뷰는 500줄 이내로

    View Slide

  89. 03 협업
    코드리뷰
    리뷰어를 위한 정보 제공

    View Slide

  90. 03 협업
    코드리뷰
    컨텍스트 공유를 위한 자리 마련
    -

    View Slide

  91. 03 협업
    코드리뷰
    서로서로 리뷰 요청

    View Slide

  92. Remind
    환경
    01
    패턴
    02
    협업
    03

    View Slide

  93. Remind
    환경
    01
    패턴
    02
    협업
    03
    빠른실행과 저렴한학습
    MSA와 파이썬

    View Slide

  94. Remind
    환경
    01
    패턴
    02
    협업
    03
    빠른실행과 저렴한학습
    MSA와 파이썬
    sanic 클린아키텍쳐
    docker pytest lint

    View Slide

  95. Remind
    환경
    01
    패턴
    02
    협업
    03
    빠른실행과 저렴한학습
    MSA와 파이썬
    sanic 클린아키텍쳐
    docker pytest lint
    컨벤션 템플릿

    GitHub 코드리뷰

    View Slide

  96. 오늘 백엔드 팀의
    파이썬 이야기

    View Slide

  97. Thank You

    View Slide