분류 전체보기
[테스트]테스트 커버리지 0%에서 98%까지의 경험기 1
개발을 하며 수도 없이 들어왔던 테스트 코드의 중요성, 과연 어떻게 시작해야 할까? 라는 의문점과 함께 시작한 프로덕션 환경에서의 테스트 커버리지 0%에서 98%로 만들기까지의 경험을 공유해보려고 합니다. 테스트? 그거 어떻게 작성하는건데? 테스트 코드를 작성해보았던 경험이 없었기에 맨 처음에는 도저히 어떻게 작성 해야하는지에 대해 감이 잡히지 않았습니다. 여러 자료들을 보며 공부하면서 처음 만들었던 테스트케이스는 특정한 API의 엔드포인트에 테스트 client를 통해 요청을 보내고 정상적인 응답(status 200)이 오는지에 대해서 검증하는 것이었습니다. 코드의 모든 부분에 대해서 작성을 하지는 않았고 새롭게 추가 기능을 개발할 경우에 테스트를 함께 작성하고는 했습니다. 하지만, 단순히 응답만을 as..
[Python]TODO 주석 활용법 (feat. 주석 키워드)
이번 포스팅에서는 TODO 주석을 활용하는 방법에 대해 알아보겠습니다. 1. TODO: # TODO: 해야할 작업 class Leffe(): pass TODO라는 키워드를 활용하여 해야할 작업이라는 표시를 정할 수 있습니다. 이와 비슷하게 프로그래머들 사이에서 널리 사용되는 주석의 키워드를 몇가지 더 알려드리겠습니다. 2. FIXME: # FIXME: 오작동을 일으킨다고 알려진 코드 class Leffe(): pass 오작동을 일으킨다고 알려진 코드에 적용할 수 있습니다. 3. HACK: # HACK: 아름답지 않은 해결책 class Leffe(): pass 해결책이 깔끔하지 않은 경우에 적용할 수 있습니다. 4. XXX: # XXX: 이곳에 큰 문제가 있다 class Leffe(): pass 큰 문제가..
[Django]GenericForeignKey의 문제점 (feat. 안티패턴의 지름길)
GenericForeignKey 란? https://leffept.tistory.com/358 [Django]GenericForeignKey, ContentType로 여러 모델과의 관계 맺기 RDB를 사용하여 모델을 만들다 보면 한 모델이 여러 모델과의 관계를 맺어야 하는 순간이 생기기 마련입니다. 일반적으로 생각한다면 ForeignKey를 이용하여 모델링을 하는 방법이 떠오를 것입니다 leffept.tistory.com GenericForeignKey와 구현 방법에 대해서는 이전에 다루었기에 해당 포스팅의 링크만 남겨두도록 하겠습니다. 우선, 지난번에도 단점을 살짝 언급하였지만 직접 개발을 진행하다보니 돌이킬 수 없는 단점들이 몇몇 보이게 되어 포스팅을 다시 작성하게 되었습니다. Performance ..
[Django]1.11에서 3.2로 버전 업그레이드 방법 (마이그레이션)
이번 게시물에서는 실제 운영중인 서비스의 장고 버전을 업그레이드 하면서 좋은 팁들과 경험을 공유해보려고 합니다. 관련 공식 문서의 링크는 아래와 같습니다. https://docs.djangoproject.com/ko/3.2/howto/upgrade-version/ Django를 최신 버전으로 업그레이드하고 있습니다. | Django 문서 | Django Django The web framework for perfectionists with deadlines. Overview Download Documentation News Community Code Issues About ♥ Donate docs.djangoproject.com 1. 하나의 기능 버전을 차례로 올리는 것이 좋습니다. 1.11을 사용중이라..
[백준]1197번 - 최소 신장 트리, Kruskal, Prim
https://www.acmicpc.net/problem/1197 1197번: 최소 스패닝 트리 첫째 줄에 정점의 개수 V(1 ≤ V ≤ 10,000)와 간선의 개수 E(1 ≤ E ≤ 100,000)가 주어진다. 다음 E개의 줄에는 각 간선에 대한 정보를 나타내는 세 정수 A, B, C가 주어진다. 이는 A번 정점과 B번 정점이 www.acmicpc.net 크루스칼 알고리즘 import sys # 특정한 노드의 부모가 누구인지 찾는 함수 def find(target): if target == parent[target]: return target parent[target] = find(parent[target]) return parent[target] # 부모 노드를 합치는 함수 def union(a, b..
[프로그래머스]섬 연결하기 - 그리디, 최소 신장 트리, Kruskal
https://programmers.co.kr/learn/courses/30/lessons/42861 코딩테스트 연습 - 섬 연결하기 4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4 programmers.co.kr # 크루스칼 알고리즘 def solution(n, costs): answer = 0 visited = [0] # 크루스칼 알고리즘 적용을 위해 가중치를 오름차순으로 정렬한다 costs.sort(key=lambda x: x[2]) # 방문한 정점의 갯수가 n이 된다면 반복문을 중단 while len(visited) < n: for cost in costs: s, e, c = cost # 시작점과 끝점중 하나라도 방문한 리스트에 들어 있을 경우 if s in vi..
[프로그래머스]섬 연결하기 - 그리디, 최소 신장 트리, Prim
https://programmers.co.kr/learn/courses/30/lessons/42861 코딩테스트 연습 - 섬 연결하기 4 [[0,1,1],[0,2,2],[1,2,5],[1,3,1],[2,3,8]] 4 programmers.co.kr # 프림 알고리즘, 우선순위큐 이용(heapq) import heapq def solution(n, costs): answer = 0 # 각 정점의 인접정보와 가중치를 저장하는 리스트 cost_all = [[]for _ in range(n)] # 방문 체크를 위한 리스트 visited = [] # 우선순위큐 사용 heap = [] # 시작정점을 0으로 선택, 가중치도 0으로 설정(cost, start) heapq.heappush(heap, [0, 0]) # 정..
[프로그래머스]조이스틱 - 그리디
https://programmers.co.kr/learn/courses/30/lessons/42860 코딩테스트 연습 - 조이스틱 조이스틱으로 알파벳 이름을 완성하세요. 맨 처음엔 A로만 이루어져 있습니다. ex) 완성해야 하는 이름이 세 글자면 AAA, 네 글자면 AAAA 조이스틱을 각 방향으로 움직이면 아래와 같습니다. ▲ - 다 programmers.co.kr def solution(name): min_move = len(name) - 1 answer = 0 for index, char in enumerate(name): # 위, 아래로 움직이는 값 구하는 부분, 유니코드를 활용해 반복문이 필요 없다. answer += min(ord(char) - ord('A'), ord('Z') - ord(cha..
[프로그래머스]큰 수 만들기 - 그리디
https://programmers.co.kr/learn/courses/30/lessons/42883 코딩테스트 연습 - 큰 수 만들기 programmers.co.kr def solution(number, k): # 스택을 활용한다 stk = [] # number 리스트를 순회함 for num in number: # 제거해야할 값(k)가 남아있고, stk에 값이 있고, stk의 마지막의 값보다 현재 나온수가 더 크다면 # (큰 숫자가 큰 자릿수를 가지게 하기 위해) # 스택의 마지막 숫자를 없애버리고, 제거해야할 값을 하나 줄임 while k > 0 and stk and stk[-1] < num: stk.pop() k -= 1 # 기본적으로 값을 한개씩 넣어줌, (위의 조건에 부합할 경우에만 스택에서 값..
[프로그래머스]입국심사 - 이분탐색
https://programmers.co.kr/learn/courses/30/lessons/43238 코딩테스트 연습 - 입국심사 n명이 입국심사를 위해 줄을 서서 기다리고 있습니다. 각 입국심사대에 있는 심사관마다 심사하는데 걸리는 시간은 다릅니다. 처음에 모든 심사대는 비어있습니다. 한 심사대에서는 동시에 한 programmers.co.kr def solution(n, times): answer = 0 left, right = 1, max(times) * n while left = n: right = mid - 1 # 최대 인원수보다 심사 가능한 인원이 작다면 예상되는 시간을 늘린다 else: left = mid + 1 # 마지막의 정답은 left값으로 설정 answer = left return an..