본문으로 건너뛰기

오픈 소스 오픈

· 약 9분

추상화의 세계

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

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

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

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

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

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

· 약 13분

처음으로 콘텍스트만으로 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팀원이 한 명 더 있을 수 있겠다. 운영 환경에서 모니터링도 해야하잖아? 매일 재시작 회수나, 서비스의 안정성을 평가하자.

다음 팀을 다시 만든다면?

팀 구성

  • 사람(나): 팀장 - 작업지시서 작성, 작업 지시, 최종 판단
  • AI팀원 "A": 개발자 - 작업지시서 기반 코드 작성
  • AI팀원 "B": 테스트 개발자 - 작업지시서와 "A"가 생성한 결과로 테스트 코드를 작성
  • AI팀원 "C": 보조 개발자 - "A"가 생성한 코드 실행 후 서비스 상태, 실행 결과 리포트
  • AI팀원 "D": QA개발자 - 테스트코드 실행 후 실행 결과 리포트
  • AI팀원 "E": 모니터링 - 서비스의 지속적인 모니터링 후 이상 발생 시 결과 리포트

좀 더 쪼개졌다. 여기서 만든 A,B,C,D는 콘텍스트만 달라진다면, 다른 업무에서도 쓰일 수 있는 AI팀원 페르소나이다.

팀을 더 쪼개는 작업은 아직 구현물로는 나오지 않은 상상의 영역인데, 올해 말까지 팀의 KPI에 속해있으니, 어떤 결과가 나올지 기대가 된다.

회고

위 작업을 통해 내가 얻어간 가치는 다음과 같다.

원래 하던 방식 말고, 다른 시도

그냥 자연 상태의 나라면, 타이핑을 먼저 하지 않았을까? New File 눌러서 대충 LLM에게 채팅처럼 대화했을텐데, 콘텍스트를 작성하는 시도 자체가 좋았다.

적절한 수준의 콘텍스트 작성

콘텍스트를 작성한다는게 생각보다 어렵다. LLM이 이해할 수준의 문맥으로, 지시대명사, 명사를 적절하게 선택해야하기에 에너지 소비가 꽤 큰 작업이다. 그러나 이걸 잘 한다면, 작성이 당연해진다면 산출물의 언어는 중요하지 않을 것이다.

덜고 덜어서 마지막에 남는건 코드가 아니라, 콘텍스트이다. 앞으로 나올 LLM의 성능과 Spring, Node 등 산출물의 종류가 변수라면, 콘텍스트는 상수이다.

AI팀원과 함께 일하는 Agentic Workflow와 앞으로의 방향 가늠

업무를 다르게 해보니, 앞으로의 미래를 어렴풋이 상상하고 가늠해볼 수 있었다. AI와의 협업이 당연한 세상에서 극단적인 생산력 자체를 설계할 수 있는 조직이 승리할 것이다.

개발 도구에 대한 고민

우리 팀은 "생산"만 하는게 아니라, 생산을 끌어올릴 "생산 도구"도 함께 설계하고 구현한다. 지금 사용하고 있는 도구는 테스트 툴로 시작을 했다. 지금의 UI는 코딩을 하는 "사람" 위주의 디자인이라는 생각이다. 앞으로 사람의 업무 방식은 워크플로우를 디자인하고, 컨텍스트를 작성하는게 메인이라면, 지금 가장 넓은 영역으로 구성된 코드 영역이 더 축소되어야 하지 않을까 하는 Developer Experience에 대한 방향도 달라져야 할 것이다.

앞으로

이 글은 콘텍스트 엔지니어링이라는 주제로 시작했지만, 사실 AI와 사람이 팀을 이루어 일하는 것을 설계하는 Agentic Workflow가 주제였다. "AI+사람 조직" vs "사람 조직"의 경쟁 구도라면 결과는 불보듯 뻔하다.

LLM의 등장과 함께, 내가 10년 간 해오던 기술의 가치가 쓸모 없어진 세상을 맞앗다. 방직기를 처음 본 수공업자의 마음이 이것일까.
매일 전 세계에 AI와 관련한 뉴스와 새 발명품이 쏟아진다.

운이 좋게도 전 세계의 패러다임과 함께 앞서가는 방향으로 이끄는 리더와 조직에서 일한다고 있다.

올해는 또 다시 나를 다시 한 번 돌아보고, 지금의 패러다임에서, 내가 잘 하는 것이 무엇일지 가늠하고, 그것에 집중해야겠다.

3년 회고, 그리고 최근

· 약 15분

지난 3년

MHP, 모빌리티 허브 플랫폼

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

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

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

첫 시작

초기 멤버 구성은 도메인 지식, 현대적인 기술력 두 가지의 축이 차집합인 상황이었다. 나는 도메인 지식은 0 이지만, 모던한 기술/문화 수준을 가졌다는 포지션이었다. 2022년 KPI 중 하나가 Site Developer가 있었는데, Site는 도메인, Developer는 기술력을 말한다. 도메인지식과 기술력을 합집합이 되어야, 세계 최고의 데이터 플랫폼을 만들 수 있다는 계획이었다.

사실 MHP는 데이터 플랫폼이다. 아직도 팀의 제품을 사용하는 소비자와 관계자는 주차장 전용 프로그램으로 인식한다. 하지만 플랫폼으로 설계되어있어서, 모든 IT 비즈니스를 얹을 수 있다. 어느 비즈니스든 연결 가능한 구조이다.

시작할 당시 소속된 우리의 조직이 주차 회사였기에, 주차 도메인의 비즈니스를 붙인 것이다.

첫 합류 시기에 나는 주차 도메인과 비즈니스에 대해 전혀 몰랐다. 당시 국내 최고의 모빌리티 전문가 세 분에게 과외 수준으로 수개월 간 그들의 경험과 도메인 지식을 습득했고, 세 분의 평가로 개인 KPI를 달성한다.

내 포지션

내 첫 포지션은 프론트엔드 개발자였는데, 기존 주차장 시스템을 전혀 몰랐기 때문에, 내가 가진 상식이 곧 가장 현대적이고 선진적인 시스템이 되었다.

요금제를 설정한다고 치자. 나에게는 사용자에 대한 고려가 너무도 당연하다. 이걸 다루는 관리자가 불필요한 혼란 없이 UI를 다루어야 하는걸 디자인하고, 구현했을 뿐인데, 좋은 평가를 받았다. 기존 시스템이 그만큼 진보가 더뎠던 것도 있다.

기존의 주차 시스템에서 소프트웨어는 대부분 영세한 업체가 운영하고, 하드웨어/장비를 사면 끼워주는 CD같은 포지션이었다. 굳이 인터넷 연결? 필요없었다. 업데이트 하려면 현장에 가서 USB를 꽂는 식이다. 디지털라이제이션을 주도하는 입장에서는 가능성이 너무 큰, 노다지같은 도메인이다. 1년차에는 체력이 달릴 정도로 과하게 달리긴 했다. 프론트만 하진 않았다. UX/UI 디자인도 같이 했는데, 애초에 혼자 다 한다는걸 상상하지 못하니, 어필할 기회도 없었다.

런칭

팔 수 있는 수준까지 만드는데 9개월 정도 걸렸다. 1주단위 스프린트를 수 십 번 달렸고, 첫 현장 "안산월드타워"에 운영을 시작했다.

MHP는 현장 데이터를 클라우드와 주기적으로 동기화하는 반 쪽짜리 클라우드가 아닌, IoT 하드웨어부터 엣지를 거쳐 중앙의 클라우드까지 모던한 기술과 아키텍처가 적용된 세계 최고 수준의 데이터 플랫폼이라고 자부한다.

3년이 지난 지금은, 데이터 플랫폼으로서 600개 이상의 현장이 우리 시스템을 이용하고 있다. 매일 8천만 건 이상의 HTTP 트래픽, 15억 건 이상의 카프카, MQTT 이벤트가 발생한다.

기여와 성장

프론트만 하던 나는 이제 백엔드, 키오스크, 인프라, 엣지 컴퓨팅, 에이전틱 워크플로우까지 분야를 확장하며 성장했다. 일반적이지 않으니, 넓게 다루면, 얇은거 아니냐는 의심을 받기 마련이다. 일반적인 풀스택 개발은 한정된 시간/에너지 자원을 분할하기 때문에 어느 하나를 깊게 다루긴 어렵다. 대부분 주력분야 외 한 쪽은 그냥 사용하는 수준에 머무른다.

하지만 나는 백엔드-프론트 수준의 풀스택이기보단, 대용량 서비스를 운영하는데 필요에 의해서 로우 레벨까지 고려한다. 여느 SI 회사처럼 구현만 하고 납품하는 방식이 아니라, 매일 1억에 가까운 트래픽을 "운영"해야하기 때문에 깊은 수준으로 다루지 않을 수 없다. 예컨데, 일반적인 백엔드 개발자는 DB 성능 문제가 있다면 기계적으로 인덱스를 선택하지만, 인덱스는 쓰기 비용의 증가이기 때문에, 스키마 설계부터 다시 고려해야하는 대상이다.

HTTP 통신에서 타임아웃은 단순 타임아웃이 아니라, Connection, Read, Write 모두 고려해야 한다.

우리 팀 모두가 그렇다. 전통적인 개발 방법론, 프로세스의 역할과 도메인을 넘나든다. 기획자, 디자이너 없이 그냥 결과가 나온다. 뭘 하든, 무슨 일을 맡든 결과가 나오게 일을 한다.

이 정도 규모의 트래픽을 다루는데, 조직장을 포함해 6명을 넘은 적이 없던 팀 구성은 일반적으로 말이 안 된다. 시작이 0이었고, 리소스가 극도로 제한적이었기 때문에 일반적인 방법은 선택할 수가 없었다.

아무 것도 모르는 기획자 몇 명 뽑아, 일정 관리하고, 디자인 전달해서, 구현이 된다 어렵다 이야기 할 새가 없다. 그럼에도 결과가 나오는 이유는, 가장 적은 비용으로, 큰 가치를 내기 위해, 효과/효율적인 방법으로 접근, 실행하려고 노력하기 때문이다. 적절하게 기여하면서, 동시에 성장하기 위해 문화를 만들고 이끌어주는 리더가 있기 때문이다.

장단점

뭐든 장점만 있지는 않다. 약에는 반드시 부작용이 따른다. 조직의 여러가지 사정으로 팀은 그대로였으나, 소속 회사가 3년 간 2번이나 바뀌었다. 어디서 코드를 배껴왔냐는 둥 시기와 질투같은 풍문도 들었다.

우리는 적절한 시간을 투자해서 좋은 결과를 만들어내고 싶을 뿐인데, 생각보다 주변에서는 잘 도와주지 않는다. 10여 명이 회의에 참석했는데, 아무도 무슨 말을 하지 않는 적막 섞인 미팅에 갔을 때가 3년 전 어느 회의가 생각난다. 첫 현장 오픈하려고, 요구사항을 구두로라도 알려달라고 사정을 해서 겨우 받아 꾸역꾸역 오픈했다.

가끔 동료들과 우스개 소리로 스타트업의 단점과, 중견기업의 단점을 합쳐놓은 것 같다고 말하는데, 요즘 가끔 이렇게까지 해야하냐라는 생각이 드문드문 들기도 한다. 보상은 차치하고, 인정이라도 받으면 기분이라도 좋을텐데, 그런 피드백은 들어본 적이 드물다.

최근에는 채용을 위해 검토하는 지원자의 방향이 우리 방향과 너무 맞지 않아, 인사팀에 공고 링크를 요청하고, 수정하자고 제안하고, 얼마나 지원하는지 채용포털에서 제공하는 기본적인 데이터를 요구했다. 메일 발송 몇 분만에 참조에 걸린 직책자에게 다짜고짜 "팀장과 협의하고 보내는 거냐"고 전화오더라. 우리 팀은 담당자가 아니라, 각자 리더이다. 내가 팀장이 아니라 과장이더라도, 내가 보내는건 팀 전체의 의견으로 본다. 헛웃음이 나왔다. 그게 중요한가? 벽에 부딪히는 느낌을 받았다.

내가 할 수 있는 것

현재 4명으로 구성된 팀 구성원 한 명, 한 명이, "최소" 4.8명의 퍼포먼스를 낸다. 소프트웨어 회사로 발돋음 하겠다는 조직에서, 최소 4.8 이상의 생산을 할 동료를 뽑는데 이걸 모르는걸까.

나는 그냥 불필요한 이력서 검토와 면접에 들어갈 그 시간이 아까웠다. 개발이 지연되고, 내가 목표로 한 스프린트의 업무를 처리 못하면서 면접에 들어가는 내 시간이 너무 아까워서, 우리와 같은 비전을 바라 볼 동료를 찾기 위해 지극히 상식적인 제안을 한건데, 공격으로 받아들이는 걸까?

모두가 내 생각, 뜻이 맞다고는 생각하지 않는다. 직장에 다니면서, 인생을 살면서든, 내가 컨트롤 할 수 없는 부분이 있다고 인정한다.

내가 걱정하는 부분은 내 합리적인 말들이 받아들여지지 않는 경험 그 자체이다. 부정적 리액션을 받게 되면 내 무의식은 불필요한 갈등, 불쾌한 상황을 피하기 위한 부적 강화를 학습한다. 더 나은 방향이 있을 때, 용기있게 말할 수 있어야 우리 모두에게 도움되는게 아닌가 싶은 내 생각은 변함이 없다.

일단 이슈를 팀에 오픈하고, 리더와 콘텍스트를 작성했다. 그리고 MHP팀 전용 채용 페이지를 오픈했다. 그냥 "채용 포털 계정" 주세요 부탁해서 제목과 본문을 모두 수정하고, 얼마나 지원하는지, 어떻게 해야 더 좋은 지원자가 유입 될 지 데이터를 분석하기 위해 여러 장치를 두었다.

어찌 됬든, 내가 할 수 있는 일에 최선을 다해야 후회가 남지 않다고 판단했다. 결국 중요한 건 내가 다룰 수 있는 영역에서 최선을 다하는 것, 그리고 그 과정을 기여와 성장을 함께 할 동료들과 함께 성장을 이어가는 것이라 믿는다.

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

· 약 3분

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




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

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

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

Javascript Function

· 약 7분

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

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

블로그 개편

· 약 7분

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

개인 기술 부채

· 약 5분

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