Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

Index 재료 01 조리법 02 식사 03

Slide 4

Slide 4 text

Index 환경 01 패턴 02 협업 03

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

백엔드팀의 환경 01

Slide 10

Slide 10 text

01 환경 린(Lean)한 학습

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

gevent ҃۝ झۨ٬ ߑध 01 환경

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

01 환경 Python 3.6 New syntax F 문자열 포매팅 f'Answer is {value}' 변수 타입 힌팅 async 제네레이터

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

파이썬을 사용하는 패턴 02

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

02 패턴

Slide 26

Slide 26 text

02 패턴

Slide 27

Slide 27 text

02 패턴 애플리케이션

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

다른 서비스나 DB에서 값을 꺼내오는 로직
 data의 repository 우리의 도메인을 표현하는 자료 구조
 entity 유저와 거래내역을 사용하는 비즈니스 로직
 service 엔드포인트 라우팅
 route / presentation / http 02 패턴 - 애플리케이션 클린아키텍쳐

Slide 44

Slide 44 text

entity + dataclass = 02 패턴 - 애플리케이션 비즈니스 로직엔 entity만 타입 힌트와 함께
 풍부하게 표현 가능한 dataclass 클린아키텍쳐

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

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

Slide 49

Slide 49 text

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

Slide 50

Slide 50 text

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

Slide 51

Slide 51 text

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

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

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

Slide 54

Slide 54 text

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

Slide 55

Slide 55 text

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

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

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

Slide 59

Slide 59 text

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

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

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

Slide 62

Slide 62 text

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

Slide 63

Slide 63 text

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

Slide 64

Slide 64 text

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

Slide 65

Slide 65 text

02 패턴 - 테스트 외부 API 테스팅 mocking에는 한계가 존재
 다만 외부 API의 응답을 보장하는건 여기서 다룰 책임은 아님 pytest

Slide 66

Slide 66 text

02 패턴 - 테스트 커버리지 Coverage pytest-cov۽ ழߡܻ૑ ܻನ౟ ࢤࢿ
 ழߡܻ૑ח ݾ಴о ইצ ࢚క

Slide 67

Slide 67 text

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

Slide 68

Slide 68 text

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

Slide 69

Slide 69 text

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

Slide 70

Slide 70 text

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

Slide 71

Slide 71 text

함께하는 개발 03

Slide 72

Slide 72 text

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

Slide 73

Slide 73 text

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

Slide 74

Slide 74 text

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

Slide 75

Slide 75 text

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

Slide 76

Slide 76 text

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

Slide 77

Slide 77 text

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

Slide 78

Slide 78 text

03 협업 GitHub ഈস੄ ੢ GitHub
 э੉ ੜ ॳӝ

Slide 79

Slide 79 text

ISSUE_TEMPLATE.md
 맥락 파악 + 레거시화 + 의사소통 비용 감소 PULL_REQUEST_TEMPLATE.md
 코드 리뷰 효율 향상 + 체크리스트를 통한 실수 방지 03 협업 GitHub Issue / PR మ೒݁

Slide 80

Slide 80 text

03 협업 GitHub Issue / PR మ೒݁

Slide 81

Slide 81 text

03 협업 GitHub Issue / PR మ೒݁

Slide 82

Slide 82 text

03 협업 GitHub 이슈 라벨링

Slide 83

Slide 83 text

03 협업 GitHub 이슈 라벨링

Slide 84

Slide 84 text

03 협업 GitHub 이슈 라벨링

Slide 85

Slide 85 text

03 협업 GitHub 이슈 라벨링

Slide 86

Slide 86 text

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

Slide 87

Slide 87 text

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

Slide 88

Slide 88 text

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

Slide 89

Slide 89 text

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

Slide 90

Slide 90 text

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

Slide 91

Slide 91 text

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

Slide 92

Slide 92 text

Remind 환경 01 패턴 02 협업 03

Slide 93

Slide 93 text

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

Slide 94

Slide 94 text

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

Slide 95

Slide 95 text

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

Slide 96

Slide 96 text

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

Slide 97

Slide 97 text

Thank You