본문으로 건너뛰기

오픈 소스 오픈

· 약 4분

추상화의 세계

우리는 추상화에 매우 익숙하다. 예를들면 우리는 HTTP를 직접 쓰지 않는다. Node.js로 서버를 구축한다면, 일반적으로 http 모듈을 직접 쓰지 않고, http 모듈 또한 OS에서 추상화된 소켓, 프로토콜, 그리고 네트워크까지 파고 팔 수 있다.

보통 내가 만드는 프로그램의 상위 레벨의 추상화만 어렴풋이 보인다. http 모듈 정도는 보겠지만, OS 소켓까지 너무 먼 이야기이다. 교과서나 교재로 보더라도 나와 거리가 너무 멀어서 와닿지 않을 것이다.

LLM 시대, 왜 기술 부채를 해결해야 할까

그럼에도 불구하고 왜 추상화된 영역을 파헤쳐 봐야할까? 오히려 기술을 자유롭게 사용, 선택하기 위함이다. 대용량을 운영하기 위해서 기술 부채 해결은 필수적이기도 하다.

일반적인 개발, 비즈니스 환경에서 우리는 가치에 집중한다. LLM으로 코드를 생성하는 시대에 오히려 더 중요하다고 생각한다. 콘텍스트를 머릿속의 추론능력으로 최초의 인풋을 만들어야 한다.

AI와 사람이 팀을 이루어서 일하기

· 약 6분

처음으로 콘텍스트만으로 AI를 이용해 개발 업무를 진행했다. 바이브 코딩이나, LLM을 활용해서 코드 일부는 생성해서 적용해보았으나, 코드를 아예 작성하지 않은 적은 처음이다.


내가 소속된 MHP팀에서는 여러 인프라를 모니터링하고, 장애를 감지하기 위해 "Zero Problem"이라는 시스템을 운영중이다.

우리가 사용하는 주 인프라 중 하나인 MongoDB는 멀티 클라우드, 클러스터 구조로 되어있는데, Primary는 쓰기 작업을 하면, 작업 로그라는 특수한 목적의 콜렉션에 기록한다.

두 개의 Secondary는 주기적으로 작업 로그에서 가져와서 Write를 한다. Disk I/O와 같은 DB에 큰 부하가 발생한다면, 앞서 처리해야 할 I/O 때문에, Replication Lag가 발생한다. 때문에, 클러스터 환경에서 대용량 트래픽을 모니터링할 때, Replication Lag 중요한 요소이다.

Zero Problem에 몽고 Replication Lag을 모니터링을 연동하는 간단한 LongTerm 프로그램을 만드는게 내 업무였다.


직접 코딩했으면 완료까지 2시간 정도를 예상했다. 하지만 내가 예측한 작업 시간이 긴지, 짧은지는 모른다. 나는 이 시간이 좀 크다고 생각했다.

작은 일을 하더라도, 노력은 덜하고, 적절한 결과 얻되, 가치를 가져갈 수 없을까 하는 의문과 함께 AI와 팀을 이루어 작업을 지시할 콘텍스트 작성을 시작했다.

진행 과정

  1. 콘텍스트 작성
  2. LLM으로 코드 생성
  3. 코드리뷰
  4. 개발환경에서 실행 후 검증
  5. 운영환경에서 실행 후 검증

팀 구성

내가 만든 간단한 팀은 팀장인 나와, 개발자인 AI팀원 두 명으로 구성된 단순한 팀이다.

  • 사람(나): 팀장 - 작업지시서 작성, 작업 지시, 코드 실행, 테스트, 반영 여부 판단
  • AI팀원 - 지시서를 바탕으로 코드를 작성한다.

콘텍스트 작성

우리는 Controlplane이라는 자체 개발 환경을 가지고 있는데, 테스트와 배포, 모두 같은 환경에서 이루어진다.

콘텍스트라는 단어에 대해 다시 생각해보자. 콘텍스트는 한글로 문맥인데, 글의 핵심을 말한다. 네트워트 프로그램에서 콘텍스트는 무엇일까.

  • 목표 또는 비즈니스 로직, 의도
  • 스키마
  • API 설계

LLM의 역할, 페르소나를 넣어야 하기 때문에 지시 사항, Instruction도 함께 필요하다.

당신은 lc 프레임워크 코드를 생성하는 AI 에이전트입니다. 
아래 본문 내용과 Instruction에 따라 별도 설명없이 LongTerm 코드를 작성하세요.

# Goal
클러스터 환경에서 서비스되는 몽고DB 인프라의 Replcation Lag 수집과 소비

# Instruction
- 서비스 아이디는 mhp.zeroproblem.mongo.replcationlag
- 몽고db 접속 정보는 "clusterKeeper" infra as label 사용
- 1분 마다 한번 씩 cluster mongo의 Replcation Lag을 수집
- Primary와 Secondary와의 lag 차이를 miliseconds 단위로 계산
- 수집한 Replcation Lag를 Schema 형태로 가공 후 API 형태로 조회
- messages 배열은 내용을 "단 하나"만 넣고 유지하고, actionBody 하위에 마크다운 문법의 문자열 사용
- RED, YELLOW, GREEN 기준
- Green (정상) 0 ~ 5000ms
- Yellow (주의) 5000 ~ 30000ms
- Red (위험) 30000ms 이상
- 수집한 Replcation Lag 데이터의 저장은 서비스 내부 변수의 메모리를 사용하세요

스키마와 API 설계도 함께 전달한다.

# Schema
{
[서비스아이디]: {
"status": "RED" | "YELLOW" | 'GREEN",
"timestamp": new Date().getTime(),
"messages": [
{
"statusCode": "",
"statusBody": "mhp.zeroproblem.mongo.replcationlag",
"actionCode": "",
"actionBody": `- Primary {서버이름} replcation lag 0ms \n- Secondary replcation lag 0ms \n- Secondary replcation lag 0ms`,
}
]
}
}

# API
- PUT /mhp.zeroproblem.mongo.replcationlag
- 수집한 Replcation Lag의 수집 결과가 담긴 Schema를 body 형태로 응답
- GET /liveness
- lc mongo connection 여부
- 최근 수집한 데이터의 timestamp가 3분 이내이며, 클러스터 환경에서 lag 데이터를 정상 수집 중인 경우 200 OK 응답

이 정도 컨텍스트로 코드를 생성하고, 리뷰하길 몇 번 반복한다.

AI 팀원에게 코드 작성을 지시하고, 나는 리뷰를 한다.

코드를 한 줄 한 줄 세세하게 보진 않지만, 대충 100줄짜리 코드를 보고, 팀장인 내가 리뷰를 한다.

콘텍스트 수정/코드실행 반복

우리가 구축한 LLM은 RAG 방식, 좀 더 세부적으로는 MCP 서버의 툴이기 때문에 생성할 코드의 산출물이 되는 프레임워크의 문법을 조금 알고있지만, 자세히는 모르기 때문에, 콘텍스트 노트에 예시 코드 추가해준다.

## 데이터 수집 로직 example
const db = $.mongoose('clusterKeeper');
const client = db.getClient();
const adminDb = client.db('admin');

adminDb.command({ replSetGetStatus: 1 })
.then((results) => {
console.log(JSON.stringify(results))
})
.catch(e => { $.log(`오류 발생 ${e?.message}`) });

이렇게 생성된 코드를 테스트도 하고, 실행도 시켜본다.

코드 생성

테스트 코드 실행

조금만 더 깊게 생각해보면, 테스트와 플레이도 내가 해야할까? 몇 번 반복하면 되지 않을까?


인풋으로 내가 만든 콘텍스트와, AI팀원이 생성한 코드를 받아, 테스트코드를 작성하는 개발자 AI팀원이 한 명 더 있을 수 있겠다. 코드를 실행시키고 결과를 리포팅하는 AI팀원이 한 명 더 있을 수 있겠다. 테스트코드를 실행시키고 결과를 리포팅하는 AI팀원이 한 명 더 있을 수 있겠다. 운영 환경에서 모니터링도 해야하잖아? 매일 재시작 회수나, 서비스의 안정성을 평가하자.

다음 팀을 다시 만든다면?

3년 회고, 그리고 최근

· 약 6분

지난 3년

MHP, 모빌리티 허브 플랫폼

이 조직에 속한 지, 3년 5개월이 지났다.

소프트웨어 개발 분야로 일하기 시작하고, 운 좋게 처음 만난 개발 조직에서 멘토를 만났다. 당시 그 분의 블로그를 유의 깊게 보고 있었는데, 그분이 속한 회사를 알아내 지원했었다. 각자의 길을 갔지만, 수 년 간 수시로 조언도 받고 하다가, 2022년, 그 멘토분이 조직장인 팀에 합류했다. (이러 저러한 사정이 있었는데, 11번가에서 함께 하던 분들에게는 정말 죄송한 일이었다.)

코드 한 줄 없지만, 팀 빌딩부터, 사무실 구조, 시스템 아키텍처, 제품의 미래까지 하나 하나까지 디테일하게 설계되어 있었다.

광고 - 고양이 유산균 추천해요!!

· 약 2분

이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다.




안녕하세요 저희 고양이가 몇년째 먹고있는 유산균 추천합니다

Jarrow Formulas 자로우 포뮬러스 도피러스 EPS 유산균 100억 CFU, 120정

Jarro-Dophilus EPS®는 장과 면역 건강에 도움을 주는 8가지 고유의 프로바이오틱스 균주를 제공합니다. 100억 개의 살아있는 박테리아가 함유되어 있으며 베지테리언 캡슐 제형으로 채식주의자도 섭취하실 수 있습니다.

Javascript Function

· 약 3분

요즘 내가 회사에서 서비스 하고있는 프론트엔드의 화두는 쪼개기이다. 3년 동안 서비스를 조금씩 개발하다보니, 개발, 관리 비용을 증가했는데, 이를 줄이기 위해 백엔드, 프론트엔드 할 것 없이 여러가지 테스트를 해보고 있었다.

마이크로 프론트엔드 (Micro Frontend)의 패턴 중 Javascript 런타임 통합을 테스트해보던 중, 함수를 생성자로 써보면서 되면서 함수에 대해 여러가지 학습한 내용을 정리했다.

블로그 개편

· 약 3분

블로그를 개편했습니다. 이제 글을 좀 쓰려구요. 그 동안 많이 바뀐 제 여러가지 생각을 어느 공간에 담으려고 합니다.

개인 기술 부채

· 약 2분

누구에게나 개인적인 기술 부채가 있을겁니다.
기술 부채의 특징은 금융에서 말하는 부채와는 큰 차이가 있습니다.