가끔 게임 분야에 관심있는 분들이 데이터분석 포트폴리오로 만들만 한 주제를 추천해달라고 하면 저는 riot API를 추천합니다. 대중성있고 리그오브레전드,룬테라, TFT 등 API도 다양하게 많이 제공해주기 때문입니다. 이번 글은 롤 API를 가져오는 핵심 Endpoint를 정리해보겠습니다.
Product 등록입니다. 왼쪽은 Prouduction 레벨의 API 이며, 요청횟수가 더 많거나 더 많은 정보를 줍니다만, 승인 기간이 느리고 절차가 필요합니다. 우측 Personal API Key를 발급 받으시면 됩니다.
Personal 키의 경우 매번 갱신해야합니다. 또한 요청 횟수가 1초에 20건, 2분에 100건으로 제한되어있기 때문에 꾸준한 데이터 수집을 위해서는 반드시 배치형식의 데이터 수집을 고려해야합니다.
2. 핵심 API 3가지
보통 riot api라고하면 리그오브레전드 게임 내의 게임 정보에 대한 데이터를 생각합니다. 해당 데이터는 match - timeline api에 정보가 있습니다. 이 정보를 가져오려면 matchi id를 가져와야하고 또 이 match id를 구하려면 유저 id(puuid)가 필요합니다. 다음은 이 3가지 api를 cascading 하게 가져오기 위한 각 api의 구조입니다.
이번에는 나만의 서비스를 Claude code를 이용한 바이브 코딩한 절차와 교훈에 대해서 작성해봅니다. 늘 나만의 서비스를 하나씩 만들고 싶었는데 좋은 핑계(?)가 생겨서 하루 이틀 반짝해서 만들어봤습니다. 이게 되네?라고 느끼는 프로젝트였고 웹개발을 직접 핸즈온으로 배우고 구현하는 재미가 있어서 좋은 경험이였습니다. 이 글을 읽고 덜 시행착오를 겪으시고 결과를 만드시길 바랍니다.
1. 문제 정의
커리어의 목표를 위해서 방송통신대에 통계.데이터학과에 25년 2학기에 입학했습니다! 자연스럽게 3학년 편입이라 전공과목을 4학기만에 수강해야하는 상황입니다. 더해서 추후 CS 대학원을 목표로 하고 있어서 컴퓨터과 과목도 넣게되었습니다. 그러다 보니 한학기에 5과목씩 전공을 듣게 되었네요. 많이 듣는건 좋은데 일도 해야하고, 방통대 특성상 자유롭게 들을 수 있는 인강 형태라 미루다가 강의 폭탄 맞을 것 같아서 대책이 필요 했습니다.
한 강좌당 15개가 존재하며 데드라인은 3개월 남짓이다!
제가 해결하고 싶은 문제는 꾸준히 수업을 들을 수 있는 시스템을 만들자에 집중했습니다.
2. 해결 방법 1 - 노션으로 대시보드 만들기
제일 좋은 방법은 수업이 같거나 비슷한 학우들을 모아서 서로의 진척 사항을 공유하는 것입니다. 그래서 노션의 데이터베이스 기능을 이용하려했습니다. 요구사항은 다음과 같습니다.
랜딩 페이지는 학생마다 수강률에 대한 친적사항이 프로그레스바로 보여줄 것
수강기록 페이지는 손쉽게 접근할 수 있는 체크박스형태로 만들 것
그래서 다음과 같은 템플릿을 만들었습니다.
전체 과목의 진척사항 확인개별 강의의 수강 체크
노션에서는 "관계형"이라는 컬럼이 존재합니다. 두 테이블을 관계로 묶고, 수강현황판의 한행은 수강기록 N개의 강의와 1:N 관계이기 때문에 수강기록 데이터베이스 페이지 하나가 수강현황판을 참조하는 식으로 구성했습니다. 또한, 수강현황판에서 수강완료는 "롤업"이라는 컬럼으로 수강기록의 체크박스의 수를 기록하는 형식입니다. 마지막으로 수강 현황판의 "진행률"은 같은 행의 수강완료 / 전체 강의 수의 비율을 시각적으로 나타내었습니다.
반나절정도 노션 데이터베이스를 레퍼런스를 찾고 만들었는데, 생각보다 이 만드는 과정에 "노션식 관계형"에 대한 이해가 없으면 많이 허덕이는 부분입니다. 그래서 동영상으로 소개 영상을 만들었습니다. 맨 밑에 링크 남겨놓겠습니다.
하지만 노션은 신규등록자 입장에서 되게 불편했습니다. 가이드 영상을 고사하더라도, 나의 새로운 과목을 추가할때 15개씩 수강기록을 남겨야했고(자동화를 통해 1~15회차가 자동으로 만들어지지만) 체크박스 하나씩 클릭하자고 수강기록을 만드는 것도 썩 맘에 들지 않았습니다. 그래서 그냥 웹서비스를 하나 만들자라는 결론에 도달했습니다.
3. KNOU Tracker 사이트
4가지 세부 페이지를 구상했습니다.
대시보드: 수업 진행 현황을 볼 수 있는 랜딩페이지
개인 현황: 수업 진행률을 체크할 개인 페이지
신규 등록: 신규 진입자를 위한 등록 페이지
관리
이렇게 하여 신규사용자가 스스로 자신을 등록하고 기록을하며 전체 진척사항을 서로 공유하여 동기부여를 얻을 수 있는 서비스가 만들어졌습니다.
4. 시행착오들
4.1. PRD 문서 작성
개발쪽에서는 PRD라는 문서가 있다는 걸 알게되었습니다. Claude에게 PRD를 만들기 위한 방법으로 질의응답으로 나에게 질문을 해달라고 부탁했고 개발하기전 LLM에게 해당 사항을 읽고 구현하라고 시켰습니다. 나중에 README.md 에 작성하기에도 좋으니 사전에 설정해놓으면 사전 준비작업이 빨라집니다.
README.md 일부
4.2. 스택 선택
Claude code를 요즘 간단한 개발할 때 잘 쓰고 있었습니다. 그래서 다양한 조합을 Claude에게 물어봤습니다.
Python Only(streamlit)
Vanillia Javascript
React,Vue 등 최신 프론트 스택
사실 웹 개발, 특히 프론트쪽은 잘 모르기에 유지보수에 대한 걱정으로 Streamlit을 추구했습니다.
하지만 반나절 정도 해보니 내가 원하는 디자인이 계속 나오지 않았습니다. 특히 좌측 한바닥을 차치하는 세부 페이지 드롭다운, 핵심 페이지의 공간 비효율성이 마음에 들지 않았습니다. 그래서 그냥 빠르게 접었습니다. 3번은 투머치였고, 그냥 Vanilla Js로 하기로 결정하고 만들었습니다. 또한 Github Pages로 배포를, 데이터베이스는 요즘 유명하다는 Superbase를 사용했습니다.
4.2. Claude Code 사용
Claude Code Pro 요금제를 사용하고 있어서 웹개발을 계속 시키면 거의 2시간 만에 토큰이 모두 소모됩니다. 시간이 지나면 다시 한도가 돌아가는 시스템인데 Claude-monitor 를 이용해 중간에 개발하다가 끊키는 일이 없도록 했습니다. 한 3번정도 iteration 끝에 웹페이지를 만든 것 같습니다. Claude-monitor 링크는 하단에 넣어놓겠습니다.
여기서보면 정확히는 Token과 Message 한도가 있는데, Token은 100%가 도달하면 얄짤 없이 더이상 프롬프팅이 불가능한 반면 Message는 100%가 도달 해도 어느정도 명령을 수행해줍니다. 초반에는 Limit이 걸리면 그냥 손놓고 있었는데 요즘 Gemini CLI이나 Codex CLI 라는 대체 툴도 많아서, 손놓고 놀지말고 도구를 바꿔서 사용하면 연속성있게 사용할 수 있을 것 같습ㄴ다.
4.3. 추후 개선할 기능들
빠른 결과를 추구하다보니 비 필수적이 기능들을 아직 구현하지 못했습니다. 차차 구현해볼 생각입니다.
크롬 확장 브라우저를 통한 자동 연동 -> 사실 이게 젤 하고 싶습니다. 근데 지식이 전무해서 찾아봐야하는...
오픈 서비스로 만들기 위한 로그인 기능
사용자의 분석을 위한 로그시스템
버그 리포팅
5. 후기
처음만 해도 이정도의 퀄리티가 하루 반나절만에 나오리라고 생각하지 못했습니다. 간단한 개발은 확실히 접근성이 좋아진 것 같습니다. 하지만 그럼에도 개발을 위한 몇가지 사전 지식이 필요하다는걸 깨달았습니다.
명확한 요구사항
PRD같은 문서의 존재를 아는 것도 중요하지만 내가 정확히 어떤 프로덕트를 만들고 싶은지 소구하는 것이 중요했습니다. 모호한 목표는 모호한 결과물을 만들기 마련이니까요.
백엔드에 대한 기본적인 지식
배포시에 데이터베이스를 만들어야한다는 개념은 아는데 이걸 Superbase에서 어떻게 연결해야하는지는 스스로 공부해야하고, 찾아낼 줄 알아야합니다. 이번에 LocalStorage가 브라우저에 내장될 수 있다는 걸 처음 알았습니다.
웹개발에 대한 기본지식
직접 github 블로그를 만들어서 알았던 부분이여서 완전히 모르는 상태로하진 않았지만 index.html을 비롯한 html에 대한 이해, 웹브라우저에서 개발자도구 - 콘솔의 오류를 체크하는 부분을 몰랐다면 시행착오를 많이 겪었을 것 같습니다. 물론 Claude Code에게 물어보면 방법을 알려주긴 하지만 전혀 개발 생태계를 모른다면 이런 점이 병목이 될 것 같습니다.
CLI AI Assitant는 신이다.
저는 연동하는 방법을 찾지 못해서 Github 배포도, Superbase MCP 설정도 못하고 일일히 손으로 했지만 앞으로는 이런것들이 기본 기능으로 들어오면서 정말 손쉽게 결과물을 만들어낼 것 같습니다. 결국 기술은 발전할 것이니 빠르게 Proto Typing하고 기획하는것 그리고 이런 프로세스를 지속 가능한 시스템으로 내재화하는 것이 중요하겠구나 깨달은 프로젝트 였습니다.
과적합: 에포크를 과도하게 늘리면 학습데이터셋에서는 높은 정확도를 보이지만 새로운 데이터셋에서 일반화 되지 못할 수 있음
Catastophic Forgetting: 특정한 작업을 위한 미세조정 과정에서 처음에 습득한 광범위한 지식을 잃을 위험
데이터 유출: 훈련 및 검증 데이터 세트가 중복됨
RAG
정의: 검색기반 모델과 생성 모델의 장점을 결합, 입력 쿼리를 기반으로 대규모 데이터베이스 또는 지식 기반을 검색하여 관련 정보를 검색
동적 지식 통합: 외부 소스의 실시간 정보를 통합하여 최신 지식이나 특정 지식이 필요한 작업에 적합
문맥적 연관성: 검색된 문서에서 추가적인 맥락을 제공하여 생성 모델의 응답을 향상
다재다능: 더 광범위한 쿼리를 처리할 수 있음
2. Langchain
LLM 기반 어플리케이션 개발을 간소화하고 유연하게 만드는 핵심적인 역할
2.1 Runnable
Chain을 구성하는 모든 구성요소를 연결하고 실행하기 위한 표준 인터페이스
표준화된 메소드: invoke, batch, stream 표준 호출 메소드를 제공
모든 구성요소가 공통된 메서드를 가지게 하는 것
2.2 LCEL
LangChainExpressionLanguage Runnable을 체인으로 구성하여 유닉스 파이프 연산자처럼 선언적인 방식 제공
Prompt | model | output_parser 형식으로 구성
프롬프트 엔지니어링 기법 지원
역할 기반 메시지: ChatPromptTemplate.from_messages 메소드를 사용하여 Human, AI, System 와 같은 역할 기반 메시지를 명시적으로 정의
퓨삿 프롬프팅: FewShotChatMessagePromptTemplate 모델 동작에 영향에 미치는 예시를 사전에 제공할 수 있음
출처: Prompt Engineering vs. RAG vs. Finetuning: What’s the Difference?
StringOutputParser
언어모델의 출력값을 다루기 쉬운 문자열로 변환하기 위해 사용함
LLM이나 챗봇 모델은 단순히 텍스트만 변환하는 것이 아니라 AIMessage, ChatMessage와 같은 복잡한 객체 형태로 출력하기 때문에 순수한 텍스트 내용을 추출하기 위한 방법
3. 기타
3.1. Pydantic 사용하는 이유
파이썬은 동적언어여서 자료형이 사전에 선언되지 않음
타입 힌트는 힌트일 뿐이며 데이터 유효성 검사를 위해 Pydantic를 사용하여 출력 자료형을 구체하하는것
3.2. RAG을 사용해야하는 이유
지식의 단절, 특정 시점까지만 LLM이 학습하기 때문
context window의 한계, 기억 메모리가 무한하지 않음
벡터 DB는 기존 DB가 정확히 요청한 단어만 찾는것과 달리, 유사한 단어를 찾아 응답결과를 좀더 풍성하게 해줌
벡터(색인)과 원본데이터(원자료)를 모두 저장하여 유사한 색인을 찾아 결과를 반환하는 형태로 구현됨
3.3. 메모리를 기억하기 위한 방법
이 부분 확실하지 않음. 애초에 LLM은 stateless 하기 떄문에 정보를 저장하는게 중요.chat_message 메소드에 이전 대화 기록을 AI message, Human Message등을 저장하고 멀티턴으로 구현하는 방법도 있으나 context limt 때문에 적절하지 않을 수 있음. 검색한 결과 다음 메서드가 있는 것을 확인
자료작성, 블로글 ok, 책 밑줄 그으면서 설명해도되고, 자료(스샷)가져와서 판서하면서해도됨
발표자: 매주 3명 발표 필수(설명을 하는 5분-10분)
참여자: 3줄 요약으로 경험 공유
디포짓 5만원 선입금
발표 안하면 만원 차감
참여 안하면 오천원 차감, 1회 패스권 사용 가능
시스템
발표 순서 정리
예치금 현황판
총 6단원으로 이루어진 책이기 때문에 12명을 구인했습니다. 각 단원을 절반씩 쪼개 1주차당 3명의 발표를 의무적으로 잡았습니다. 단순히 읽고 논의하기 라는 느슨한 규칙을 세우면 책을 안 읽을 수 도 있기 때문입니다. 하지만 발표의 결과물 형태를 까다롭게 하지 않았습니다. 각자의 개인노션이나 블로그에 작성한 화면 그대로를 발표로 해도 되고 관심있게 본 단어나 구절만 발표하는 식으로도 가능하게 했습니다. 실제로 이렇게 진행하니 총 36회의 발표에서는 미발표는 2번, 미참석은 2번이였습니다.(참석 패스는 9명 사용)
3. 스터디 회고
다음은 12주간 스터디 진행 후 KPT 템플릿을 이용한 후기를 Gemini Pro 2.5를 통해 요약한 결과 입니다.
Keep (성과 및 유지할 점)
성공적 스터디 시스템
주 3인 발표 제도로 책임감 부여 및 꾸준한 학습 동기 마련
발표자 외 '3줄 요약' 규칙으로 참여도 유지
예치금 제도로 완주 의지 강화
자율적 발표 형식으로 다양한 시각(블로그, 시각화 등) 공유 및 학습 효과 증대
긍정적 학습 경험
500p 분량의 기술 서적 완주 경험 획득
동료 학습을 통해 혼자서는 어려웠을 개념(캐시라인, 콜백 등) 명확히 이해
다양한 발표 스타일 덕분에 다각적이고 입체적인 학습 가능
AI(Claude, LLM)를 활용한 시각화, 내용 검증 등 새로운 학습법 시도
Problem (문제점 및 아쉬움)
스터디 운영의 비효율
3인 발표 시 내용이 중복되어 집중력 저하 및 비효율 발생
발표자가 아닐 경우, 학습 우선순위가 밀려 수동적 참여에 그치는 경향 발생
발표 중심의 단방향 소통으로 상호작용(질문, 토론) 부족
학습 깊이의 한계
C/C++ 코드 예제를 눈으로만 훑고 넘어가 실질적인 체득 부족
어려운 주제 발생 시 깊게 파고들지 못하고 수박 겉핥기식으로 학습
개인 실습 및 학습 내용을 블로그 등으로 정리하는 Output 활동 부족
Try (향후 시도할 점)
스터디 운영 방식 개선
(역할 분담) 발표 전, 이론/코드분석/심화탐구 등 파트를 나눠 중복 방지
(상호작용 강화) 챕터별 질의응답 시간을 의무화하거나, 나무위키처럼 공동 학습 노트 작성
(참여 유도) 비발표자도 참여할 수 있는 퀴즈나 토론 주제 제시
개인 학습 전략 강화
(코드 실습) 예제 코드를 직접 실행하거나, 익숙한 언어(Python 등)로 변환하여 실습
데이터 중심 어플리에케이션 설계(a.k.a 대중애설, DDIA) 스터디 이후 다양한 스터디원들의 공통 관심사인 CS로 책을 선정하게 되었습니다. 처음에는 중국인 저자여서 선입견을 가지고 시작했는데, 각 개념에 필요한 적절한 그림과 명확한 설명에 한 번 놀라고, 컴파일러부터 시작하여 메모리,프로세스, 스레드, 캐시, cpu, 입출력까지 차근히 지식의 상아탑을 쌓아가는 것을 보고 한 번 더 놀랐습니다. 앞으로 이 저자의 책은 고민안하고 읽어볼 것 같습니다.
필자는 데이터 분석가로 일을 시작했고 컴퓨터과학개론만 1학년 때 수강했으므로 CS의 지식은 거의 없지만, 하드웨어를 만지는걸 좋아해서 용어나 개념에 대한 이해가 막 어색하거나 낯설진 않았습니다. 오히려 희미한 지식에서 가끔 들리는 프로세스/스레드 코루틴, 동기/비동기와 같은 개념을 한 번 잡아볼 수 있는 기회여서 스터디에 대한 만족도는 높았습니다. 본인이 CS에 대한 이해도가 부족하거나 한 번 정리하길 원한다면 일독을 추천드립니다.
개인적으로 인상깊게 보았던 개념이 "데이터 일관성"에 대한 개념입니다. 사실 설계 개발자의 관점에서 중요한 부분이긴 하나, 프로세스/스레드에서 데이터 일관성의 이슈가 분산 시스템에서도 이식되어 똑같은 문제상황이 일어나고 유사한 방법으로 해결하려고 한다는 점이 흥미로웠습니다. 시대가 발전해도 고전적인 프로그래밍의 설계와 철학은 그 이유가 있므르로 역시 과거는 미래의 등대라는 생각이 듭니다. 여기에 더하여 AI agent에서는 서로 다른 기능을 하는 Agent가 공통된 Context를 유지하기 위한 시스템 프롬프트를 공유하는 부분이 중요하다고 들었는데 나아가 이런 데이터 일관성에 대한 부분이 새로운 기술에도 적용되는 뼈대구나 라고 생각이 들면서도 기본을 알면 여기저기에 써먹을 것이 많구나 라는 생각도 동시에 들었습니다.
종합적으로 볼 때, 장기적인 저의 커리어 목표(Chief Data Owner)에 엔지니어링 축이 될 수 있는 바탕이 되었고, 앞으로 진행할 상아탑에도 튼튼한 버팀목이 되었으면 좋겠습니다. 🙂
개발자에게는 코딩 테스트를 요구하는 것이 당연하게 여겨집니다. 하지만 데이터 직군(분석, 과학, AI) 직무는 회사 상황이나 요구사항에 따라 Python 알고리즘부터, 라이브러리를 이용한 문제 해결, 과제 전형 등 다양한 방식으로 진행됩니다. 이런 상황에서 데이터 직군은 알고리즘을 알아야할까요? 이번 글은 문제를 실제로 보면서 푸는 로직을 공유하고 실제로 데이터 과학자에게 알고리즘 공부가 필요한지 논의 해보는 글입니다.
def solution(k, m, score):
score.sort(reverse=True) #사과 점수 내림차순으로 정렬
result = 0
while len(score) >= m:
box = score[:m] #사과를 점수가 높은 순부터 4개 뽑기
result += min(box)*m #4개 뽑은 것 중에 가장 낮은 점수 곱하기 * 사과개수
del score[:m] #꺼낸 사과 제거
return result
실행 결과
학생질문) 시간 초과로 일부 테스트는 실패라고 뜨는데 왜 그런지 궁금합니다. 그럼 이 문제는 다른 방법으로 풀어야 하는 것일까요?
2. 나의 대답 전문
2.1 알고리즘 채점 방식
파이썬 알고리즘 문제는 후반으로 갈수록 좀 정교한 방식으로 채점됩니다. 문제를 해결하기 위한 논리와 효율성이 그것입니다. 위 코드에서는 효율성이 문제가 됩니다.보통 알고리즘 문제는 1초안에 수행되어야합니다. 위 코드를 돌려보면 6번 문제부터 100ms가 소요되는 걸 확인할 수 있어요. 그렇습니다. 코드 어딘가에 굉장히 속도가 많이 걸리는 것을 알 수 있습니다.
2.2 현 코드의 문제
결론만 말하자면, 반복문 혹은 정렬 등에 관련된 구문이 속도를 잡아 먹습니다. 위 코드에서는del score[:m]구문입니다. score가 가장 큰 경우는 100만개입니다. 반면 최소값은 m이 3입니다. 이런 최악의 경우 다음과 같이 진행됩니다.
사과 상자를 정렬함 (<- 사실 이 정렬속도도 매우 큽니다.)
100만개의 사과 중 3개를 뽑아냄. 그 이후 나머지 사과를 앞으로 3칸씩 "당김"
999,997 개의 사과중 3개를 뽑아냄. 그 이후 나머지 사과를 앞으로 3칸씩 "당김"
반복
del 연산이 자체적으로 데이터를 앞 당기는 상황입니다. 100만개를 모두요! 언제까지? while문이 끝날 때 까지. 그래서 문제가 되고 실제로 다음 코드를 돌려보면 시간이 매우 걸리는 것을 확인할 수 있습니다. 문제 11번 부터 시간초과라고 뜨는 이유가 해당 테스트에서 score길이가 길어서 그래요! 더 깊게 알고 싶다면시간복잡도개념을 검색해보시면 됩니다.
2.3. 개선 코드
기존 코드를 바꾸는 것도 고민해봤지만, for문으로 변형하는게 제일 합리적입니다. 일정한 사과의 갯수를 포장하는 것은range(start, end, step)함수를 이용해서 만들 수 있거든요.
def solution(k, m, score):
score.sort(reverse=True)
result = 0
# m-1 인덱스부터 리스트 끝까지 m씩 건너뛰며 반복
# 이 인덱스들이 각 상자의 최저 점수가 됨
for i in range(m - 1, len(score), m):
result += score[i] * m
return result
위 코드를 돌리면 기존 문제 6번이 100ms 에서 6ms 로 16배 빨라졌습니다!
2.4. 검증해보기
100만개의 사과를 테스트 해보면 시간이 너무 오래걸려서 10만개로 가정하고 테스트해봅니다. chagpt한테 만들어달라고 하면 금방 만들어줘요
import time
import random
# 1. 기존의 while문 방식
def solution_original(k, m, score):
score.sort(reverse=True) #사과 점수 내림차순으로 정렬
result = 0
while len(score) >= m:
box = score[:m] #사과를 점수가 높은 순부터 4개 뽑기
result += min(box)*m #4개 뽑은 것 중에 가장 낮은 점수 곱하기 * 사과개수
del score[:m] #꺼낸 사과 제거
return result
# 2. 개선된 for문 방식
def solution_improved(k, m, score):
score.sort(reverse=True)
result = 0
for i in range(m - 1, len(score), m):
result += score[i] * m
return result
# 테스트 데이터 생성
k = 9 # 사과 최대 점수 (예시)
m = 3 # 한 상자에 담는 사과 개수
# 1~k 사이의 점수를 가진 100만개의 사과 리스트 생성
score_list = [random.randint(1, k) for _ in range(100000)]
# --- 기존 방식 시간 측정 ---
# 원본 리스트를 복사해서 사용 (sort가 리스트를 변경하므로)
score_copy_1 = score_list[:]
start_time_1 = time.time()
solution_original(k, m, score_copy_1)
end_time_1 = time.time()
print(f"🐢 기존 방식 실행 시간: {end_time_1 - start_time_1:.6f}초")
# --- 개선된 방식 시간 측정 ---
score_copy_2 = score_list[:]
start_time_2 = time.time()
solution_improved(k, m, score_copy_2)
end_time_2 = time.time()
print(f"🚀 개선된 방식 실행 시간: {end_time_2 - start_time_2:.6f}초")
'''
🐢 기존 방식 실행 시간: 0.202289초
🚀 개선된 방식 실행 시간: 0.004085초
대략 50배정도 빠름!
'''
2.5. 이렇게까지 해야하나...
이런 해설을 보면 사실 이렇게까지 공부해야하나 싶으실거에요. 사실 알고리즘은 소위 개발자를 위한 테스트 시험이고, 우리가 sql을 공부하는 것처럼 준비해야하는 하나의 관문입니다. 분야도 depth 도 깊어요! 전공과목으로 있을 정도니까요근데 데이터 분석가의 지원하는 기업에 따라 일부 파이썬 기본문제를 요구하는 곳이있어요. 이런 "완전 구현" 문제(LG전자 전형)나 scikit learn을 활용한 유클리드 거리 계산(게임회사 크래프톤)이나 pandas를 활용한 문제들 출제합니다. 정말 중구 난방이긴해요 ㅋㅋ알고리즘을 푸는 것은 좋지만 너무 매달리고 개발자까지 공부할 필요는 없다는게 제 결론입니다. 완전구현, 이진트리, BFS, DFS 정도면 충분합니다. 이것도 사실 대기업 기준... 하지만 파이썬을 구현하고 더 깊게 팔수록 회사에서 기회가 더 많이 주어진다는건 명확해요. 요즘같은 LLM이 assist를 해주는 요즘 분석가와 같은 semi- IT직군이 LLM을 등에 타고 훨훨 날아가는 건 시간문제이니까요~ 잘 쓰려면? 잘 이해해야한다.말이 길었네요~ 여튼 대부분 알고리즘을 포기하는 지금까지 파이썬 문제를 잡고있다는건 노력도 많이하시고 열심히 하고자는 배경이 있다는 것이니까 꼭꼭 이점을 장점으로 가져가서 엔지니어링 스택도 가져가는 희귀한 데이터분석가가 되셧으면 좋겠습니다. 혹 또 궁금한거 있으면 찾아오세요~
3. 위 대답을 하게 된 이유
3.1. 시대적 배경
회사에서 나와서 좀 더 넓은 시야로 데이터 분야를 보다보니 직군에 대한 이해가 명확해졌다. 사실 데이터 분석가라는 직군은 정의된지 10년도 채 되지 않아서, 테크기업은 활발히 채용하고 있지만 대기업의 경우 이제 데이터 팀이 만들어지고 데이터 리터러시 문화가 도입되는 중이다.
이런 흐름에서 사실 데이터 직군은 높으신 분들에서는 그저 IT직군 중 하나이다. 마치 병원에 제약사에 누가 방문해도 영원사원1, 2 처럼 의사 선생님이 생각하시는 것 처럼.. 이런 상황에서 데이터 팀은 자신의 specialty는 추구미로 유지하되, 회사와 시대가 요구하는 사항에 유연하게 pivot 할 필요가 있다. 다시 말해 "저 분석 만 할거에요!"라고 자신의 기능을 제한하기 보다는 "데이터로 볼 수 있는 문제를 해결하는 사람"으로 추구미를 갖는 것이 장기적으로 유익하다. 그런 관점에서 데이터 잡부라고 속칭 자책하는 분들은 어찌보면 다양성을 갖춰가는 과정일 수 있다.
그렇다면 "데이터로 문제를 해결하는 사람이"되기 위해서는 기능과 도구에 국한하면 안된다. Python으로 할 수 있는 것들이 굉장히 다양하므로 웹 프로그래밍, 자동화, 분석, ML, 통계, CS 등 하나씩 즐겨찾기를 해놓는 것이 좋다. 나는 이 관점을 가지게 된 이유가 LG 데이터사이언스 캠프로 튜터로 일했던 2023년이고 지금도 그 방향을 향해 하나씩 분할 정복해가고 있다. 당시 공부방향을 작성해놓았다.
1. 변화의 배경 과거: 2020년 팬데믹 시기에 기업들은 너도나도 데이터 과학자를 고용했지만, 이들 중 상당수가 이론에만 강하고 실제 서비스에 모델을 적용하지 못하는 문제를 겪었습니다. 현재 기업들은 이론적인 모델이 아닌, 실제 문제를 해결하고 비즈니스에 가치를 창출하는 실용적인 솔루션을 원하게 되었습니다. 이로 인해 많은 데이터 과학자들이 해고되었고, 채용 기준도 바뀌었습니다.
2. 학위의 한계와 요구되는 기술 학위의 문제점: 기존 데이터 과학 학위 과정은 확률 분포나 통계적 추론 같은 이론에 치우쳐 있어, 실제 현장에서 필요한 코딩이나 모델 배포 등의 기술을 제대로 가르치지 못합니다.
기업이 원하는 기술: 기업들은 데이터 파이프라인 구축, 클라우드 인프라(AWS, Azure 등), 컨테이너(Docker, Kubernetes), API 개발 등 실무에 바로 투입될 수 있는 기술을 가진 전문가를 찾고 있습니다. 특히, AI와 자연어처리(NLP) 관련 기술에 대한 수요가 급증하고 있습니다.
3. '만능 데이터 과학자' 시대의 종말 전문성의 중요성: 이제 기업들은 모든 것을 아는 만능형 데이터 과학자 대신, 특정 분야에 특화된 전문가를 원합니다. 머신러닝 엔지니어, 데이터 엔지니어, AI/ML 전문가, 분석 엔지니어 등으로 역할이 세분화되고 있습니다.
4. 살아남기 위한 전략 데이터 과학 분야에서 성공하려면 학위만으로는 부족합니다. - 실제 배포 경험 쌓기: Docker, 클라우드 플랫폼(AWS, Azure 등), API 배포 등을 직접 경험해야 합니다. - 데이터 엔지니어링 기본기 다지기: SQL, 데이터 웨어하우징, Apache Spark 등 데이터 처리 기술을 익혀야 합니다. - 비즈니스 문제 해결에 집중: 기술을 비즈니스 문제 해결에 적용하고, 비전문가에게 결과를 명확히 설명하는 능력을 길러야 합니다. - 특화된 분야 선택: LLM/NLP, 컴퓨터 비전, MLOps 등 수요가 높은 분야를 선택해 전문성을 키워야 합니다.
결론적으로, 데이터 과학 분야는 여전히 유망하지만, 이론적 지식에만 머물지 않고 실제 문제를 해결할 수 있는 실무 역량을 갖춘 인재를 필요로 하는 방향으로 진화하고 있습니다.
3.3. 그래서 알고리즘을 알아야하는가? 라는 질문에는
상황에 따르지만 나는 "한번쯤 공부해볼 만하다" 라고 대답한다. 우리의 세부 전공은 회사와 시대에 따라 달라질 수 있고, 그 기반이 되는 것이 튼튼한 기초 지식이다. 사실 이건 알고리즘에 국한하는 것이 아니라 CS, 통계, 클라우드 등 데이터로 문제를 해결하기 위한 앞뒤의 기반들을 포괄한다. 종합적인 관점에서 만약, 구직/이직하는 회사가 코테를 요구하면 최소한의 '완전 구현' 유형이라도 이직 준비할겸 해보길 바란다. 대기업과 같은 일반적인 역량을 요구하는 곳일 수록 더 알고리즘 테스트를 요구할 확률이 높다. 왜냐? 대기업은 한 명을 뽑아서 장기적으로 사용하는 것을 고민하기 때문이다. 일반적인 역량이 있는 사람을 좋아한다. 또한, 본인이 장기적으로 데이터 직군의 과도기를 거쳐 매니저 레벨까지 가고 싶으면 해보아라. 기본기에 가까운 CS와 같은 내용이 좋다. 나는 이런 책들을 하나씩 읽고 기록해나고 있다.
한국농수산물유통공사에서는 kamis라는 데이터 정보 공개 시스템이 있습니다. 이따금 실습용으로 데이터를 불러와서 과일, 채소 시세를 만들어보는 목적으로 데이터를 수집해보는 편입니다. 과거에는 직접 python 코드로 작성해서 데이터를 불러왔는데, 서버를 띄우지 않아서 파이프라인까지는 완성하지 못했습니다. 이번에는 n8n을 공부하면서 low code를 no code 툴로 바꿔서 수집해보고 그 차이에 대해서 한번 고찰해봅니다.
위 분석은 사실 n년전 사이드 프로젝트를 하면서 구현한 결과입니다. 장바구니 대시보드라는 이 주제는 사실 지속성있게 데이터를 수집해야만 의미를 가집니다. 하지만 당시 로컬에서 retrospective 그러니까 현재 기준 과거 날짜에 대한 데이터만 수집했습니다. 지속가능한 프로덕트를 위해서는 서버에 올려서 자동화 및 파이프라인을 구축해합니다. 그래야 대시보드의 본질을 찾을 수 있기 때문입니다.
하지만 당시 이리저리 우선 순위에 밀려 단적인 그래프를 그리고 마치게됩니다. 클라우드에 서버를 빌리고 수집하는 과정이 어려운 일은 아니지만 번거로웠기 때문입니다. 그렇게 시간이 지나 월간 데이터 노트라는 스터디에서 다시 한번 부활하게 되었습니다. n8n이라는 자동화 도구를 이용하면 좀 더 편하게 데이터를 수집할 수 있을까요?
2. 결과: workflow, 데이터
Google Sheet에서 데이터를 주고 받으려면 n8n 클라우드에서는 노드만 추가하고 구글 로그인을 하면 됩니다. 하지만 셀프 호스팅의 경우 인증을 위한 사전 절차가 필요합니다. 다음 n8n 문서에 잘 나와있어서 따라하기만 하면 됩니다.
기본적으로 n8n은 오픈소스여서 내 컴퓨터에 설치해서 실행할 수 있습니다. 하지만 이 과정이 조금 복잡하기 때문에 14일간의 무료 trial 기간을 제공합니다. 셀프호스팅을 하지 않고 진행할 수 있는 점이 장점입니다. 로컬에서 수집하려면 파이썬 설치, 가상환경 세팅 등이 번거롭습니다. 하지만 n8n 은 node로 이루어진 구성 요소를 선택하고 연결함으로써 쉽게 원하는 목적을 달성할 수 있습니다.
장점2: 시각화, 쉬운 모듈화
이따금 복잡한 서비스를 만들다 보면 코드레벨에 있는 스키마를 보여주기 위하여 figjam과 같은 3rd party tool이용해서 그려야합니다. 하지만 n8n은 그 자체로 로직이 보이기 때문에 굳이 스키마를 만들기 위한 시간과 노력을 기울이지 않아도 됩니다. 또한 노드들 하나 하나의 input ouput이 명확하게 보여서 어떻게 작동하는지 파악하기 쉬웠습니다.
Input -> 개별 노드의 파라미터 -> Output
장점3: 좋은 레퍼런스들
입문자들에게는 n8n에서 제공해주는 혹은 강의나 블로그에서 제공해주는 .json형식의 workflow를 따라하는 것만으로도 도움이 됩니다. 공식 문서는 제가 근래 본 오픈 소스 중에 가장 이해하기 편했으며, 포럼도 잘 활성화 되어있습니다. 서비스 안에서는 사이드바에서 LLM assist를 받을 수 있습니다. 생각해보니 LLM assist는 클라우드에서만 제공되는 단점이 있네요.
(좌) Docs (우) Forumworkflow 화면 사이드에 chatbot이 존재
단점1: 어쨋든 알아하는 작동 방식
노코드 툴이 가지는 전체 문제점이기도 하나, 각 개별 노드가 작동하는 방식을 어렴풋히라도 인지 하지 않으면 설계 자체가 불가능합니다. HTTP 노드에서 수행하는 POST/GET 요청의 차이 받아 처리하는 JSON 자료형, API의 개요, 구글 시트를 연결하기 위한 인증 과정들에 대한 이해가 있거나 해결하려는 마음이 있어야 원하는 결과물을 얻을 수 있습니다. LLM에서 "해줘"라고 요청했을 때 바로 수행하는 그런 경험을 기대했다면 실망할 수 있습니다.
단점2: 셀프호스팅의 할 경우 올라가는 러닝커브
n8n을 최초 회원가입하면 14일간의 무료 Trial을 주지만 결국 끝나면 유료 결재를 하게 될 것입니다. 비용을 피하고 싶다면 셀프 호스팅을 해야하는데 docker등에 대한 도구를 사용하므로 자연스럽게 러닝커브가 올라갑니다. 개발에 익숙하면 어렵겠지만 결국 노코드의 장점을 일부 잃어버린다고 할 수 있겠습니다.
4. 짤막한 후기
로우 코드로 직접 구현하고 만드는 과정이 꽤나 귀찮았는데 n8n으로 하니 파이프라인도 쉽게 만들 수 있는 장점이 있는 것 같습니다. 비개발자를 위한 툴이기도 하지만 개발자들도 쉽게 만들 수 있는 툴인 것 같고 Make, Zaiper 등이 가지고 있는 자동화 라인에서 굳건히 자리를 지킬 것 같네요! 종종 쓰게 될 것 같습니다.
아미노산 서열을 가지고 핵에 붙는 단백질인 NLS Explorer로 만들어지는지 예측하는 모델로 Attention 기법을 이용한 딥러닝 분류 모델을 구현해보겠다.
1. 배경지식
핵 위치 신호(NLS)는 단백질 내 중요한 아미노산 서열로, 세포핵으로의 이동을 조절합니다. 이러한 신호를 매개로 한 핵으로의 진입은 핵 수송에 관여하는 필수적인 생물학적 수입 과정입니다. 단백질에서 이러한 부분을 추가하거나 분리하면 핵 위치 신호에 상당한 변화가 나타날 수 있습니다. 이러한 신호 펩타이드에 대한 심층적인 탐구와 위치 분석은 핵 수송의 복잡성을 밝힐 뿐만 아니라 이러한 생물학적 현상을 지배하는 기본 원리를 밝히는 열쇠를 쥐고 있습니다.
아미노산 서열이 접혀서 단백질이 되는 과정을 재현하려면 직접 실험으로 환경을 구축해해야하는데 노동집약적이라 딥러닝으로 분류하게다는 그런 의미이다.
# Mac OS M4(Silicon) Pro
conda create -n NLSExplorer-pyto python=3.7 --platform osx-64
#콘다 환경 설정
conda activate NLSExplorer-pyto
#OS 설정
conda env config vars set CONDA_SUBDIR=osx-64
#패키지 설정
conda install pytorch torchvision torchaudio cudatoolkit -c pytorch -c nvidia
맥북에서는 CUDA가 작동하지 않으므로 Pytorch를 사용하려면 맥에서 자체개발한 MPS 활성화 체크를 하고 사용
import torch
if torch.backends.mps.is_available():
mps_device = torch.device("mps")
x = torch.ones(1, device=mps_device)
print(x)
print("PyTorch is using MPS (Metal Performance Shaders) for acceleration.")
else:
print("MPS is not available. PyTorch will run on CPU.")
print(f"PyTorch version: {torch.__version__}")
Dataset: Put NLSExplorer-p in the folder named "./A2KA_train/Dataset" and extract it using appropriate commands (e.g.,unzip xxx).
3. 코드 작동 뜯어보기
웹사이트 구현도 해놓음!
다음 3.1 ~ 3.3은 Gemini CLI Pro를 이용하여 분석한 핵심 기능 정리
3.1. 핵심 기능
A2KA: 단백질 언어 모델의 표현을 개선하고 어텐션 메커니즘을 활용하여 예측에 중요한 영역을 식별하는어텐션 네트워크
SCNLS: 서열의 패턴 분석, 특히 NLS와 같은 불연속적인 패턴 분석을 위해 설계
NLS (핵위치신호) 예측: 딥러닝 모델(A2KA)을 사용하여 단백질 서열에서 NLS를 예측합니다.
패턴 분석: SCNLS 알고리즘을 사용하여 단백질 서열, 특히 NLS에서 연속적이지 않은 패턴을 분석합니다.
3.2. 주요 파일 및 역할
A2KA.py: 어텐션 메커니즘을 사용하는 딥러닝 모델인 A2KA의 PyTorch 구현을 포함합니다. 이 모델은 단백질 서열 임베딩을 입력으로 받아 NLS 존재를 예측하고 어텐션 분포를 출력합니다.
SCNLS.py: NLS와 같은 서열 모티프에서 불연속적인 패턴을 검색하고 분석하는 SCNLS 알고리즘을 구현합니다. 여러 모드(파일, 단일 서열 등)로 실행할 수 있으며, 멀티프로세싱을 활용하여 효율성을 높입니다.
utils.py: 데이터 로딩, 전처리, 모델 학습, 임베딩 생성 등 다양한 유틸리티 기능을 포함합니다. 특히 esm 라이브러리를 사용하여 단백질 서열의 임베딩을 생성하는 기능이 중요해 보입니다.
Plot.py: 3D 막대 그래프를 생성하여 다차원 데이터를 시각화하는 스크립트입니다. 모델의 어텐션 가중치나 다른 분석 결과를 시각화하는 데 사용될 수 있습니다.
test.py: 텍스트 데이터에서 연속적인 패턴을 추출하고 빈도를 계산하는 테스트 코드를 포함합니다.SCNLS.py의 연속 모드와 유사한 기능을 테스트하는 것으로 보입니다.
3.3. 작동 흐름
데이터 준비: utils.py의 함수를 사용하여 단백질 서열 데이터를 로드하고 전처리합니다. example.csv 또는 Arabidopsis thaliana_0.5.pkl과 같은 데이터 파일을 사용합니다.
임베딩 생성: utils.py의 generate_representation 함수를 사용하여 esm 모델로 단백질 서열을 임베딩 벡터로 변환합니다.
NLS 예측 (A2KA): A2KA.py에 정의된 A2KA 모델을 불러옵니다. 생성된 임베딩을 모델에 입력하여 NLS 존재 여부를 예측하고, 모델이 서열의 어느 부분에 주목했는지 나타내는 어텐션 맵을 얻습니다.
패턴 분석 (SCNLS)
SCNLS.py를 사용하여 NLS 서열 또는 다른 관심 서열에서 패턴을 분석합니다.
--mode 인자를 통해 파일(f), 단일 서열(s), 또는 미리 처리된 데이터(n)를 입력으로 지정할 수 있습니다.
--maxgap, --kths 등의 파라미터를 조절하여 패턴 분석의 세부 설정을 변경할 수 있습니다.
5. 결과 시각화: Plot.py를 사용하여 분석 결과(예: 어텐션 가중치)를 3D 그래프로 시각화할 수 있습니다.
3.4. 요약
이 리포지토리는 NLSExplorer라는 딥러닝 기반의 NLS 예측 및 분석 도구를 제공합니다. A2KA 모델을 통해 NLS를 예측하고 해석 가능한 어텐션 정보를 제공하며, SCNLS 알고리즘으로 서열 패턴을 심층적으로 분석할 수 있습니다. utils.py는 데이터 처리 및 임베딩 생성을 지원하고, Plot.py는 결과 시각화를 돕습니다.
이번 장에서는 캐시에 대해서 기술하며 책의 5번째 여정입니다. 다시 복기하자면 컴파일러 -> 프로세스/스레드 -> 메모리 -> CPU에 이은 장이며, 컴퓨터가 캐싱을 하기 위한 방법과 문제에 대해서 서술합니다.
1. 캐시, 어디에나 존재하는 것
CPU는 메모리에서 정보를 가져와 업무를 수행하며, 이를 더 효율적으로 수행하기 위해서 캐시를 발명
도서관으로 비유하면 캐시는 책상 메모리는 서고
캐시는 L1,L2,L3로 나눠어져 있으며 점차 그 크기가 커짐
가상메모리의 경우 실제 메모리보다 더 크게 설정될 수 있는데 이 경우 하드디스크에 데이터를 저장
저장 형태의 계층 구조
맥북의 경우 활성 상태 보기에서 캐시에 대한 정보를 확인할 수 있음
하단 Cached Files
이전에 인텔 맥을 사용하면서 16기가 중에 거진 15기가를 점유하고 사용하고 있었다. 맥북을 새로 구입하면서 48기가로 구입했는데 오히려 사용량이 31기가로 늘었다(거의 비슷한 환경 구성임에도) 이로 미루어 볼때, 이전에 메모리가 부족해서 로컬 스토리지(SSD)에서 끌어다 쓰고 있다는 사실을 알게되었다.
궁금증1) 파이썬 데이터 처리 메소드 pd.read_csv는 메모리에 저장할까 캐시에 저장할까?
메모리에 저장한다. `info()`, `memory_usage()`로 확인 가능하다
궁금증2) 최근에 채점 서비스를 개발하면서 streamlit 프레임워크(파이썬 프론트엔드)에서 데이터를 저장하는 것을 캐싱으로 제안받았는데 이게 뭘까?