postgres, django_rq.enqueue, collections.counter, 그리고 docker로 환경설정..

2020. 2. 29. 02:21개발/오늘의 소소한꿀팁

1.postgres

 postgres에서 여러개의 row를 다룰때(특히 insert into?) cur.executemany를 사용하면 한번의 쿼리로 여러개의 row를 처리할 수 있다.( 이거 검색하기전에는 for문으로 넣어야 하는 바보 같은 생각을 했다.)

 

2. django_rq.enqueue

django_rq.enqueue를 사용하면 django 내부에서 query를 처리할 때 queue형식으로 처리하여 좀 더 효율적인 query가 가능해진다고 한다. 한국말로 비동기 작업이라고 한다. 예를 들면, 어떤 서비스에 회원가입을 할 때 인증과정이 필요하다. 이 인증까지의 과정동안에 다른 작업도 처리할 수 있게 하는 것이 비동기 작업이라고 한다. 이건 직접 써보면서 더 익혀봐야 할 것 같다.

참고: https://paikgyeong.tistory.com/17

 

3. collections.counter

이건 말그대로 소소한 꿀팁. collections.Counter(list)를 해주면 List의 각 원소들의 갯수를 dictionary형태로 반환해준다.

 

4.docker

요즘 docker, db(서비스는 postgres), django, 그리고 ai model을 익히기 위해 훈련 텍스트들에 대해 카테고리를 훈련시키고 새로운 텍스트를 넣으면 predict해주는 서비스를 만드려고 개인 프로젝트를 진행중인데, 환경설정부터 쉽지 않다. 사내에서 docker를 쓰는건 기존의 것을 조금씩 변형하는 거니 대충대충 이해해도 괜찮았지만, 내가 처음부터 시작하려니 만만치 않다.

 

우선 현재까지 완성한 docker-compose 파일은 다음과 같다.

version: '3'

networks:
  frontend:
  backend:

volumes:
  redisdata:
  pgdata:
  pgvectordata:

services:
  postgres:
    image: postgres
    expose:
      - "5432"
    volumes:
      - pgdata:/var/lib/postgresql/data/
    networks:
      - backend
    environment:
      - POSTGRES_DB=postgresdb
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
      - POSTGRES_INITDB_ARGS=--encoding=UTF-8
  kodeepspeed:
    build: ./kodeepspeed
    command: python manage.py runserver 0.0.0.0:8000
    volumes:
      - ./kodeepspeed:/app
      - ./model:/app/django_server/swallow/model
      - ./data:/app/django_server/swallow/data
      - ./model_src:/app/django_server/swallow/src
      - ./bert_pretrained:/bert_pretrained
    ports:
      - "8000:8000"
    depends_on:
      - postgres
    env_file: .env
    networks:
      - backend
      - frontend

먼저, network! docker는 default로 app내의 networking을 위해 network 하나를 개설한다. 각 network에 설정되어 있는 각 container들은 같은 network 안에서 통신이 가능하다. 그렇다면 바로 expose와 port의 개념을 알아야 한다. expose는 숫자 하나만 적혀있는데, 이는 해당 container의 그 숫자에 해당하는 port번호를 열어준다는 것이다. 즉, 위에서 postgres container는 backend라는 network를 통해 통신을 하는데(host와도) 그 창구로 자신의 5432번을 열어둔다는 것이다.(postgres의 default값이 5432라고 한다.)  ports는 숫자 두개로 이루어져 있는데, 앞의 숫자는 network의 port번호, 뒤의 숫자는 자신의 port번호이다.

(참고:https://docs.docker.com/compose/networking/)

 

위의 volumes는 docker가 껐다 켜도 그 안의 데이터는 그대로 남아있도록 데이터들을 저장하는 공간을 설정해주는 것이다.

 

build는 docker build를 할때 실행시키는 파일(혹은 폴더)를 설정. 위에서 kodeepspeed라는 container는 kodeepspeed라는 folder를 기반으로 하는 container이다. postgres라는 container는 postgres image를 그대로 쓰는 것.