분류 전체보기
-
[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..
-
[Python] 이분/이진 탐색 (Binary Search)언어/파이썬 & 장고 2021. 6. 13. 21:19
이분 탐색 또는 이진 탐색은 찾고자 하는 수를 두 부분으로 나눠서 찾는 기법입니다. 따라서 순차 탐색(linear search) 보단 더 빠른 성능을 보입니다. 이분 탐색을 하기 위해선 주어진 탐색 리스트가 이미 정렬이 되어 있다는 전제가 깔려야 합니다. 아래는 이진 탐색의 탐색 순서입니다. 탐색 리스트가 정렬이 되어 있지 않다면 정렬 left, right, mid를 잡아줌 (리스트 첫 번째는 left, 리스트 마지막은 right, 리스트의 중간 값은 mid 여기서 값보단 리스트의 인덱스로 잡는 것이 더 범용적으로 사용할 수 있음 mid 값과 찾고자 하는 값 비교 mid값이 더 크면 right 값을 mid -1, mid값이 더 작으면 left값을 mid + 1로 세팅 left > right가 될 때까지 ..
-
[Java] Comparator와 Comparable언어/Java 2021. 6. 13. 19:20
Comparator와 Comparable은 둘 다 객체를 정렬할 때 사용할 수 있는 기능입니다. 먼저 아래와 같이 객체가 존재한다고 가정합니다. public class Image { private final int type; private final String url; private final int idx; public Image(int type, String url, int idx) { this.type = type; this.url = url; this.idx = idx; } public int getIdx() { return idx; } } 다음 아래와 같이 리스트에 위 객체들을 입력합니다. List images = new ArrayList(); images.add(new Image(3, "/i..
-
[SOLID] 개방 폐쇄 원칙이란 (Open-Closed Principle, OCP)공부 2021. 6. 13. 18:17
개방 폐쇄 원칙은 열림 닫힘 원칙이라고도 불리며다섯 가지 애자일 원칙(SOLID) 중 1개입니다. 해당 원칙은 확장에는 열려 있어야 하고 변경에는 닫혀 있어야 합니다. 즉, 기능을 추가/변경은 가능해야 하지만 이 기능을 사용하는 코드(기존 코드)는 변경하지 않아야 한다는 의미입니다. 만약 새로운 기능을 추가하려고 하는데 기존 코드를 변경해야 된다면 좋지 않은 설계이므로 OCP에 따라 분리를 진행해야 합니다. 아래와 같은 코드가 있다고 가정합니다. from abc import ABCMeta, abstractmethod class Character(metaclass=ABCMeta): def __init__(self, name: str): self.name = name @abstractmethod def se..
-
[SOLID] 단일 책임 원칙이란 (Single Responsibility Principle, SRP)공부 2021. 6. 13. 17:29
단일 책임 원칙이란 클래스는 단 1개의 책임만 가져야 하며 변경되는 이유도 1개여야 한다는 원칙입니다. 다섯 가지 애자일 원칙(SOLID) 중 1개입니다. 만약 한 클래스에 두 가지 기능을 담당하는 이유 때문에 수정이 된다면 이 클래스는 단일 책임 원칙에 위배되므로 두 클래스로 쪼개야 합니다. 이는 클래스 뿐만 아니라 함수형 프로그래밍에도 적용이 됩니다. 하나의 함수에서 담당하는 기능이 두 개 이상이라면 이 함수는 쪼개는 것이 추후 유지보수에 용이해집니다. 팩토리 패턴은 이러한 원칙을 잘 설명하는 디자인 패턴입니다. 아래와 같은 코드가 있다고 가정합니다. from typing import List def data_save(data_list: List[str]): data = '|'.join(data_li..
-
[Design Pattern] 커맨드 패턴 (Command Pattern)공부/디자인 패턴 2021. 6. 12. 19:02
커맨드 패턴은 특정 객체에 대한 커맨드를 객체화 하여 커맨드 객체를 필요에 따라 처리하는 패턴입니다. 보통 주체 객체 → 대상 객체 와 같은 방식으로 호출한다면 대상 객체에 대한 액션은 주체 객체에서 메소드로 처리하는데 이 액션을 객체로 만들어 처리하는 방식입니다. 실행될 기능을 캡슐화함으로써 여러 기능을 실행할 수 있어 재사용성이 높습니다. 또한 기능이 수정되거나 변경이 일어났을 때, 주체 객체의 코드 수정 없이 기능에 대한 클래스만 정의하면 되어 확장성이 유연해집니다. 클래스 다이어그램 Invoker: 기능의 실행을 요청하는 호출자 클래스. Client의 요청을 받아 Receiver의 액션을 호출. Command: 실행될 기능에 대한 인터페이스. 실행될 기능을 execute()로 정의 Concrete..