다시 시작 Tap to restart 386

FastAPI 바탕 프로젝트: 이메일 회원 가입과 JWT 토큰, MySQL 사용

Full Stack FastAPI and PostgreSQL - Base Project Generator, MIT License을 바탕으로 다른 프로젝트의 시작점이 될 수 있는 베이스 프로젝트를 만들었다. 주요 기능 주요 기능은 다음과 같다. - 이메일과 비밀번호로 회원가입 - 비밀번호 암호화 - 관리자(superuser) 생성 - JWT 토큰으로 사용자 식별 및 권한 제어 - ORM 적용 - MySQL 사용 프로젝트 루트 디렉터리에 .env 파일을 만들어서 저장해둬야 정상 작동한다. .env 파일 예는 아래와 같다. 데이터베이스 정보와, 비밀키, 첫 관리자 생성 정보다. USERNAME=admin PASSWORD=verysecret HOST=localhost PORT=3306 DATABASE=app S..

Q. FastAPI에서 pytest 할 때 ModuleNotFoundError: No module named 'fastapi' 오류 해결 방법은?

A. python -m pytest 라고 실행하거나 터미널 창을 닫았다가 다시 열고 실행하면 된다. 아래처럼 에러가 나타난다. 해결 방법은 터미널창을 닫았다가 다시 열고 실행하면 된다. 터미널창이나 PyCharm 같은 IDE를 닫고 다시 실행하기 귀찮다면 python -m pytest 라고 실행하면 정상 작동한다. pytest 설치 직후에 pytest.ini 파일을 만들고 아래와 같은 test.py를 실행해 보면 pytest.ini [pytest] addopts = -s test.py import sys def test(): print(sys.path) assert True 해당 디렉터리 아래 만들어 놓은 파이썬 가상환경 venv 내의 site-packages가 없다. 그래서 fastapi 모듈이 없다고..

Q. HTTP PUT 메소드와 PATCH 메소드의 차이는?

A. PUT은 새로운 리소스를 생성하거나 대상 리소스를 나타내는 데이터를 대체, PATCH는 일부 수정할 때 사용한다. (출처: MDN Web Docs PUT, MDN Web Docs PATCH) 위 설명에서 중요한 건 리소스를 생성도 한다는 점이다. 대상 리소스가 없으면 PUT은 새로 생성한다. 있다면 바꾸고. PUT은 없으면 Add, 있다면 Replace 교체 느낌이다. PATCH는 수선 고치는 Update 느낌이다. 실제 코드에서는 PUT을 PATCH처럼 쓰는 경우를 많이 볼 수 있다. 유명한 개발자들도 그렇게 쓰는 경우도 발견할 수 있다. PUT을 PATCH처럼 쓰는 예 (출처: full-stack-fastapi-postgresql) @router.put("/me", response_model=s..

백엔드 Back-end 2022.02.27

Q. var와 let의 가장 큰 차이는? var보다 let을 써야 하는 이유는?

A1. let은 let을 선언한 블록과 그 하위 블록을 스코프로 가진다. var는 var 선언을 포함한 함수까지 스코프로 가진다. 참고: MDN Web Docs let function varTest() { var x = 1; if (true) { var x = 2; // 같은 변수! console.log(x); // 2 } console.log(x); // 2 } function letTest() { let x = 1; if (true) { let x = 2; // 다른 변수 console.log(x); // 2 } console.log(x); // 1 } 코드 출처: MDN Web Docs let 위 예제가 let과 var의 차이를 보여준다. var로 변수를 선언할 경우 보통 의도하지 않은 결과가 나타..

Q. github에 push해서 데이터베이스 계정과 비밀번호가 노출되었다면 어떻게 해야 할까?

A. git reset --hard {commithash} 하고 나서 git push --force origin 하면 된다. 앗! 비밀번호를 그대로 올린 것을 발견했다. git reset --hard b0ce9e5a10c5f93ec619083db05d6dbd3776d261 위 명령어로 b0ce9e5로 시작하는 Create .gitignore로 reset을 한다. 그렇게 하면 Create .gitignore 다음에 커밋한 내용은 사라지게 된다. 그리고 강제로 push를 한다. --force를 붙여야만 된다. git push --force origin 위 명령어를 깃허브 데스크탑 같은 클라이언트 프로그램을 쓰지 않고 터미널에서 하게 된다면 Username for 'https://github.com': tap..

개발 Dev/깃 Git 2022.02.24

Q. FastAPI에서 MySQL unsigned integer 길이 11로 하는 방법은?

A. Column(INTEGER(display_width=11, unsigned=True), primary_key=True, index=True)로 설정하면 된다. 위처럼 설정하기 위해서는 INTEGER를 불러와야 한다. 아래 코드가 그 예이다. from sqlalchemy.dialects.mysql import INTEGER class User(Base): __tablename__ = "users" id = Column(INTEGER(display_width=11, unsigned=True), primary_key=True, index=True) email = Column(String(255), unique=True, index=True) hashed_password = Column(String(255..

Q. 카페24나 고도몰 같은 쇼핑몰 솔루션에 광고주로서 포스트백 구현하는 방법은?

A. 쿠키cookies와 리버스 프록시 서버Reverse proxy server를 활용해서 구현할 수 있습니다. 개발자를 위한 튜토리얼로 문제에 대한 접근법과 만났던 이슈를 기록해 뒀습니다. 각 쇼핑몰마다 디자인도 다 다르고 코드도 다 다를 수 있어서요. 포스트백(Postback)이란? 매체사한테 광고주가 수집된 데이터를 전달하는 것을 포스트백이라고 합니다. 아프리카TV의 포스트백 구현 요청을 받게 되어서 저도 알게 되었네요. 매체사는 아프리카TV가 되고요. 광고주는 광고 해달라고 요청한 회사가 됩니다. 포스트백 사례 제가 mymall.co.kr 이란 쇼핑몰을 adtv란 회사에 광고를 의뢰한 경우를 생각해 봅시다. adtv의 라이브방송을 통해서 구매가 발생할 경우에 전 구매 금액의 10%를 수수료로 주기..

Q. NestJS에서 앱이 구동될 때 실행되도록 하는 방법은?

A. onApplicationBootstrap()을 활용하면 된다. 참고: NestJS Lifecycle Events NestJS에서는 의존성 주입을 많이 쓰기 때문에, 의존성 주입하는 클래스를 new로 인스턴스를 생성해서 main.ts에서 실행하기는 쉽지 않다. 등록된 모듈 파일 중 하나에 아래 코드를 넣어보자. onApplicationBootstrap() { console.log('Test onApplicationBootstrap'); } 그리고 npm run start:dev를 실행하면 쭉 뜨는 사이에 위 로그가 찍히는 것을 볼 수 있을 것이다.

Q. NestJS gRPC 클라이언트 구현에서 "The invalid gRPC service (service not found)" 에러 원인은?

A. service명이 잘못 되어서 그렇다. 여기서 service명은 gRPC 서비스명이다. 예를 들어서 아래와 같은 hero.proto 파일이 있다. (출처: nestjs microservices gRPC) syntax = "proto3"; package hero; service HeroesService { rpc FindOne (HeroById) returns (Hero) {} } message HeroById { int32 id = 1; } message Hero { int32 id = 1; string name = 2; } 여기서 서비스명은 'HeroesService'이다. 팩키지명은 'hero'이다. service ABCD { rpc FindOne (HeroById) returns (Hero) ..

FastAPI 디렉터리 구조를 어떻게 하는 게 좋을까?

프로젝트명으로 저장소를 만들고 클론을 떠서 로컬에서 개발을 시작하고 나면, 디렉터리 구조부터가 고민이 되기 시작한다. django나 nestjs 등의 경우 CLI 명령어를 치면 자동으로 쭉 디렉터리와 기본 파일들을 만들어준다. 그런 경우 고민이 덜하다. 그 틀에 맞춰서 따라가면 되니까. 하지만 FastAPI의 경우 아직 그런 기능이 없는 거 같다. PyCharm을 쓰고 있어서 새 프로젝트 만들기를 누르고 FastAPI를 선택했지만 별 거 없다. 그냥 main.py와 test_main.http 파일 두 개와 venv 디렉터리만 생기고 끝이다. FastAPI로 개발할 때 과연 어떤 디렉터리 구조가 좋을까? FastAPI 개발자인 Sebastián Ramírez(tiangolo)의 예제 프로젝트가 있다. fu..

백엔드Back-end 개발자를 위한 학습 자료 체계적 정리하기

블로그든 위키든 노션이든 개발자는 학습한 자료를 꾸준히 정리해야 합니다. 정리할 때 체계가 있으면 편리합니다. 아래 체계는 예시입니다. 제 개인적인 기준에서 카테고리를 나눈 예입니다. 꼭 이대로 하실 필요는 없을 거 같습니다. 백엔드 개발자한테 주로 요구하는 내용들, 또는 공부하게 되는 내용들을 넣어 봤습니다. 컴퓨터 과학 - 자료구조 - 알고리즘 - 디자인패턴 - 네트워크 - 운영체제 프로그래밍 언어 - C - Java - Javascript - Python ... 백엔드 - 프레임워크 - Springboot - Nodejs - Django ... - 통신 - REST - 메시지큐 - gRPC - 데이터베이스 - MySQL - Oracle ... 클라우드 - AWS - Azure - GCP ... 기타..

Q. 노션Notion 페이지에 구글 애널리틱스Google Analytics 사용하는 방법은?

A. 노션에서 구글 애널리틱스 사용하기란 글을 참고하면 노션 페이지에 구글 애널리틱스를 달 수 있습니다. 그런데 이런 질문을 할 수 있습니다. Q. 노션 페이지에 구글 애널리틱스를 왜 사용해야 하나요? 개인 문서 관리용 노션 페이지라면 굳이 구글 애널리틱스가 필요 없습니다. 하지만 공개한 페이지이고, 기업에서 쓰는 페이지라면 구글 애널리틱스를 사용하면 좋습니다. 하루에 얼마나 들어오고 어떤 기기로 들어오는지 등 정보를 얻을 수 있어서요. 실제로 요즘 많은 기업에서 노션 페이지를 채용 페이지로 쓰고 있으니까요. 튜토리얼 1. 구글 애널리틱스 가입 구글 애널리틱스에 가입합니다. 2. 계정 만들기 계정을 만드세요. 3. 속성 만들기 잠깐! 속성 만들기가 중요합니다. 기본 애널리틱스 4 속성의 경우에는 제가 테..

점들을 연결한다는 것

점들을 연결하는 것, 'connecting the dots'는 스티브 잡스가 스탠포드 대학 졸업식 연설 때 한 말이다. 그 유명한 "Stay Hungry. Stay foolish." 문장을 말한 바로 그 연설이다. 스탠포드 대학 졸업식 연설에서 잡스는 세 가지 이야기를 말했다. 그 중 첫 번째 이야기가 바로 점들을 연결하는 것에 관한 이야기다. 잡스가 말한 점dot은 무엇일까. 점들을 연결한다는 것은 어떤 의미일까? 잡스의 점들 잡스는 입양아였다. 노동계급이었던 양부모 밑에서 비싼 리드대학을 다니기에는 부담스러웠다. 그래서 잡스는 리드대학을 6개월만 다니고 자퇴했다. 그 뒤에는 18개월 동안 머물다가 진짜로 그만뒀다. 대학을 자퇴하니 흥미가 없던 필수과목을 듣지 않아도 되었다. 대신 흥미를 끈 서체 수업..

성실한 사람과 게으른 사람 중 누가 생산성이 높을까?

Q1. 다음 두 사람 중에서 어떤 사람이 더 생산성이 높을까? 1. 성실한 사람 2. 게으른 사람 당신의 생각이 궁금하다. 두 사람 중 어떤 사람이 더 생산성이 높다고 생각하는가. 왜 그렇게 생각하는가. 다른 질문을 던져보자. Q2. 다음 두 사람 중에서 어떤 사람이 더 생산성이 높을까? 1. 컴퓨터에 설치된 기본 웹브라우저를 쓰는 사람 2. 기본 웹브라우저를 쓰지 않고 크롬이나 파이어폭스 등 다른 브라우저를 쓰는 사람 당신의 답은? 왜 그렇게 생각하는가. 첫 번째 질문은 '성실'과 '게으름'이란 단어 자체가 추상적이라 1번이 정답이라고 하기도 애매하고 2번이 정답이라고 하기도 사실 애매하다. 두 번째 질문의 경우 실제 조사 결과가 있다. 크롬이나 파이어폭스를 사용하는 사람들이 업무 능력과 성과가 더 좋..

Q. Postman으로 POST해서 생성한 id 받아서 PATCH DELETE 테스트할 수 있을까?

A. 있다. 가능하다. Tests 탭을 눌러서 코드를 입력하면 환경변수에 등록할 수 있다. 코드 예는 아래와 같다. var jsonData = pm.response.json(); pm.environment.set('article_id', jsonData['id']); pm은 포스트맨 객체이고, response는 응답이다. 거기서 json을 jsonData로 저장한 것이고, 새로 생성된 'id'를 받아서 'article_id'로 환경변수에 저장하게 된다. 이 해당 환경변수를 다음 PATCH나 DELETE에 사용하면 된다. 아래처럼 id 입력 자리에 {{article_id}}를 입력하면 환경변수로 저장한 article_id를 불러오게 되고 방금 POST한 데이터를 수정할 수 있게 된다. PATCH http:..

Q. 구구단을 반복문을 사용하지 않고 구현할 수 있을까?

A. 구현할 수 있다. 재귀함수를 활용해서. 재귀함수로 구현한 구구단 예. max_number1 = 9 max_number2 = 9 def get_multiplaction(number1, number2): print(f'{number1} X {number2} = {number1*number2}') if number2 < max_number2: return get_multiplaction(number1, number2 + 1) else: number2 = 1 print() if number1 < max_number1: return get_multiplaction(number1 + 1, number2) get_multiplaction(2, 1) 클래스로 구현한 예

소수 목록 구하기와 에라토스테네스의 체

소수 목록 구하기 소수는 약수가 1과 자기 자신뿐인 수를 말한다. 그래서 소수는 2, 3, 5, 7 등이다. 4는 약수가 1, 2, 4라 소수가 아니다. 10까지 소수를 구하라는 문제가 있을 때, 가장 쉽게 떠오르는 방식은 소수의 정의대로 2부터 시작해서 자기 자신보다 작은 수까지 쭉 나눠보는 거다. 2는 소수 3은 2까지 나눠서 안 떨어지니 소수! 4는 2부터 나눠서, 2로 바로 나눠떨어지니 중지. 5는 2부터 4까지 나눠서 안 떨어지니 소수! 이렇게 구현하면? 코딩 테스트에서 시간초과로 떨어진다. 너무 오래 걸리니까. 이럴 때 검색이 필요하다. 소수 구하기를 검색하다보면 에라토스테네스의 체가 나온다. 에라토스테네스의 체란? 고대 그리스 수학자 에라토스테네스가 발견한 소수를 찾는 방법이다. (출처: 위..

자료 구조 - 단일 연결 리스트 Singly Linked List, 파이썬으로 구현한 단일 연결 리스트 예제

연결 리스트Linked List란? 각 노드(node)가 데이터와 포인터를 가지고 한 줄로 연결된 자료 구조. 참고: 위키백과 연결 리스트 그렇다면 노드란? 위 그림에서 네모 두 칸이 노드다. 12가 데이터, 다른 노드를 가리키고 있는 화살표가 바로 포인터다. 파이썬 노드 코드 예 노드를 한 줄로 연결하게 되면 연결 리스트가 된다. 연결 리스트 중 포인터가 하나인 경우가 단일 연결 리스트이다. 단일 연결 리스트 파이썬 구현 예 아래는 파이썬으로 구현한 단일 연결 리스트 예이다. 앞에서 살펴본 스택이나 큐보다 훨씬 복잡하다. 노드란 객체를 만들어서 연결하기 때문에 더 복잡해 보인다. 코드를 이해하기 위해서는 천천히 살펴볼 필요가 있다. 그렇다면 왜 연결 리스트를 사용할까? 많은 프로그래밍 언어에서 배열이란..