반응형

전체 글 391

깃허브 커밋 메시지에서 특정 단어로 검색해서 엑셀 파일로 만들기

배경 팀 내에서, 코드 리뷰를 통해서 커밋을 한 경우 리뷰어의 이름을 커밋 메시지에 반드시 적기로 했다. 예를 들면 taptorestart란 사람이 리뷰를 했다면 커밋 메시지에 "taptorestart 리뷰 반영"이라고 적기로 한 것이다. taptorestart의 리뷰가 반영된 커밋수를 확인하려면 어떻게 해야 할까? 해결방법 git log 명령어로 커밋 메시지에 특정 단어가 들어 있는 커밋을 검색할 수 있다. 예를 들어 git log --grep="flask"라고 검색하면 아래처럼 나오는 것을 볼 수 있다. 매번 일일이 이렇게 확인할 수는 없다. 위 검색 결과를 엑셀로 만들고 싶다면? pandas를 활용해서 액셀 파일로 정리해서 만들 수 있다. 작업 코드 예다. import os import shutil..

개발 Dev/깃 Git 2023.06.17

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

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

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 서버 기준으로 설명하면 손님이 오래 기다리지 않도록 빠르게 대접하는 건 응답 속도이고, 맛이 일정한 것은 오류 없이 응답을 제공하는 것으로 볼 수 있다. 식당과 차이는 식당은 손님을 오래 기다리게 할 수는..

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. Python에서 함수나 구문의 속도를 측정하는 방법은?

A. cProfile을 이용해서 측정할 수 있다.출처: 파이썬 프로파일러 인라인 리스트 예아래 같은 코드를 추가하고 실행해보자.import cProfile def get_number_list(): number_list = [] for i in range(1000000): number_list.append(i) return number_list cProfile.run(statement="get_number_list()") cProfile.run(statement="[i for i in range(1000000)]") 실행결과 같은 숫자 배열을 얻는 경우인데, 인라인으로 처리한 경우가 약 4배 빠른 것을 확인할 수 있다. not A and not B와 not (A or B) 비교 예not A and not ..

Q. Pycharm에서 파이썬 Black 코드 포맷 자동 적용하는 방법은?

A. File Wathcer에 등록하면 된다. 출처: Black documentation: PyCharm/IntelliJ IDEA As file watcher Black 공식 문서에서는 black 적용 방법으로 As local server, As external tool, As file watcher 3가지 방법을 제시하고 있다. 이 중에서 File watcher가 자동 적용되어서 편하다. black 설치 MacOS 기준이다. 윈도우도 큰 차이는 없으니 위 공식 문서를 참고하자. $ pip install black $ which black black을 설치하고 which로 black 설치 위치를 확인할 수 있다. 내 경우는 파이썬 가상환경을 따로 만들어서 설치했기 때문에 아래와 같다. /Users/tap..

코드 리뷰와 결재 서류

코드 리뷰와 결재 서류를 비교하는 글은 많지 않다. 코드 리뷰는 특별한 무엇처럼 설명한다. 정말 다를까. 용어 비교코드 리뷰와 결재 서류 관련 용어를 살펴보자 코드 리뷰결재 서류작성 내용코드문서작성자개발팀원 누구나부하 직원검토자개발팀원 누구나상사승인 요청 방법코드 병합 요청(PR, Pull Request) 통해서결재 서류를 통해서승인 주체개발팀원 누구나상사 차이점은?결재는 상하관계가 명확하지만 코드 리뷰는 상대적으로 상하관계의 영향을 덜 받는다. 결재는 부하 직원이 상관한테 요청하는 단방향이지만, 코드 리뷰는 팀원이 다른 팀원이나 팀장에게, 팀장이 개발팀원들에게 리뷰를 요청하는 쌍방향이다. 물론 코드 리뷰에서도 당연히 상하관계 영향이 있다. 팀원이 CTO나 팀장의 리뷰를 더 반영하게 된다. 여기까지 보면..

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

출처까지 알려줘서 유용한 개발자를 위한 AI 검색엔진! phind.com

phind.com 첫화면The AI search engine for developers. 개발자를 위한 검색엔진. 이란 소개 문구가 보입니다. 실제 사용 예CORS preflight이 무엇인지 물었습니다. 아래 예처럼 생성 답변과 오른쪽에는 생성 답변을 만드는데 사용된 출처가 나타납니다. 생성 답변 끝에 [0] [1] 등을 누르면 새 창으로 출처 링크로 접속합니다. CORS preflight이란? 으로 물어도 영어로 답변이 나옵니다. CORS 사전요청이란 으로 질문하니 한국어로 답변을 얻을 수 있었습니다. 한국어도 지원되는 것을 알 수 있습니다. chatGPT처럼 질문에 따라 코드 예시도 제시해줍니다. 아래 예는 CORS preflight nginx setting이라고 질의한 결과입니다. phind.co..

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. 메타버스Metaverse의 어원은?

A. 1992년 출간된 닐 스티븐슨의 공상과학 소설 ‘스노 크래시’에서 meta와 universe의 합성어로 처음 사용되었다. 소설 속에서 메타버스가 등장한 부분을 살펴보자. 양쪽 눈에 보이는 모습에 약간의 차이를 두면 그림은 입체적으로 보인다. 1초에 그림을 72번씩 바꿔 주면 그림은 실제로 움직이는 효과를 낸다. 움직이는 입체 그림을 가로 2000픽셀 크기로 보여 주면 사람의 눈이 인식할 수 있는 최대치에 도달한다. 그리고 작은 이어폰을 통해 스트레오 디지털 사운드를 들려주면 움직이는 입체 화면은 완벽히 실제와 같은 배경음을 갖게 된다. 그러니까 히로는 전혀 다른 곳에 존재하는 셈이다. 그는 고글과 이어폰을 통해 컴퓨터가 만들어 낸 전혀 다른 세계에 있다. 이런 가상의 장소를 전문 용어로 ‘메타버스’..

기타 Etcs 2023.04.11

Q. 두 창을 띄워서 한쪽에서 수정 작업 중인데 삭제한다면 어떻게 처리하는 게 좋을까?

A. 알림을 띄우는 게 좋다. 그래야 다른 작업자가 무슨 일을 했는지 알 수 있기 때문이다. 구글 드라이브 예test란 글을 작성했다.다른 창에서 삭제를 했다.바로 알림이 떴다. 티스토리 예두창을 띄우고 카테고리 관리 쪽으로 들어갔다. 테스트 카테고리를 추가했다.테스트를 수정 중이고 다른 창에서는 카테고리를 삭제했다. 변경사항 저장을 눌렀다.수정 확인 버튼을 눌렀는데 해당 카테고리가 사라졌다. 알림은 없었다.

Q. staticmethod와 classmethod 데코레이터decorator의 차이는?

A. staticmethod는 클래스에 접근이 안 되고, classmethod는 접근이 된다. 메소드 위에 두 데코레이터를 사용할 경우 객체 생성 없이 바로 메소드를 사용할 수 있다. 예제쉽게 이해할 수 있는 예는 아래와 같다.class Calculator: PI = 3.141592 def sum(self, num1, num2): return num1 + num2 @staticmethod def static_sum(num1, num2): return num1 + num2 def get_circle_area(self, radius): return radius * radius * self.PI @classmethod def class_get_circle_area(cls, radius): return radi..

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. 번역: 이때 에드 오츠는 마이너와 엘리슨..

규모가 큰 개발조직의 발전을 위해서는 체계적인 안건 상정 및 논의 절차가 필요하지 않을까?

팀원 수와 피자 두 판Jeff Bezos instituted a rule: every internal team should be small enough that it can be fed with two pizzas. 번역: 제프 베조스는 규칙을 제정했다: 모든 내부 팀은 두 개의 피자로 충분히 먹을 수 있을 정도로 작아야 한다. 출처: The two-pizza rule and the secret of Amazon's success, Alex Hern, TheGuardian.com, 2018. 4. 24.제프 베조스의 규칙은 한 사람이 보통 2조각 정도 먹는다면 결국 한 팀은 8명 이내여야 한다는 뜻이다. 8명을 넘어서면 토론이 쉽지 않아 의사소통 시간과 비용이 급격히 커지기 때문이다. 8명을 넘어선 큰 ..

반응형