백엔드 Back-end 93

켄트 벡의 테스트 주도 개발 예제대로 따라해보기

켄트 백의 테스트 주도 개발 책에 나온 예제대로 조금만 따라해보면 테스트 주도 개발을 이해할 수 있다.  준비: IntelliJ IDEA 설치하기먼저 IntelliJ IDEA를 내려받는다.https://www.jetbrains.com/idea/download/?section=mac Community Edition을 내려받으면 공짜로 사용할 수 있다. 실행하면 이런 화면이 나온다. New Project를 누르고 TDD라고 적자. Create을 누르면 이 상태가 된다.  테스트 만들기테스트 주도 개발은 테스트부터 만드는 것이다. 책에 나온 간단한 곱셈 예제는 아래와 같다.    public void testMultiplication(){        Dollar five = new Dollar(5);    ..

Pytest로 InfluxDB 병렬 테스트 시 fixture와 테스트 코드 예시

InfluxDB를 사용한 코드에 대한 테스트 코드를 작성 PostgreSQL이나 MySQL을 테스트할 때 테스트 데이터베이스를 만들어서 하는 것처럼 실제로 InfluxDB에 데이터를 저장하고 읽어서 테스트를 하고 싶었다. 그래야 코드가 정상 작동하는지 확실하게 테스트할 수 있기 때문이다. InfluxDB 관련 테스트 팩키지 X InfluxDB관련 테스트 팩키지가 따로 없었다. 그래서 fixture로 추가해서 사용하기로 했다. fixture 함수 conftest.py 파일에 아래 함수를 추가했다. def use_influxdb(func): if "INFLUXDB_TEST_TOKEN" not in os.environ: return pytest.mark.skip(reason="INFLUXDB_TEST_TOKE..

Q. 슬러그slug란?

A. 보통 URL 끝에 있는 웹 주소의 고유 식별 부분을 뜻한다. 예를 들면 https://en.wikipedia.org/wiki/Clean_URL에서 Clean_URL 부분이 슬러그다. 달팽이를 뜻하는 slug와는 관계가 없다. 제작 중인 신문 기사에 붙이는 짧은 이름을 slug라고 한다(출처: 위키백과 slug) 이쪽에서 파생된 단어로 추정된다. slug 특징 사람이 읽고 파악할 있는 자연어로 되어 있으며 중복 없이 유일하다. 실제 웹 개발에서 slug값을 정의할 때 중복이 발생하지 않도록 unique 설정을 true로 정의한다. 웹 개발 문서에 등장하는 예 웹 개발 문서를 읽다보면 자주 등장한다. Django 예 출처: https://docs.djangoproject.com/en/dev/glossa..

장고 어드민 무료 테마 Unfold 추천!

기본 장고 어드민 기본 장고 어드민은 예쁘지 않다. 이렇게 생겼다. 모서리도 다 직각이다. 너무 딱딱한 느낌이다. django-unfold Unfold 테마를 적용한 결과다. 기본 장고 어드민 형태를 유지하면서 세련되게 변경된 것을 볼 수 있다. 장고를 웹사이트로 변경해주는 무료 테마도 보이지만, 웹사이트로 쓰는 용도가 아니라 사내 어드민 용도라면 Unfold 테마로도 충분한 거 같다. unfold 적용 시 주의사항 장고 어드민 모델 추가 시 from unfold.admin import ModelAdmin 이용할 것! 기존 장고 from django.contrib.admin import ModelAdmin을 이용하면 안 된다. 그러면 예쁘지 않게 나타난다. 이렇게 보인다. User, Group 등 기본으..

pytest-BDD(Behavior-driven development) REST API 테스트 픽스처fixture 예

BDD(Behavior-driven development)란? BDD는 한국어로 번역하면 행위 주도 개발로, 소프트웨어 개발 방법론 중 하나다. 소프트웨어 기능을 사용자의 행위 중심으로 설명한다. 예를 들면 아래와 같다. Title: Returns and exchanges go to inventory. As a store owner, I want to add items back to inventory when they are returned or exchanged, so that I can sell them again. Scenario 1: Items returned for refund should be added to inventory. Given that a customer previously bou..

erdcloud.com에서는 동시에 여러 명이 ERD(Entity Relationship Diagram)를 편집하고 공개된 ERD 예시를 볼 수 있다

erdcloud.com 이란? 클라우드 기반의 ERD(Entity Relationship Diagram) 공유 편집툴이다. 클라우드 기반이라 여러 명이 편집 가능 erdcloud.com에서는 클라우드 기반이라 동시에 여러 명이 편집할 수 있다. 광고를 보면 숫자 제한이 없는 거 같다. 여러 명이 함께 ERD를 설계할 때 유용하다. 공개된 ERD 예시 많아 도움 다른 사람들은 어떻게 데이터베이스 모델링을 하는지 공개된 ERD를 보면서 참고할 수 있다. ERD 옆의 책이 쌓여 있는 아이콘을 누르면 아래처럼 공개된 ERD를 볼 수 있다. 아래 예는 OKKY의 예다. export시 외래키 정보가 사라져 export할 경우 외래키(Foreign Key) 정보가 사라진다. export 한 뒤 import 하면 다시..

Q. 래빗엠큐RabbitMQ에서 큐Queue와 메시지Message 중 어떤 것이 메모리를 더 많이 차지할까?

A. 큐 1개가 메시지 1개보다 약 700배 정도 더 차지한다. RabbitMQ는 Docker로 설치 및 실행했다. 2 core, 메모리는 4GB 큐를 하나도 만들지 않았을 때 136 MiB, CPU 사용량도 1% 미만이었다. 큐를 30000개 추가했을 때 메모리 사용량 약 1400GiB 증가 이 상태에서 아래 코드로 큐를 30000개 추가했다. import time import requests from requests.auth import HTTPBasicAuth rabbitmq_server = 'http://localhost:15672' rabbitmq_user = 'guest' rabbitmq_password = 'guest' def create_queue(name): vhost_name = '%2..

sentry 에러 모니터링 툴 사용법

sentry란? 에러 모니터링 및 애플리케이션 성능 모니터링(Application Performance Monitoring, APM) 툴이다. 더 좋고 유명한 Datadog이 있지만 워낙 비싸기 때문에 많은 회사들이 sentry를 쓴다. 사용법 계정 생성 사용법은 아주 간단하다. 우선 sentry.io 가입한다. 구글 계정이나 깃허브 계정을 사용하는 것이 편하다. 가입 중에 Organization을 입력해야 한다. 적당한 것을 입력하자. 프로젝트 추가 다 끝났으면 이런 화면이 나온다. Create Project를 누르자. 프로젝트를 만들어야 사용할 수 있다. 필요한 플랫폼을 선택하면 된다. 예시로 파이썬을 골랐다. Create Project를 누르고 framework를 선택하면 끝. Skip 해도 된다...

백엔드 Back-end 2023.09.02

DRF(Django REST Framework) API 문서 자동화 팩키지, drf-spectacular 설정 방법은?

DRF와 API 문서 자동화, drf-spectacularDRF(Django REST Framework)란?Django만으로 API 서버를 개발할 수도 있지만 Django에 DRF 팩키지를 추가로 설치하면 REST API 서버를 좀 더 쉽게 개발할 수 있다.  API 문서는?API 사용법을 알려주는 문서를 말한다. 아래 YouTube DATA API 문서가 그 예다. API 문서를 프런트 개발자한테 공유해야 프런트 개발자가 웹페이지를 개발할 수 있다.  API 문서 자동화가 필요한 이유는?API 문서를 일일이 PDF로 작성하든 위키로 작성하든 굉장히 시간이 많이 걸린다. 또 코드는 변경했지만 문서 변경은 깜빡하는 경우가 많아서 API 문서가 현재 API 서버 작동과 다른 경우도 많이 발생한다. API 문..

dbdiagram.io를 활용해서 쉽고 간편하게 데이터베이스 모델링하기

dbdiagram.io란 DBML(Database Markup Language)이란 언어를 사용해서 관계형 데이터베이스 논리적 설계를 돕는 무료 툴이다. ORM(Object Relational Mapping) 또는 SQL DDL(Data Definition Language)을 활용한 물리적 설계 전에 미리 간편하게 설계해서 시간을 절약할 수 있다. DBML(Database Markup Language)이란? 아래 예처럼 SQL DDL을 좀 더 간소화한 것에 가깝다. 딱 설계에 필요한 정보만 남겨 DDL보다 훨씬 파악하기 쉽다. Table users { id integer username varchar role varchar created_at timestamp } Table posts { id integ..

전통적인 개발과 테스트 주도 개발, 그리고 애자일

팀내에서 전통적인 개발과 테스트 주도 개발, 그리고 애자일을 주제로 발표를 했다. 요며칠 밤마다 작업한 결과물이다. 슬라이드쉐어에 발표자료를 올려 놓았다. 긴 문장도 넣었지만, 짧은 문장으로 표현한 것도 있어서 잘 이해가 안 될 수도 있어 발표 설명을 각 장마다 적어 본다. 발표 슬라이드https://www.slideshare.net/taptorestart/ss-258182158   발표 스크립트지금 여기 모인 대부분의 개발자들이 하는 개발 방식은 전통적인 개발에 가깝습니다. 전통적인 개발에서는 기능 구현부터 합니다. 기능을 구현하고, POSTMan 같은 테스트 툴, 웹 등을 활용해서 기능을 구현한 부분을 개발자가 직접 테스트합니다.  그림 속 네모 칸은 기능을 뜻합니다. 이미 구현한 기능이 2개이고, ..

Q. 테스트 주도 개발Test-Driven Development(TDD)란?

A. 켄트 벡이 창시한 개발 방법론으로 테스트부터 작성하는 개발 방법론이다. 먼저 통과하지 못할 테스트를 작성하고 테스트를 통과하도록 코드를 작성한다. 그 뒤 코드를 개선, 리팩터링하고 테스트하는 과정을 반복하는 식이다. 테스트 주도 개발 테스트 주도 개발의 목표 작동하는 깔끔한 코드(clean code that works). 론 제프리즈(Ron Jeffries)의 핵심을 찌르는 이 한마디가 바로 테스트 주도 개발의 궁긍적인 목표다. 출처: 켄트 벡, 「테스트 주도 개발」, 김창준, 강규역 역, (주)도서출판인사이트, 2005, 21p. 테스트 주도 개발의 규칙 테스트 주도 개발에서는 ● 오직 자동화된 테스트가 실패할 경우에만 새로운 코드를 작성한다. ● 중복을 제거한다 는 두 가지 단순한 규칙만을 따른..

Q. 장고Django에서 테스트 코드 작성 시 개발팀 내 관습convention으로 정해야 할 사항들은?

A. 테스트 팩키지, 테스트 파일의 위치, 테스트 파일명, 테스트 클래스명, 테스트 메소드명, 테스트 함수명, 테스트 코드 작성 방식 등을 미리 정해두는 게 좋다. 미리 정하지 않으면 각자 방식대로 하게 되고, 추후 유지보수가 어렵다. 처음 시작할 때 각자 테스트를 해보고 의견을 취합해서 정하는 것이 좋다. 한번 정하면 바꾸기 쉽지 않고, 기존 테스트 코드가 있기 때문에 관성에 따라 정한 방식대로 작성하게 되기 때문이다. 테스트 팩키지pytest: 파이썬 계열 대표 테스트 팩키지. pytest 없이도 django에서 기본 제공하는 django.test로 테스트 가능하다. pytest를 사용할지 말지 논의가 필요하다. pytest-django: pytest를 활용하면서 장고django 테스트할 때 쓰는 팩..

일일 활성 사용자Daily Active Users(DAU)가 많은 서비스의 백엔드는 어떻게 개발할까?

일일 활성 사용자Daily Active Users(DAU)가 많은 경우 어떻게 개발할지 궁금했다. 그래서 DAU가 백만이 넘는 회사에 입사해서 살펴봤다. 개인적인 경험이라 기업마다 차이가 있을 수 있다. DAU가 많다는 의미 DAU가 많다는 건 결국 백엔드 입장에서는 요청Request이 많다는 것이다. 그것도 굉장히 많이. 간단히 비유하면 손님이 끊이지 않고 줄서서 먹는 맛집 같다. 음식을 빠르게 대접해야 일일평균 최대한 많은 손님을 처리할 수 있고 음식 맛이 일정해야 손님이 끊이지 않게 된다. API 서버 기준으로 설명하면 손님이 오래 기다리지 않도록 빠르게 대접하는 건 응답 속도이고, 맛이 일정한 것은 오류 없이 응답을 제공하는 것으로 볼 수 있다. 식당과 차이는 식당은 손님을 오래 기다리게 할 수는..

백엔드 Back-end 2023.05.19

Q. 웹서비스 운영 중 가장 비싼 자원은?

A. 데이터베이스다. 최소로 웹서비스를 운영해도 웹 서버와 관계형 데이터베이스 서버, 파일 서버 정도는 필요하다. 이 중 데이터베이스가 제일 비싸다. 비슷한 사양일 때 웹서버에 비해서 2배 이상 비싸다. 파일 서버는 파일량에 비례하기 때문에 비용이 초기에 적게 든다. 가상서버(EC2)와 관계형 데이터베이스 서버 가격 비교 AWS 비용을 살펴보자. OS Linux ec2 t2.2xlarge의 경우 8 vCPUs에 Memory 32GiB인 경우 1시간당 0.4608$다. 이번에는 AWS MySQL 가격을 살펴보자. 비슷한 사양인 db.m4.2xlarge의 경우 vCPU 8, Memory 32 GiB인데 1시간 당 0.966 USD 달러다. 비슷한 사양의 ec2의 거의 두배다. 한 달 기준 705.18 USD..

Q. 장고 어드민Django admin에서 큰 크기의 csv 또는 엑셀 파일 내려받기를 구현할 수 있을까?

A. celery를 활용해 비동기 처리하면 구현할 수 있다. 장고 어드민 사이트The Django admin site란? 장고에서 기본 제공해주는 관리자 화면이다. 웹페이지가 기본 구현되어 있어서 몇가지 어드민 관련 설정만 해주면 되어서 편하다. 아래 예가 그 예이다. 사용자 등 장고 모델과 연관되어 데이터 추가 삭제 수정을 아주 쉽게 관리할 수 있다. 초기 스타트업에서 장고로 서비스를 구현했을 때 보통 백오피스(back office)라고 많이 부르는 내부 직원용 페이지를 굳이 따로 만들지 않고 장고 어드민을 많이 활용한다. 큰 크기의 csv나 엑셀 파일을 내려받는 경우와 관련 이슈 데이터베이스 접근은 백엔드 개발자 등 일부만 가능하다. 따라서 분석 등을 위해서 데이터를 csv 파일이나 엑셀 파일로 받을..

Q. NGINX에서 CORS(Cross-Origin Resource Sharing)처리할 경우 설정 방법은?

A. 요청 메소드 OPTIONS에 대한 설정을 추가하면 된다. CORS 관련 확인을 위해서 사전요청preflight이 발생한다. 이 사전요청은 OPTIONS 요청 메소드로 이루어진다. 그래서 NGINX에서 OPTIONS 요청 메소드 처리를 추가하면 된다. server { ... location / { if ($request_method = 'OPTIONS') { add_header 'Access-Control-Allow-Origin' $http_origin; add_header 'Access-Control-Allow-Methods' 'GET, POST, PATCH, DELETE, OPTIONS'; add_header 'Access-Control-Allow-Credentials' 'true'; add_he..

Q. CORS(Cross-Origin Resource Sharing) 사전요청preflight을 하지 않는 경우는?

A. 브라우저는 다음 조건을 모두 충족하는 요청일 경우에는 CORS 사전요청을 하지 않는다. 1. 메소드Method가 GET, HEAD, POST 중 하나이면서 2. 헤더Headers에 유저 에이전트User Agent가 자동으로 설정한 헤더(User-Agent, Connection)만 있거나, Accept, Accpet-Language, Content-Language만 있거나 Content-Type은 application/x-www-form-urlencoded, multipart/form-data, text/plain 중 하나이거나 조합인 경우다. 더 자세한 설명은 아래 출처를 참고하자. 출처: MDN: Cross-Origin Resource Sharing (CORS) 예를 들어서 요청 메소드를 POST..