전체 글
-
[Design Pattern] 방문자 패턴 (Visitor Pattern)공부/디자인 패턴 2021. 7. 25. 17:30
방문자 패턴은 방문자와 방문 공간을 분리하여 방문 공간이 방문자를 맞이할 때, 이후에 대한 행동을 방문자에게 위임하는 패턴입니다. 비슷한 객체에서 어떤 동작을 해야할 때 방문자 패턴을 사용하면 수행 로직을 분리할 수 있습니다. 즉, 데이터 구조와 연산을 분리하여 구조를 변경하지 않고 새로운 연산을 추가할 수 있습니다. 새로운 연산을 추가하고 싶으면 새로운 방문자를 추가하면 되는 형식입니다. 클래스 다이어그램 Visitor: Eliment를 방문하고 동작을 구현하기 위한 인터페이스 ConcreteVisitor1, 2: Visitor를 상속받아 실제 동작을 구현한 클래스 Element: visitor가 방문하여 수행해야 하는 대상. 구조를 구성하는 인터페이스 ConcreteElementA, B: Elemen..
-
[Design Pattern] 전략 패턴 (Strategy Pattern)공부/디자인 패턴 2021. 7. 24. 20:52
전략 패턴이란 각각의 알고리즘을 교환이 가능하도록 정의, 캡슐화를 한 다음, 서로 교환해서 사용할 수 있는 패턴입니다. 즉, 객체들이 할 수 있는 동작을 각각의 전략으로 만들어 놓고 동적으로 동작을 변경해야 한다면 전략만 변경하여 동작이 바뀌도록 하는 패턴입니다. 이러한 패턴을 사용하면 OCP에 위배되지 않고 시스템이 거대해졌을 때, 메소드의 중복을 해결할 수 있습니다. 클래스 다이어그램 Context: Strategy의 메소드를 호출해서 사용하는 클래스 Strategy: 전략을 사용하기 위한 인터페이스 ConcreteStrategyA, B, C: Strategy 인터페이스를 실제 구현하는 클래스 예시 먼저 아래와 같이 사람과 오리를 나타내는 인터페이스와 클래스가 있다고 합니다. cry 메소드를 호출하면..
-
[Django] transaction언어/파이썬 & 장고 2021. 7. 24. 18:20
트랜잭션이란 트랜잭션은 DB의 데이터 삽입, 수정 및 삭제를 진행할 때 성공과 실패가 분명하고 상호 독립적이며 일관되게끔 처리하는 기능입니다. 트랜잭션에 대해선 https://brownbears.tistory.com/181 에서 자세하게 설명하고 있습니다. Django의 transaction 장고에서도 transaction을 제공해주고 있습니다. django.db.transaction 파일에 존재하며 사용은 아주 간단합니다. 사용법 설명에 앞서 장고는 auto commit을 기본값으로 제공하고 있습니다. 즉, 코드에 트랜잭션이라고 명시가 안되어 있으면 insert, update와 같은 문장을 바로 DB에 commit을 진행합니다. 장고에서 auto commit을 기본으로 사용하는 이유 만약 기본적으로 a..
-
[Python] typing언어/파이썬 & 장고 2021. 7. 18. 18:29
python은 동적 타입으로 하나의 변수에 여러 타입의 값을 할당할 수 있습니다. 이는 편하기도 하지만 예상치 못한 버그를 발생시킬 수 있는데 3.5부터 지원하는 typing을 사용하면 ide나 mypy와 같은 라이브러리에서 예상하지 않는 타입을 확인할 수 있습니다. (하지만 typing 모듈을 사용한다고 해서 자바와 같이 컴파일 에러는 발생하지 않습니다.) 3.6 버전 부터는 변수에도 typing을 적용할 수 있는데 아래에서 어떻게 사용하는지 설명합니다. 여기서는 파이썬 3.8 버전 기준으로 설명을 합니다. 파이썬 3.9에서는 문법이 약간 변경되었는데 이는 아래에서 간략하게 설명을 하겠습니다. typing 변수 # from typing number: int = 1 name: str = '가나다' 만약 ..
-
[Design Pattern] 스테이트 패턴 (State Pattern)공부/디자인 패턴 2021. 7. 18. 17:14
스테이트 패턴은 상태를 관리하는데 도움을 주는 디자인 패턴입니다. 어떤 행동을 수행할 때, 상태에 맞는 행동을 수행하도록 처리하도록 합니다. 이러한 시스템을 클래스로 분리하고 각 클래스에서 행동에 맞는 수행동작을 구현합니다. 자바의 경우, 캡슐화를 위해 인터페이스를 생성해 시스템의 각 상태를 나타내는 클래스로 구현합니다. 예를 들어, 자판기에서 동전 있음, 동전 없음, 상품 품절, 상품 반환 과 같은 상태를 조건문으로 분기하여 처리하는 것이 아닌 각 상태를 클래스에 캡슐화하여 구현하는 방식입니다. 클래스 다이어그램 State: 시스템의 모든 상태를 제공하는 인터페이스. Context: state를 이용하여 역할을 수행하는 클래스. 현재 시스템의 상태를 나타내는 상태 변수(state)와 실제 시스템의 상태..
-
[Design Pattern] 메멘토 패턴 (Memento Pattern)공부/디자인 패턴 2021. 7. 17. 21:11
메멘토 패턴이란 객체의 정보를 저장하고 사용자가 원하는 시점의 데이터를 복원할 수 있도록 하는 패턴입니다. 클래스 다이어그램 Originator: 현재 상태를 저장하고 Memento 객체의 정보를 얻는 클래스 Memento: 상태를 갖고 있는 클래스 Caretaker: Memento 클래스를 순서대로 저장하는 클래스 예제 public class Memento { private final String state; public Memento(String state){ this.state = state; } public String getState(){ return state; } } public class Originator { private String state; public void setState(S..
-
[Python] metaclass란언어/파이썬 & 장고 2021. 7. 17. 19:08
python에서는 클래스도 객체입니다. 그렇다면 클래스를 만드는 클래스가 있다는 얘기인데 이러한 역할을 하는 것이 metaclass(이하 메타클래스)입니다. 메타클래스를 사용하면 클래스를 만들 수 있게 됩니다. 보통의 상황에서는 잘 사용하진 않지만 Django의 Model 객체에서 사용하고 있는 것을 볼 수 있습니다. 우리는 모르게 메타 클래스를 사용하고 있었는데 필드가 무슨 타입인지 확인할 때 사용하는 type()이 바로 메타클래스입니다. 즉, type()에는 타입이 무엇인지 와 메타클래스로서 클래스를 생성하는 2가지의 역할을 합니다. temp = type('aaa') temp2 = type('temp', (), {}) temp3 = type(int) print(temp) print(temp2) pri..
-
[Design Pattern] 중재자 패턴 (Mediator Pattern)공부/디자인 패턴 2021. 7. 11. 17:00
중재자 패턴은 클래스 간의 복잡한 관계들을 캡슐화하여 하나의 클래스에서 관리하도록 처리하는 패턴입니다. M:N 관계를 해당 패턴을 사용하면 M:1 관계로 만들어 복잡도를 내리므로 유지 보수 및 확장성에 유리합니다. M개의 객체들 사이에 중재자를 추가하여 중재자가 모든 객체들의 통신을 담당하도록 변경하면 중재자 패턴이라 볼 수 있습니다. 이와 같이 진행하면 각 객체들은 서로 알 필요가 없고 중재자 클래스가 관리하므로 느슨한 결합(loose coupling)을 유지할 수 있고 전체적인 흐름을 읽기 편해집니다. 단점으로는 특정 application에 맞춰져서 개발이 되기 때문에 재사용이 어렵습니다. 이와 유사한 패턴으로는 퍼사드 패턴(https://brownbears.tistory.com/507)과 옵저버 패..
-
[Python] psycopg2를 사용한 unnest insert와 execute_values 속도 비교언어/파이썬 & 장고 2021. 7. 10. 23:45
psycopg2 2.7 버전 이후부터 execute_values 함수가 추가되었습니다. https://www.psycopg.org/docs/extras.html#fast-execution-helpers 대량 insert를 하는 방법은 여러 방법이 있지만 copy문을 사용하지 않고 가장 빠른 방법은 https://brownbears.tistory.com/297 에서 설명한 것과 같이 unnest를 사용해 insert 하는 방법이 가장 빠릅니다. 그럼 여기서 추가된 execute_values 함수와 비교를 진행해 어떤 것이 가장 빠른지 비교를 해봅니다. 예시 테이블은 name::text, id::bigint 로 설정하였습니다. 100건 insert import psycopg2 import psycopg2.e..
-
[Design Pattern] 이터레이터 패턴 (Iterator Pattern)공부/디자인 패턴 2021. 6. 20. 20:18
이터레이터 패턴은 컬렉션의 구현 방법을 노출시키지 않고 그 안에 존재하는 모든 항목에 접근할 수 있도록 하는 패턴입니다. 이터레이터 패턴을 사용하면 컬렉션 내에 구현이 어떤지 몰라도 해당 객체에 접근해 반복 작업을 처리할 수 있습니다. for (int i = 0; i < arr.length < i++) { System.out.println(arr[i]); } 위에서 i는 arr이라는 배열의 위치를 나타내는 변수입니다. 이러한 기능을 추상화하여 일반화 한 것을 이터레이터 패턴이라 합니다. 클래스 다이어그램 iterator: 컬렉션의 요소들을 순서대로 검색하기 위한 인터페이스 ConcreteInterface: iterator 인터페이스 구현체 Aggregate: 여러 요소들로 구성된 컬렉션 인터페이스 Con..