계층형 모델 테이블 설계(인접 모델, MPTT)
·
기타
카테고리, 부서 같이 계층형 구조로 표현되어야 하는 모델을 계층형 모델이라고 한다.계층형 모델을 표현하는 2가지 방법을 공부해보았다.인접 모델(Adjacency List Model)가장 간단하게는 이렇게 표현할 수 있다. 자식 노드에서 부모를 알고 있는것이다.CREATE TABLE category ( id SERIAL PRIMARY KEY, name VARCHAR(50) NOT NULL, level integer not null, parent_id integer, foreign key (parent_id) references category(id));  자식 노드인 니트는 상의의 id를 알고 있고, 상의는 부모 노드 옷의 id를 알고 있다.니트의 계층 구조는 옷 > 상의 > 니..
dotenv를 사용할때 주의해야할 점
·
카테고리 없음
dotenv로 .env파일에 있는 설정을 불러올때, dotenv.config()라는 함수를 쓰게 된다.여기서 config에 아무런 옵션을 주지 않으면, node를 실행한 디렉토리에서 .env 파일을 찾게 된다.// src.index.tsimport dotenv from 'dotenv';async function main() { dotenv.config(); // 로직}main();로컬에서 실행하는 경우에는 보통 프로젝트 루트 디렉토리에서 실행해서 문제가 없지만, 다른 디렉토리에서 node 명령어로 실행하는 경우 .env 파일을 찾을 수 없어 에러가 발생한다.// src.index.tsimport dotenv from 'dotenv';async function main() { const result ..
[Django] factory_boy
·
Django,Python
로컬에서 개발하다보면 더미 데이터들이 필요할 때가 있다. 간단하게 스크립트를 만들어서 이렇게 구현해줄 수 있는데, from post.models import Post def create_dummy_posts(): for i in range(100): Post.objects.create( title=f'title-{i}', content=f'content-{i}' ) 이 데이터들은 우리가 직접 값을 지정해줘야하고, 여러가지 케이스가 필요한 경우에는 대응하기 힘들다. 그래서 더미데이터들을 만들때 faker라는 라이브러리를 많이 사용하는데, factory_boy라는 모듈이 faker도 지원해주고, 장고 모델도 지원해줘서 소개해보고자 한다. factory_boy — Factory Boy stable docume..
[Python] Pickle
·
Django,Python
Python pickle Python 에서 pickling 한다는 것은 파이썬 빌트인 객체인 list, tuple 등을 binary 데이터로 만든다는 것이다. Pickling 한 객체를 다시 파이썬 객체로 역직렬화하면 파이썬에서 바로 쓸 수 있는 객체가 된다. import pickle if __name__ == '__main__': with open('test.bin', 'wb') as fw: pickle.dump({'test': 'test', 'list': [(1, 2), {3, 5, 6}]}, fw, protocol=5) with open('test.bin', 'rb') as fr: result = pickle.load(fr) print(result) print(result['test']) print..
[Django] Custom Command 만들기
·
Django,Python
장고로 개발할때 python manage.py 로 명령어를 실행한다. 예를 들면 runserver, shell, shell_plus 등등.. 이 명령어는 미리 지정된것만 사용할 수 있는게 아니라, 개발자가 직접 custom command를 추가할 수도 있다. 실습 1. /management/commands 에 command 파일을 만든다. post라는 앱이 INSTALLED_APPS에 등록되어있으면, manage.py command에 test_command가 등록된다. 주의 파일명이 _로 시작한다면 manage.py command에 등록되지 않는다. python manage.py 을 실행하면 django.core.management call_command가 실행되는데 여기서 load_command_cla..
[Django] on_delete=CASCADE
·
Django,Python
장고에서 모델을 만들때, on_delete=models.CASCADE라고 설정하면 외래 키의 주인 테이블이 drop 되거나, 행이 삭제되거나 했을때 자동으로 삭제되는걸로 생각한다. 아래의 예제를 보면 Product가 삭제되면 그 Product를 참조하고 있는 ProductItem도 같이 삭제될것이다. class Product(models.Model): title = models.CharField(max_length=40) repr_price = models.IntegerField() status = models.CharField(max_length=20) def __str__(self): return f'{self.title}({self.repr_price})' class ProductItem(model..
Datagrip에서 pg_dump로 export하기
·
데이터베이스
문제 Datagrip에서 Export with 'pg_dump' 를 사용하려고 하면, Path에서 실행할 수 없다고 뜬다. 해당 path에 pg_dump 라는 명령어가 존재하지 않기 때문이다. pg_dump 명령어를 사용하려면 libpq 를 설치해야한다. libpq 는 postgresql의 인터페이스를 제공하는 C로 작성된 프로그램이다. brew install libpq brew로 설치 후, 아래 명령어로 .zshrc에 PATH를 등록해주면 셸에서 pg_dump , psql 같은 명령어를 바로 사용할 수 있다. echo 'export PATH="/opt/homebrew/opt/libpq/bin:$PATH"' >> ~/.zshrc source ~/.zshrc 설치 후 which 명령어로 pg_dump 위치..
GraphQL Federation할때 null을 주의하자
·
기타
22년의 평화로운 어느날.. 😂 회사에서 상품 조회가 안된다는 이슈 알람이 지속적으로 발생했다. CloudWatch로 로그를 확인해보니 특정 페이지에서 graphql 응답이 data: null로 오고 있었다. 이런 경우는 처음이어서 여러가지 가설을 세워보았다. 1. graphql federation 할때 문제가 생겼을 것이다. 2. 데이터가 너무 많아서 타임아웃이 발생했을 것이다. 3. 쿼리가 잘못된 것이다. 일단 2, 3번은 가능성이 낮다. 타임아웃이 발생했다면 다른 오류 메시지가 발생했을것이고, 쿼리가 잘못된것이었다면 다른 page의 상품을 불러오는것도 똑같이 문제가 됐어야 한다. federation 문제를 제일 유력한 용의자로 생각하고 가설증명을 시작하였다. GraphQL Federation이란? ..
[Python] 파이썬의 typing
·
Django,Python
이전까진 타입 스크립트, 코틀린등을 쓰다가 파이썬으로 넘어올때 가장 불편했던건 타입이 없던것이었다. 처음 간단하게 스크립트를 작성할때는 편할 수 있지만 결국 혼자 작업하는게 아닌 이상 타입이 있는게 무조건 편하고 속도도 빠르다. 다행히 파이썬 3.5부터 타입 힌팅을 제공하는데 개발하면서 유용하게 쓸 수 있도록 정리해보았다. 타입의 등장 What’s New In Python 3.5 — Python 3.5.9 documentation configparser configparser now provides a way to customize the conversion of values by specifying a dictionary of converters in the ConfigParser constructor..
crontab으로 반복되는 task 만들기
·
인프라
crontab이란? 리눅스의 crontab을 사용하면 특정 시간마다 특정 작업을 할 수 있다. 예를 들어 일주일에 한 번 오래된 파일을 지운다거나, 파일을 갱신한다거나의 작업을 쉽게 구현할 수 있다. crontab 실습 실습을 위해 사이드 프로젝트를 운영중인 ec2에 접속한다(Amazone Linux) crontab -e 명령어로 crontab task를 등록할 수 있다. crontab 기본 문법은 아래와 같다. m h dom mon dow m: 분(0~59) h: 시(0~23) dom: day of month 날짜(1~31) mon: month 달(1~12) dow: day of week 요일(0~7) 일요일이 0이다. 테스트로 매 분마다 Hello World를 출력하는 task를 만들어보자 * * *..
togeepizza
Beyond the Now