문제 https://www.acmicpc.net/problem/7569 7569번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100, www.acmicpc.net 문제 풀이 import collections import sys M, N, H = map(int, sys.stdin.readline().split()) tomato = [[] for _ in range(H)] queue = collections.deque([]) for h in range(H): for y in range(N): temp = list(map(int, s..
문제 https://www.acmicpc.net/problem/11724 11724번: 연결 요소의 개수 첫째 줄에 정점의 개수 N과 간선의 개수 M이 주어진다. (1 ≤ N ≤ 1,000, 0 ≤ M ≤ N×(N-1)/2) 둘째 줄부터 M개의 줄에 간선의 양 끝점 u와 v가 주어진다. (1 ≤ u, v ≤ N, u ≠ v) 같은 간선은 한 번만 주 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 노드별로 방문 결과에 대해 방문결과 값을 업데이트 하고 방문결과가 있는 노드는 skip 하고 방문 안한 노드는 방문해서 총 몇번 반복 되는지 문제 풀이 import sys from collections import deque N, M = map(int, sys.stdin.readline().st..
문제 https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능하다. 입력 조건으로 토마토는 1개이상이 들어갈수 있기 때문에 bfs 실행 전에 토마토의 위치를 큐에 넣어줘야 한다. 그 이후에 bfs 함수에서 인접열 방문시에 0(익지않은 토마토) 값이라면 기준열 토마토가 익는데 걸리시간에서 +1일을 해준다. bfs 종료 후 만약 graph 내에 0이 아닌 값이 있다면 -1로 인해서 인접열 방문 실패한 경우..
문제 https://www.acmicpc.net/problem/1012 1012번: 유기농 배추 차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 graph[y][x] == 1 인 곳에서 검색을 시작하여 인접한 부분을 모두 0으로 변경한 뒤에 count++ 문제 풀이 import sys from collections import deque T = int(sys.stdin.readline().strip()) dx = [0, 0, 1, -1] dy = [1, -1, 0, 0] for _ in range(T): M, ..
문제 https://www.acmicpc.net/problem/2667 2667번: 단지번호붙이기 과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여 www.acmicpc.net 문제 해결방법 bfs 로 해결 가능 graph[i][j] 가 1인 곳에서 검색을 시작해서 인접한 부분을 찾고 종료시 count return 문제 풀이 import sys from collections import deque N = int(sys.stdin.readline().strip()) boards = [] for _ in range(N): boards.append(list(map(int,..
Web RTC Web RTC (Web Real-Time Communication)는 웹 브라우저 간에 플러그인의 도움 없이 서로 통신할 수 있도록 설계된 API이다. W3C에서 제시된 초안이며, 음성 통화, 영상 통화, P2P 파일 공유 등으로 활용될 수 있다. 두레이 화상회의도 Web RTC 를 이용해서 구현 되어 있다. 통신 방법 Web RTC 는 P2P 통신에 최적화 되어 있으며 크게 3가지 클래스로 실시간 데이터 교화이 이루어진다. MediaStream - 카메라/마이크 등 데이터 스트림 접근 RTCPeerConnection - 암호화, 대역폭 관리 및 오디오, 비디오 연결 RTCDataChannel - 일반적인 데이터 P2P 통신 위 3가지를 통해서 데이터 교환이 이루어 지며 RTCPeerCon..
Json Web Token JWT 는 요청자/응답자 간에 JSON 객체를 안전하게 전송할 수 있는 간결하고 자기 포함된 개방형 표준(RFC 7519) 정보는 디지털 서명되어 있어 신뢰할 수 있으며 Secret(HMAC 알고리즘), RSA나 ECDSA 를 이용한 public/private 키를 이용하여 서명할 수 있다. JWT 사용 하는 케이스 Authorization JWT를 사용하는 흔한 케이스. 유저 로그인 후, 요청에 대해서 JWT가 포함 될 것이고 이를 통해서 route, service, resource 등 허용/비허용 제한할 수 있다. Single Sign On 은 도메인간에 쉽게 사용 가능하며 작은 자원을 사용해 최근 많이 사용 된다. Information Exchange JWT는 요청/응답간..
비동기 메시징 패턴 응용 통신 비동기 메시징은 메시지 브로커를 사용하는 경우 브로커 없이 서비스가 직접 하는 경우가 있다. 메시지 메시지는 Header와 Body 로 구성. 브로커를 사용하는 경우 메시지 채널을 통해서 교환 된다. 메시징 상호작용 클라이언트/서비스는 한 쌍의 메시지를 주고받는 비동기 요청/응답 스타일로 상호작용 한다. 클라이언트는 수행 작업과 매개변수를 메시징 요청 채널에 보내고 서비스는 요청 처리 후 메시지 응답 채널로 응답 한다. 클라이언트 → 요청 채널 → 서비스 → 응답 채널 → 클라이언트 구현 방법 단방향 알림 비동기 메시징을 이용하여 클라이언트만 서비스에 요청하고 서비스는 응답 하지 않음 발행/구독 메시징은 발행/구독 스타일을 기본 지원한다. 클라이언트는 여러 Consumer가..
MSA 프로세스 통신 2 부분 통신 실패 : 회로 차단기 패턴 항상 서비스는 실패할 가능성에 대해 오픈 마인드다. 한개 서비스 호출 불가는 전체 서비스에 대해 영향을 미침으로 서비스 부분 실패가 전체에 영향 가지 않도록 설계를 해야 한다. RPI 프록시 설계 Netflix는 다음과 같이 실패에 대해 처리한다. 네트워크 타임아웃: 응답에 대해 항상 Timeout 설정, 불필요한 리소스 사용 방지 미처리 요청 개수 제한: 최대 요청 횟수를 설정하여 초과시 요청을 포기하도록 한다. 회로 차단기 패턴: 서비스에 성공/실패에 대해서 counting을 하고 일정 임계치를 초과하면 그 이후에 요청은 포기한다. 부분 실패시 미리 정해진 default 값이나 캐시된 값 등을 반환하는 방법이 있다. 서비스 디스커버리 클라..
MSA 프로세스 통신 IPC 개요 통신 상호작용 기준 첫번째 일대일: Client의 요청은 한개의 서비스가 처리 일대다: Client의 요철을 여러개의 서비스가 처리 두번째 동기: Client가 서비스에게 요청하고 응답 대기를 하며 블로킹도 할 수 있음 비동기: Client가 블로킹 하지 않으며 응답은 바로 하지 않아도 됨 통신 상호작용 종류 요청/응답 : Client는 서비스에 요청을 하고 응답 대기. 강한 결합의 상호작용 스타일 비동기 요청/응답 : Client는 서비스에 요청을 하고 서비스는 비동기적으로 응답 단방향 알림 : Client는 요청만 하고 서비스는 응답을 하지 않음 API 설계 API 기능 추가/변경/삭제 등을 통해서 충분히 변경될 수 있다. 따라서 이런 문제를 해결하기 위해서 프로젝트..
마이크로서비스 아키텍쳐 3단계 프로세스 1단계는 요청을 추출, 요청에 대해서 추상적으로 관찰 해야 합니다. 2단계는 어떻게 서비스로 분해할지 결정 해야 합니다. 3단계는 서비스별 API를 정의하고 서비스에 역할 배정 및 서비스간 협동에 대해서 정의를 해야 합니다. # 1단계. 시스템 작업 식별 시스템 작업을 기술하기 위한 고수준 도메인 모델을 생성한다. 위 그림을 통하면 이는 Order, Delivery, Restaurant 로 추출할 수 있다. 고수준의 도메인 모델로 나누기 위해서는 시나리오 작성을 통해서 하는 방법이 있다. 전제 (Given) - 소비자가 있다. - 음식점이 있다. - 음식점은 소비자의 주소로 음식을 배달 한다. - 주문 총액은 최소 주문량 조건에 부합해야 한다. 조건 (When) -..
분해전략 애플리케이션의 아키텍쳐는 여러 파트로 분해와 파트들의 연관성 이 두가지 때문에 중요하다. 업무와 지식을 분리하여 효과적으로 팀을 이루어 생산적인 작업을 할 수 있고 어떻게 상호작용 하는지 알 수 있다. # 소프트웨어 아키텍쳐 4+1 뷰 모델 아래 4가지 뷰를 통해서 시나리오 뷰를 작동한다. 논리 + 구현 + 프로세스 + 배포 => 시나리오 논리 뷰 (Logical View) 구분 내용 개발자가 작성하는 것 엘리먼트 클래스, 패키지 관계 상속, 연관, 의존 등 클래스와 패키지의 관계 구현 뷰 (Implementation View) 구분 내용 빌드 시스템의 결과물 엘리먼트 모듈(JAR), 컴포넌트(WAR) 관계 모듈과 컴포넌트의 관계 프로세스 뷰(Process View) 구분 내용 런타임 컴포넌트 ..
패턴은 패턴은 특정 상황에 발생한 문제에 재사용 가능한 해법이며 실제로 검증된 유용한 생각입니다. 패턴은 어떤 상황에서는 유용하지만, 또 어떤 상황에서는 전혀 유용하지 않을 수 있습니다. 또 기술적인 부분이 강제되는 점도 있습니다. 강제 조항 (Forces) 문제 해결을 위해서 강제로 처리해야 할 이슈들에 대해서 우선순위를 정하는 것. 예를들어 코드를 이해하기 쉬우며 성능도 우수해야 한다면 리액티브 스타일 코드는 성능은 우수할지 모르지만 이해햐기 어렵습니다. 따라서 이는 전에 반드시 해결 되고 진행 되어야 함. (리액티브 스타일 : 함수형 언어나 엑셀등에서 사용, 자세한 것은 구글링) 결과 맥락 (Resulting Context) 패턴 적용 결과 장점과 단점, 이후 새로운 문제에 대해 고려 필요 연관 패..
FTGO 예시 모놀리식 구조 전형적인 자바 애플리케이션인 FTGO 의 전체 구조는 코어가 비지니스 로직으로 구성된 융각형 아키텍쳐이며 UI, 외부 시스템 통합을 위해 어댑터가 비지니스 로직을 감싼 모양새이다. # 마이크로 서비스 구조 FTGO 애플리케이션은 각 요청에 대해 서비스로 보내고 각자의 API 를 통해 서로 협동한다. # 마이크로 서비스로 변경을 통해 장점 크고 복잡한 애플리케이션을 지속적인 전달/배포 서비스 규모가 작아 관리 용이 서비스를 독립적으로 배포/확장 가능 서비스 팀별로 자율적인 업무 수행 가능 결함 격리가 쉬움 새로운 기술에 대해 도입 용이 단점 서비스를 찾기가 어려움 마이크로 서비스는 따로 정해진 규약이 없어 서비스 모듈을 잘 못 분해할 경우 분산 모놀리식이 구성 될 수도 있다. ..
모놀리식에서 MSA로 Micro Service Architecture 마이크로 서비스 아키텍쳐는 고수준에서 하라보면 하나의 애플리케이션을 여러 서비스로 기능 분해하는 기법 입니다. 각 서비스가 집중되고 응집된 역할을 수행을 합니다. 모듈성 모듈셩은 크고 복잡한 애플리케이션을 개발할 때 꼭 필요한 특성으로 규모가 방대하고 복잡하다면, 개인이 이해하기 어렵고 개발하기 힘듭니다. 따라서 여러 사람이 이해하기 쉽고 개발을 할 수 있도록 여러 모듈로 분할을 해야 합니다. 경계선 각 서비스는 다른 서비스가 침투하지 못하도록 API 라는 경계선을 갖고 있어 다른 서비스에서 접근이 불가하도록 해주며 이는 유지보수에 크게 도움이 됩니다. 또 서비스에 대해서 단위 별로 배포 및 확장에도 도움이 되는 장점이 있습니다. 개별..
시스템 Concern (관심사) 시작 단계는 모든 앱이 풀어야하는 관심사(Concern) 이다. 관심사 분리는 오래된 가장 중요한 기법이다. 대다수의 앱은 시작 단계라는 관심사를 분리 하지 않고 준비 과정 코드를 주먹구구로 구현하고 심지어 런타임 로직하고도 섞인다. 다음은 대표적인 예다. class SomethingMain(object): ... def get_service() -> Service: if not self._service: self._service = MyService() return self._service def main(): ... service = self.get_service() ... ... 위는 초기화 지연 (Lazy Initialization) 혹은 계산 지연 (Laze Ev..
응집도 클래스는 인스턴스 변수 수가 적어야 한다. 각 메소드는 클래스 인스턴스 변수를 하나 이상 사용해야 한다. 일반적으로 메소드가 인스턴스 변수를 더 많이 사용 할수록 메소드와 클래스는 응집도가 높다. 모든 인스턴스 변수를 메소드마다 사용한다면 응집도가 가장 높은 경우이다. 응집도가 높은 클래스는 바람직 하지 않지만 많은 개발자들이 응집도가 높은 클래스를 작성한다. 응집도가 높다는 말은 변수와 메소드가 서로 논리적으로 묶여 있다는 의미이기 때문이다. 아래는 클래스의 응집도가 매우 높은 케이스다. class Stack(object): _top_of_stack = 0 _elements = [] def size(self) -> int: return self._top_of_stack def push(self,..
클래스 클래스 체계 클래스에서 static, public 변수는 위에 다음으로 private 변수 마지막으로 private object 가 나와야 한다. 클래스의 변수와 메소드는 가능한 공개하지 않는 편이 좋지만 때로는 접근을 허용해야 하는 경우가 있다. 따라서 그런 경우에는 protected 로 하거나 패키지내 공개 해야 한다. 하지만 가능한 그렇지 않게 작성 해야 한다. 클래스 이름 이름은 해당 클래스의 책임을 기술해야 한다.(명사로) 간결한 이름이 떠올리지 않는다면 책임이 많을 확률이 높다. 단일 책임 원칙(Single Responsibility Principle) 단일 책임 원칙은 모듈을 변경할 이유가 단 하나뿐이어야 한다는 원칙. 매우 지키기 쉽지만 많은 개발자들이 안지키는 원칙이다. 어떤 개발..
단위 테스트 깨끗한 테스트 1. 테스트틑 빨라야 한다. 테스트가 느리면 테스트를 자주 못하고 자주 돌리지 못하면 결국 문제가 발생해도 코드 정리가 힘들어져 코드 품질이 망가지기 시작한다. 2. 독립적 각 테스트는 서로 독립적이여야 한다. 한 테스트가 다음 테스트가 실행될 한경을 기다려서는 안 된다. 테스트가 서로 의존하면 하나가 실패하면 연달아 실패하므로 결함 찾기가 힘들다. 3. 반복 가능 테스트는 Test, QA, Production 모두 사용 가능 해야 한다. 4. 자가 검증 테스트는 Boolean 으로 결과를 내야 한다. 즉 성공 아니면 실패 로 해야 한다. 5. 적시에 단위 테스트는 실제 코드 작성 전 구현해야 한다. 실제 코드를 구현하고 테스트 코드 작성시에는 테스트 코드로 작성하기가 어려울 ..