본 콘텐츠는 구름 서포터즈 활동으로 지원을 받아 작성된 교육생의 실제 경험 후기입니다.🏁 치열했던 UNBOX의 마침표데이터의 결과물이 아닌 흐름 그 자체가 궁금해 뛰어들었던 구름 딥다이브 과정. 어느덧 모놀리식 구조에서 시작했던 C2C 리셀 플랫폼 UNBOX가 성공적으로 최종 발표를 마쳤습니다.서비스를 도메인별로 분리하며 MSA로 전환하고, 분산 환경에서 발생하는 정합성 문제를 해결하기 위해 Kafka와 보상 트랜잭션(Saga 패턴)을 도입하며 머리를 싸맸던 기억이 다시 생각나는 것 같습니다.특히 트래픽이 몰리는 상황을 가정한 동시성 제어 테스트에서, Redis Worker Thread와 Backpressure 패턴을 적용해 P95 응답 속도를 13.8초에서 1.13초로 끌어내렸을 때의 경험이 제 귀중..
·System Design
인스타 릴스를 스크롤하거나, 유튜브 알고리즘에 이끌려다니거나, 쿠팡에서 쇼핑할 때 그 뒤에서는 어떤 일들이 벌어지고 있을까요?각 서비스들은 클릭이나 새로고침 같은 간단한 사용자의 액션에도 서로 연결되어 있는 구성 요소들이 계속 작동하면서 사용자에게는 별일 없는 듯한 깔끔한 UX를 제공해주곤 합니다.이런 서비스의 뒷편에는 System Design이라는 큰 개념이 자리 잡고 있습니다.1. System Design이란?시스템 설계(System Design)은 시스템의 여러 요소가 어떻게 상호 작용해서 기능적인 요구사항(무엇을 해야 하는지)과 비기능적인 요구사항(얼마나 잘 해야 하는지)을 모두 충족하는지를 정의하는 프로세스입니다.여기서 가장 중요한 건 확장성, 안정성, 성능 및 비용의 발란스(?)을 맞추는 아키..
👉🏻 14891번: 톱니바퀴문제 요약4개의 톱니바퀴를 명령에 맞춰 시계 또는 반시계 방향으로 회전시키는 문제회전할 때 맞닿은 톱니(3시와 9시 방향)의 극(S, N)이 다르면 맞닿은 톱니바퀴는 반대 방향으로 회전모든 회전 후, 각 톱니바퀴의 12시 방향의 극 상태를 기준으로 점수를 합산해 결과 출력풀이 코드'''23 -1 -> -1은 반시계, 3번 톱니를 반시계 방향으로 돌려라1 1''''''서로 맞물려있는 극과 배열 회전이 중요한 문제다 돌리고 나서 점수 합산을 12시 기준으로 한다는 것? N극이면 0, S면 1점(1번 톱니 기준)'''import sys; input=sys.stdin.readlinefrom collections import dequedef checking_saw(num, dir):..
·Team
1. TL;DR (어쩌면 굉장히 방대해질 글)저희 팀은 KREAM과 같은 C2C 기반 리셀 플랫폼, UNBOX를 만들었습니다. 처음에는 전형적인 Monolithic /Layered 아키텍처로 구성된 플랫폼이었습니다. 당시엔 당연하게도 사용하는 유저가 저희밖에 없었기 때문에 이 구조로도 충분히 운영은 가능했습니다. 그런데 실제 국내 KREAM이나 해외 StockX와 같은 리셀 플랫폼들을 좀 더 깊게 파보다보니 생각이 달라졌습니다.리서치해 본 결과, 리셀 플랫폼은 트래픽이 균일하게 들어오지 않았습니다. 한정판 신발이라든지 두쫀쿠(?) 같은 게 올라오면 특정 상품에 조회와 입찰이 짧은 시간에 몰리게 됩니다. 또한 해당 상품의 재고는 옵션(사이즈 270 등)당 1개라서 동시성 문제도 곧바로 거래 실패나 중복 체..
본 콘텐츠는 구름 서포터즈 활동으로 지원을 받아 작성된 교육생의 실제 경험 후기입니다.🛠️ 1개월 차에 Observability 파이프라인 구축구름 딥다이브 과정에서의 첫 한 달은 인프라와 백엔드의 근간을 이해하기 위한 뼈대 세우기 작업이었습니다. 막연하게 느껴졌던 네트워크 흐름과 클라우드 리소스들이 머릿속에서 연결되기 시작했습니다.저희는 EKS 환경에 최적화된 Prometheus로 메트릭을 수집하고, 경량화된 로그 수집을 위해 Loki를 도입했습니다. 더불어 MSA 환경에서 복잡하게 얽힌 분산 트랜잭션의 지연 시간을 추적하기 위해 Tempo를 결합하여, Grafana라는 하나의 통합 대시보드에서 시스템의 상태를 한눈에 관측할 수 있는 환경을 만들어냈습니다. 이 파이프라인을 통해 CPU 사용률, API..
본 콘텐츠는 구름 서포터즈 활동으로 지원을 받아 작성된 교육생의 실제 경험 후기입니다.🤔 데이터의 결과 말고 흐름이 궁금했던 전공생저는 데이터 사이언스를 전공했습니다. 학부 시절 내내 다양한 데이터 분석 프로젝트를 수행했고, 모델링으로 의미 있는 인사이트를 도출하는 과정은 즐거웠습니다. 하지만 졸업이 다가오고 여러 프로젝트를 마무리할 때쯤, 마음 한구석에 채워지지 않는 게 있었습니다.데이터가 어디서부터 흘러들어오는거지?항상 정제된 데이터(CSV)나 주어진 데이터셋을 가지고 분석을 시작하다 보니, 정작 서비스상에서 데이터가 생성되고, 저장되고, 분석 환경으로 넘어오기까지의 과정은 블랙박스처럼 느껴졌던 것 같습니다. 실제 현업에서는 대규모 트래픽에서 데이터가 실시간으로 쌓일 텐데, 그 데이터 파이프라인은 ..
·이론
이전 글에서 데이터 분석이 우연을 수학적으로 계산하고, 그 속의 규칙성을 찾아내는 과정이라고 언급한 적이 있습니다.이런 규칙적이고 확률적인 패턴을 구조적으로 잘 설명해주는 것이 바로 확률 분포입니다. 확률 분포는 뭔가요?확률 분포는 확률 변수가 가질 수 있는 값들과 그 값이 나타날 확률의 구조를 표현한 것입니다.말이 조금 어렵게 들릴 수 있지만, 단순하게 말하면 "이 데이터는 이런 값들이 이런 비율로 나온다"를 알려주는 지도로 보면 됩니다.이 확률 분포는 크게 2가지로 나뉩니다.이산확률분포와 연속확률분포이산확률분포는 셀 수 있는 값에 대한 분포로, 대표적으로 이항분포, 초기하분포, 포아송분포 등이 있습니다. 그리고 확률질량함수(PMF)로 표현됩니다.연속확률분포는 값이 연속적(무한히 많음)일 때 쓰이는 분..
·Class (solved.ac)
👉🏻 14725번: 개미굴문제 정의개미굴 문제는 쉽게 말해 트리의 각 계층과 구조를 얼마나 빨리 시각화할 수 있냐! 하는 문제였습니다.예를 들어 아래와 같은 트리(개미굴)의 구조가 입력되면,A--B--CB--A--C ----D위와 같이 각 가지마다 어떤 노드가 있는지를 출력하면 되는 문제입니다.(저는 우선 이 출력 구조에서 DFS를 써야겠구나를 떠올렸습니다.)Trie결정적으로 저는 이 문제에서 Trie 자료 구조를 사용하였습니다.처음에는 인접 리스트 방식으로 트리를 표현해보려다가 경로 데이터도 함께 저장해야했기 때문에 Trie를 선택하게 되었습니다.결국 문제의 핵심은 겹치는 경로는 하나로 표현해주고, 갈라지는 부분부터 가지를 쳐줘야한다는 것이었습니다.만약에 트리가 A B C / A B D로 들어오게 ..
·Class (solved.ac)
👉🏻 2568번: 전깃줄 - 2 import sys; input=sys.stdin.readlinefrom bisect import bisect_leftN = int(input())loc = sorted([list(map(int, input().split())) for _ in range(N)])# LIS를 위해 B 값들 저장dp = []# 각 전깃줄이 LIS의 어느 인덱스에 들어갔는지 저장pos = [0] * N# 실제 LIS 구하는 과정과 인덱스까지 저장하는 로직 !for i in range(N): b = loc[i][1] idx = bisect_left(dp, b) if idx == len(dp): dp.append(b) else: dp[idx..
·Class (solved.ac)
👉🏻 17143번: 낚시왕 '''1. 일단 잡고,2. 상어 이동하고, 2-1. 상어 먹히고'''R, C, M = map(int, input().split())sharks = [list(map(int, input().split())) for _ in range(M)]sharks_grid = [[None] * (C+1) for _ in range(R+1)]for r, c, s, d, z in sharks: sharks_grid[r][c] = (s, d, z)'''4 1 3 3 8상어 정보가 들어오면, 가장 땅에 가까운 상어를 잡아서 해당 상어의 크기를 반환하도록 함결과적으로 크기의 합을 answer로 출력해야하기 때문에'''def fishing(pos, grid): # del 용도로 저장..
·이론
세상은 우연의 연속인 것처럼 보이지만, 사실 대부분의 일에는 특정한 확률이 숨어있기 마련입니다. 어떤 이벤트에 당첨되는 것도, 출근길에 지하철을 놓치는 것도 완전한 우연이라고 말하기 어렵습니다.데이터 분석은 이런 '우연'을 수학적으로 계산하고, 그 안의 패턴을 찾아내는 일이라고 할 수 있습니다. 그 중에서도 확률은 데이터가 세상을 설명하는 방식 중에 하나입니다. 확률도 종류가 다양하던데 어떤 게 있나요?흔히 우리가 표현하는 P(A), P(B) 같은 확률은 비조건확률이라고 합니다. 한계 확률이라고도 불리는 이 확률은 이름대로 아무런 조건이 없는 상황에서 특정 사건(A, B)이 일어날 확률입니다.또 두 개 이상의 사건이 동시에 일어나는 확률은 결합 확률이라고 부릅니다. P(A∩B)로 표시해, 사건의 교집합이..
·이론
평균은 데이터를 대표하는 값이긴 하지만, 평균만으로는 데이터의 모든 것을 다 파악할 수는 없습니다.값들이 얼마나 흩어져 있는지, 한쪽으로 치우쳐 있는지, 그리고 얼마나 뾰족한 분포를 가지는지에 따라 데이터의 해석은 완전히 달라지게 됩니다.그래서 통계학에서는 평균을 시작으로 분산, 표준편차, 왜도, 첨도 등의 기술 통계적인 특성을 함께 살펴봅니다. 평균은 데이터를 얼마나 잘 대표할까요?우선 평균을 측정할 수 있는 방법은 상황의 특성에 따라 조금씩 다릅니다.먼저 저희가 흔히 알고 있는 평균은 산술 평균인데, 기본적인 평균의 측정 방법입니다. 산술 평균은 등간 척도나 비율 척도로 측정된 데이터를 통해 전체 변숫값을 모두 더한 뒤에 값들의 개수로 나눠 구할 수 있습니다.단순히 한 학급의 평균 몸무게나 키를 구하..
ReJoy
InJoy