분류 전체보기
-
[Django] OuterRef, Subquery 사용할 때, .count() 오류 해결법언어/파이썬 & 장고 2020. 4. 27. 20:02
Select 절에 inner 쿼리 형태를 만들고 inner 쿼리의 결과로 count를 세고자 할 때 아래와 같은 쿼리를 짤 수 있습니다.SELECT id, title, (SELECT COUNT(tag.id) AS count FROM tag INNER JOIN post ON (post.id = tag.id) GROUP BY tag.id ) AS "count" FROM post 이러한 형태를 ORM으로 변형하면 다음과 같은 형태로 표현할 수 있습니다.from django.db import models from django.db.models import OuterRef, Subquery class Tag(models.Model): name = models.CharField(max_length=120) clas..
-
[Design Pattern] 컴포지트 패턴 (Composite Pattern)공부/디자인 패턴 2020. 3. 8. 17:59
컴포지트 패턴이란?객체들의 관계를 트리 구조로 구성하여 부분-전체 계층을 표현하는 패턴으로, 사용자가 단일 객체와 복합 객체 모두 동일하게 다루도록 하는 패턴입니다. 객체와 객체들의 집합 간의 처리 방법의 차이가 없을 경우 사용하면 됩니다. 여기서 컴포지트는 객체 또는 객체 집합을 트리 구조로 구성하는 의미입니다. 단일 객체와 복합 객체의 처리 방법이 다르지 않은 경우, 전체 - 부분 관계로 정의할 수 있는데 여기의 대표적인 예는 폴더-파일 구조입니다. 위 클래스 다이어그램을 폴더 - 파일 구조로 표현하면 아래와 같습니다.예시위 파일 구조를 아래와 같이 표현할 수 있습니다.// component interface Node { public String getName(); } // leaf class Fil..
-
[Design Pattern] 브리지 패턴 (Bridge Pattern)공부/디자인 패턴 2020. 3. 8. 17:03
브리지 패턴이란?브리지 패턴은 구현부에서 추상층을 분리하여 각자 독립적으로 변형 및 확장이 가능하도록 만드는 패턴입니다. 즉, 기능과 구현에 대해 두 개의 별도의 클래스로 구현합니다. Abstraction : 기능 계층의 최상위 클래스이며 추상 인터페이스RefindAbstraction : 기능 계층에서 새로운 부분을 확장한 클래스Implementor : Abstraction의 기능을 구현하기 위한 인터페이스 정의ConcreteImplementor : 실제 기능을 구현하는 클래스예시헬스장에서 운동을 하는 것으로 예시로 들어보겠습니다.먼저 기능 부에 운동하는 사람에 해당하는 exerciser가 존재하고 그 하위에 오직 하체만 하는 사람, 오직 상체만 하는 사람 (예시를 위해 극단적으로..)의 클래스가 있다고..
-
[Python] string concat vs list join 속도 비교언어/파이썬 & 장고 2020. 3. 8. 01:35
특정 템플릿에 문자를 매치 시킨 후, 해당 결과를 계속 더해 나가는 코드를 짜던 중, 방법은 여러가지인데 어떤게 속도가 더 빠를 지 궁금해서 비교를 해봤습니다.배경작업ES에 벌크로 호출할 데이터를 만들기 위해 아래와 같은 형태가 필요했습니다.POST _bulk {"update": {"_index": "product", "_type":"product", "_id":0}} {"doc": {"price":0, "margin": 0}} {"update": {"_index": "product", "_type":"product", "_id":0}} {"doc": {"price":0, "margin": 0}} .... {"update": {"_index": "product", "_type":"product", "_i..
-
[Django] ORM에서 Func()를 사용해 커스텀 DB 함수 구현하기언어/파이썬 & 장고 2020. 3. 7. 20:22
장고 ORM에서는 데이터베이스의 함수를 다수 지원합니다. 하지만 전부를 지원하는 것이 아니여서 지원하지 않는 함수를 쓸 땐, DB에서 데이터를 받아온 다음 파이썬 코드를 작성해야 합니다. 여기서는 Func()를 사용해 장고에서 지원하지 않는 DB 함수를 구현합니다. 먼저 장고에서는 pg의 unnest라는 기능을 제공하고 있지 않습니다. unnest는 어레이 타입의 컬럼 데이터를 인덱스 별로 각 row로 분리시켜주는 기능입니다. 데이터가 {1,2,3} 이렇게 1개의 row로 되어 있다면 unnest를 사용하여 3개의 row로 표현할 수 있습니다. (각 row는 1, 2, 3 으로 3개의 row)from django.db.models import Func temp = Test.objects.annotate(..
-
[Django] array_agg, string_agg, unnest ORM으로 구현하기언어/파이썬 & 장고 2020. 3. 7. 18:38
PostgreSQL에서 지원하는 array나 string 타입의 함수를 장고에서도 일부 지원을 합니다. 예를 들어, array 타입 함수의 unnest나 여러 row를 array로 변형하는 함수 등을 구현할 수 있습니다. 이러한 기능을 잘 사용하면 DB에서 가져온 데이터를 파이썬 코드로 반복문을 돌면서 형태를 변환하는 수고를 줄일 수 있습니다. 여기서는 복수 row를 가지는 컬럼을 단일 array로 만들거나 구분자를 주어 string 타입으로 변형하는 예시입니다.먼저 테이블 내 컬럼은 아래와 같습니다.testabc11223가나다array_aggfrom django.contrib.postgres.aggregates import ArrayAgg temp = Test.objects.aggregate( test..
-
[Django] 장고에서 concurrent.futures의 process 사용하기언어/파이썬 & 장고 2020. 3. 7. 17:39
장고의 ORM을 사용하지 않고 DB 패키지인 (여기서는 PG를 선택) psycopg2를 사용하여 구현한다면 아래와 같은 코드로 예시를 들 수 있습니다.from concurrent.futures import ProcessPoolExecutor import psycopg2 import psycopg2.extras from psycopg2.extensions import new_type, DECIMAL class MultiProcessTest: def __init__(self): db = {} # DB 정보 self.dsn = f"host='{db['HOST']}' port='{db['PORT']}' dbname='{db['NAME']}' user='{db['USER']}' password='{db['PASS..
-
[Design Pattern] 어댑터 패턴 (Adapter Pattern)공부/디자인 패턴 2020. 2. 29. 22:38
어댑터 패턴이란?한 클래스의 인터페이스를 다른 클래스에서 사용하고자 할 때, 다른 클래스에서 사용할 수 있도록 호환성을 제공해주는 패턴입니다. 예를 들어, 한국에서는 220v가 표준이지만 일본은 110v가 표준입니다. 한국에서 사용하는 충전기를 일본에 가져가면 콘센트의 모양이 맞지 않아 충전을 할 수 없습니다. 이 때, 돼지코와 같은 변환기(어댑터)를 사용해 한국에서 가져온 충전기를 일본에서 충전할 수 있도록 하는 기능이 여기서 말하는 어댑터 패턴이라 볼 수 있습니다.예시아래와 같이 한국전자제품 인터페이스와 삼성 클래스가 있다고 구현합니다.public interface KoreaElectronicProduct { public void 220v(); public void electricPressure();..
-
[Python] 추상화 클래스 ABC와 NotImplementedError 차이점언어/파이썬 & 장고 2020. 2. 29. 21:12
추상화 클래스 모듈인 ABC와 상속 받을 클래스의 함수 내에서 구현을 강제하는 NotImplementedError은 기능상 동일합니다. 상속을 받고 해당 함수를 정의하지 않으면 에러를 발생 시킵니다. 여기서 미묘한 차이가 나오는데 어떤 차이가 있는지 설명합니다.추상화 클래스 ABC 예시ABC 모듈은 파이썬 내장 모듈로 기능을 제공하고 있습니다.from abc import ABCMeta, abstractmethod, ABC class DBManager(metaclass=ABCMeta): @abstractmethod def connect(self): pass # 또는 class DBManager(ABC): @abstractmethod def connect(self): pass class MySQL(DBMan..
-
[Design Pattern] 팩토리 패턴 (Factory Pattern)공부/디자인 패턴 2020. 2. 29. 20:15
팩토리 패턴이란?객체를 만들어 반환하는 함수를 생성자 대신 팩토리 형태로 제공하여 초기화 과정을 외부에서 보지 못하게 숨기고 반환 타입을 제어하는 방법입니다.일반적으로 자바에서는 객체를 아래와 같이 생성합니다. SomeClass someClassObject = new SomeClass (); 위 선언의 문제는 SomeClass의 객체를 사용하는 부분에서 SomeClass의 구현에 의존성이 생기는 것입니다. new를 사용하여 객체를 생성하는 부분은 문제가 없지만 코드를 구체적인 구현 클래스에 결합하여 제공을 하게 됩니다. 이러한 경우는 구현 문제가 아닌 인터페이스에 대한 코드 위반입니다. 더 자세하게 나무위키에 나온 예시를 봅니다. (https://namu.wiki/w/%EB%94%94%EC%9E%90%E..