반응형

백엔드 Back-end 90

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

켄트 백의 테스트 주도 개발 책에 나온 예제대로 조금만 따라해보면 테스트 주도 개발을 이해할 수 있다. 준비: 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); five.times(2);..

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..

장고 어드민 무료 테마 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

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..

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 테스트할 때 쓰는 팩..

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..

Q. CORS(Cross-Origin Resource Sharing)이란?

A. 보통 '교차 출처 리소스 공유'로 번역되며, 브라우저로 웹 애플리케이션에 접속했을 때 리소스(이미지, JSON 등)가 자신의 출처(Origin)와 다름에도 가져오는 경우를 뜻한다. 여기서 출처(Origin)는 도메인, 프로토콜, 포트를 뜻한다. 도메인, 프로토콜, 포트 중 하나라도 다르면 출처가 다른 것이다. 브라우저가 CORS 허용 여부를 확인하며, 확인된 경우 출처가 다른 곳에서 리소스를 가져와서 보여준다. 허용되지 않은 경우는 CORS 에러가 발생한다. 어디서 이슈가 발생할까? 브라우저에서만 발생한다. 브라우저가 CORS 허용 여부를 확인하기 때문이다. Android 앱이나 iOS 앱과는 관계 없다. 언제 이슈가 발생할까? 예를 들어 https://www.taptorestart.com 에 브라..

Q. ER Model, Entity-Relationship Model에서 Relationship의 의미는?

A. 부모 자식, 친구 등 흔히 말하는 관계다. 데이터베이스를 공부할 때 헷갈리게 만드는 원인이다. ER Model에서 Relationship은 진짜 관계다. 관계형 데이터베이스 Relational Database에서 Relation은 수학 용어다. 둘 다 한국어로는 관계라 더 헷갈린다. 영어로는 약간 차이가 있다. ER Model은 relationship이고, Relational Database에서는 relation이다. 그래서 관계형 데이터베이스에서는 관계라고 하지 않고 릴레이션이라고 영어 발음 그대로 적는 경우도 많다. ER Model 원 논문, The Entity-Relationship Model — Toward a Unified View of Data Peter Pin-Shan Chen이 쓴 원..

Q. 관계형 데이터베이스Relational Database에서 관계Relation는 어디서 나온 말일까?

A. 수학의 집합론에서 나온 말이다.부모 자식 사이의 관계, 사돈 관계 등 일반적인 관계를 뜻하는 '관계'에서 나온 것이 아니다. 관계형 데이터베이스의 시초, 에드가 커에드가 F. 커(Edgar Frank "Ted" Codd)는 관계형 데이터베이스의 아버지라고 불린다. 그 이유는 첫 상업용 관계형 데이터베이스 시스템인 오라클 데이터베이스Oracle Database가 바로 에드가 커의 논문의 영향을 받아 만들어졌기 때문이다. It was at this time that Ed Oates introduced Miner and Ellison to a paper by E. F. Codd on the relational model for database management. 번역: 이때 에드 오츠는 마이너와 엘리슨..

Q. 파이썬 팩키지 pika로 래빗엠큐RabbitMQ로 접속할 때 나타나는 에러는?

A. 연결 설정 오류로 StreamLostError: ('Transport indicated EOF',) 등 에러가 발생한다. 래빗엠큐 AMQP 기본 port는 5672다. 그런데 엉뚱한 port를 입력한다면? import pika connection = pika.BlockingConnection( pika.ConnectionParameters(host='localhost', port=3306)) channel = connection.channel() channel.queue_declare(queue='hello') channel.basic_publish(exchange='', routing_key='hello', body='Hello World!') print(" [x] Sent 'Hello World..

Q. 래빗엠큐RabbitMQ에서 ack의 의미는?

A. acknowledgment 확인, 인지란 뜻이다. 아래 출처를 보면 ack(nowledgement)란 표현을 볼 수 있다. 발음은 애크라고 읽는 것 같다. In order to make sure a message is never lost, RabbitMQ supports message acknowledgments. An ack(nowledgement) is sent back by the consumer to tell RabbitMQ that a particular message had been received, processed and that RabbitMQ is free to delete it. 출처: Message acknowledgment 파이썬 pika 팩키지를 활용할 경우 auto_ack..

Q. 파이썬으로 래빗엠큐RabbitMQ 메시지를 보내고 받고 싶다면?

A. pika 팩키지를 활용하면 된다. RabbitMQ 공식 홈페이지에 pika 튜토리얼이 있다. 튜토리얼 그대로 따라하면 쉽게 테스트를 해볼 수 있다. 도커로 RabbitMQ 실행하기 /Users/taptorestart 부분은 여러분의 경로로 수정하면 된다. 참고: rabbitmq dockerhub docker run --name rabbitmq \ -p 5672:5672 \ -p 15672:15672 \ -v /Users/taptorestart/rabbitmq:/var/lib/rabbitmq \ -d rabbitmq:3.11.10-management 이 때 중요한 것은 -p 5672:5672도 적어줘야 한다는 점이다. 실행했으면 접속하자. http://localhost:15672/ 로 접속하고 id,..

반응형