지난 포스팅 - 산타 백준 프로젝트 (0) - 프로젝트 개요 📌데이터 정의 본격적으로 크롤링을 하기에 앞서 어떤 데이터가 필요한지를 먼저 정의하는 것이 중요하다. 물론 요새는 데이터 레이크라는 개념이 있어서 우선 모든 데이터를 스토리지에 저장하고 나중에 변환하는 방식을 사용하고는 있다고 한다. 하지만 우리 프로젝트는 데이터 종류가 그렇게 많지도 않고, 사용 데이터가 크게 바뀌지도 않기 때문에 미리 정의하는 것이 좋겠다고 생각했다. 그 전에 프로젝트에서 사용할 데이터 소스에 대해 한 번 설명하고 넘어가는 것이 좋을 거 같다😀 우리는 총 2개의 데이터 소스에서 데이터를 가져오기로 하였다. 백준(BOJ)과 Solved.ac API이다. 백준은 프로그래머라면 모두가 아는 사이트라 설명할 필요가 없을 거 같고, ..
📄코딩 문제 추천 서비스 산타백준 부스트캠프에서 마지막 최종 프로젝트를 진행하였다. 최종 프로젝트 주제는 "산타 백준"이다. 산타 백준이라는 이름에서 어느정도 짐작할 수 있겠지만, 산타 토익 + 백준의 합성어이다. 산타 토익처럼 백준의 문제를 추천해주겠다는 취지로 작명을 하였다. 주제에 대해 조금 더 자세히 설명하자면 산타 백준은 코딩 테스트를 준비하는 사람을 위해 실시간으로 백준 문제를 추천해주는 웹 서비스이다. 개발자 열풍이 불면서 코딩 테스트 통과에 대한 수요 또한 증가하였는데, 우리 서비스는 사용자의 수준에 맞춰서 백준 문제를 추천해준다. 원래는 서비스 전체 아키텍처 그림을 공개하고 시작하는데 아무래도 다른 분들과 같이한 팀 프로젝트이니만큼 해당 아키텍처에 대해서는 블로그에서 공개하지는 않고, 나..
GCS에서 빅쿼리로 데이터를 이관하는 작업을 하는 도중 현재 사용하고 있는 데이터 포맷에 대한 의문이 생겼다. 현재는 CSV 파일과 JSON 형태를 사용하고 있었는데, 이게 생각보다 용량을 차지하기도 하고, 특히 CSV 파일은 데이터 오염에 취약한 포맷이라는 이야기를 얼핏 들은 적이 있었다. 특히 데이터 용량 같은 경우 가난한 학생으로써 무료 크레딧을 이용하고 있는데, 생각보다 금방 금방 닳아가는 요금을 보면 가슴이 너무 아팠다. 그러던 중 예전에 하둡을 공부하다가 Parquet이라는 데이터 포맷 형태가 기억이 났고, 조금 더 효율적인 방법을 탐색해보기로 하였다. 우선 빅쿼리에 적재할 수 있는 형태가 크게 CSV, JSON, Parquet, AVRO 4가지로 나눠볼 수 있었다. 하나하나씩 특징을 알아보고..
요즘 프로젝트를 하느라 블로그 포스팅을 조금 오랫동안 하지 못했다. 원래는 3일 1회는 꼭 지키려고 했는데... 바쁜 건 어쩔 도리가 없나보다. 하여튼 본론으로 돌아가서 열심히 코딩을 하고 있던 어느 날... 갑자기 한 통의 메일이 날아왔다. AWS 예산으로 설정해놓은 한도를 넘었다는 메일이었다. 현재 이용하고 있는 AWS 서비스가 있긴 하지만 프리티어 서비스를 이용하고 있기 때문에 절대 비용이 청구될 수가 없는데 이게 무슨 일인가 싶었다😱 심지어 초과된 예산도 21달러로 학생인 나에게는 꽤 큰 돈이었다. 예전에 어떤 글에서 채굴꾼들에게 계정이 털려서 3억이 청구되었다는 글을 보아서 심장이 덜컹 내려앉았다. 이걸 해결하기 위해 정말 하루 웬 종일 AWS 비용 관련해서 알아보느라 시간을 다 썼다... 우선..
🔎dbt를 써야할까? 데이터 엔지니어링 프로젝트를 진행하면서 dbt라는 도구를 알게 되었다. 대충 파이프라인 효율적으로 관리해주는 도구라는 이야기를 듣고, 이번 프로젝트에 한 번 사용해봐야겠다는 생각을 하였다. 하지만 dbt를 알아볼 수록 과연 정말 이 프로젝트에 필요할까는 생각이 계속 들었다. 데이터 엔지니어링에 필요한 여러 기술들을 경험해보자는 취지에서 프로젝트를 시작하긴 하였지만 오버엔지니어링이 아닐까 하는 생각이 들었다. 도입해야할 기술을 도입하지 않아서 힘든 상황도 좋지 않지만 나는 굳이 하지 않아도 될 일을 하는 오버엔지니어링이 더 두려운 사람이다. 기업이 최신 기술을 도입하는데 많은 비용이 드는 것처럼 나 또한 그것을 공부하는데 많은 시간이 들기 때문에 dbt보다 더 중요한 기술을 공부하는 ..
지난 포스팅 - Fake Onlineshop 프로젝트 (0) - 프로젝트 개요 🛒데이터 생성 데이터 파이프라인을 구축하기 위해서 가장 중요한 것은 데이터이다. 데이터를 구하는 것이 항상 문제였었는데, 이번에는 데이터를 직접 만들어서 사용하려고 한다. 이번 주제는 가상 쇼핑몰이기 때문에 쇼핑몰 데이터에서 가장 핵심이 되는 유저와 주문 데이터를 만들 것이다. 그 중 먼저 유저 데이터를 생성하는 작업을 해보도록 하자! 🙎♂️유저 데이터 생성 유저 데이터 생성에는 Faker 라이브러리를 사용하였다. 이 라이브러리는 한국어 정보도 추출할 수 있고, 무엇보다 유저의 간단한 프로필을 뽑을 수 있어서 데이터를 정의하는데 크게 고민할 필요가 없다는 점이 편하다. Faker 안에 simple_profile()을 이용하면..
앞서 배운 DFS/BFS와 최단 경로 문제에서 다룬 내용은 모두 그래프 알고리즘의 한 유형으로 볼 수 있다. 만약 알고리즘 문제를 접했을 때 서로 다른 개체가 연결되어 있다는 이야기를 들으면 가장 먼저 그래프 알고리즘을 의심해보도록 하자. 여기서는 크루스칼 알고리즘과 위상 정렬 알고리즘을 알아보도록 한다. 서로소 집합 그 전에 먼저 서로소 집합 알고리즘을 배워야 한다. 서로소 집합은 union-find 자료구조라고 불리며, 같은 집합에 포함되는지 찾고 합치는 연산을 반복한다. 소스코드는 아래와 같다. def find_parent(parent, x): if parent[x] != x: parent[x] = find_parent(parent, parent[x]) return parent[x] def unio..
벨만 포드 다익스트라 관련 알고리즘 문제를 풀다가 알게된 알고리즘이다. 다익스트라와 비슷하지만 차이점은 음수 간선이 포함되어 있을 때도 최단 경로를 구할 수 있다는 점이다. 벨만 포드에서 주목해야 할 부분은 음수 간선을 포함하고 있는 간선이 사이클을 형성한다면 최단 경로가 무한히 음수가 될 가능성이 있다는 것이다. 벨만 포드는 이러한 음의 사이클을 잡아낼 수 있는 알고리즘이다. 하지만 시간 복잡도가 O(VE)로 다익스트라 알고리즘에 비해 느리다는 단점이 있다. INF = int(1e9) v, e = map(int, input().split()) graph = [] distance = [INF] * (v + 1) # 모든 간선의 정보 입력 for _ in range(e): a, b, c = map(int,..
다익스트라 특정한 노드에서 출발하여 다른 노드로 가는 각각의 최단 경로를 구해주는 알고리즘이다. 기본적으로 그리디 알고리즘으로 분류된다. 해당 알고리즘 코드는 꼭 숙지하고 외워두도록 하자! 참고로 해당 소스코드의 시간 복잡도는 O(ElogV)이다. import heapq INF = 1e9 n, m = map(int, input().split()) start = int(intput()) # 시작 노드 graph = [[] for i in range(n+1))] distance = [INF] * (n+1) for _ in range(m): a, b, c = map(int, input().split()) graph[a].append((b, c)) def dijkstra(start): q = [] heapq.h..
🔧현업의 파이프라인 오랜만에 블로그 포스팅을 하는 거 같다. 중고책 분석 프로젝트가 끝난 지 약 이주일 정도 흘렀는데, 그 동안 부스트캠프를 하면서 현타(?)가 와버려서 잠깐 코딩을 멈췄었다. 회복하는데 조금 시간이 걸리긴 했지만 마음을 다잡고 다음 프로젝트를 진행할 계획을 조금 씩 세웠다. 이번에는 어떤 프로젝트를 해볼까하는 고민 끝에 저번 프로젝트에서 느낀 아쉬운 점을 개선해보자는 생각이 들었다. 저번 프로젝트에서 나름 괜찮은 결과물을 내긴 했지만 데이터 엔지니어로서 필요한 기술 스택을 전혀 사용해보지 못해 아쉬움이 컸었다. 따라서 이번 프로젝트에서는 참신한 주제에 종속되지 않고 기술 스택을 제대로 다뤄보기로 하였다. 또한 추가적으로 현업에서의 데이터 파이프라인을 모방하면서 조금은 현업스러운(?) 파..