리팩토링 배경
내가 속한 학생단체는 20년 넘게 오랜기간동안 우리 대학교에서 소프트웨어를 만들어왔다.
그래서 오래전에 작성한 웹서비스가 아직도 돌아가고 있는 경우가 있다.
그러다보니 배포 방식에도 관련해서 문제가 생겼다.
최근 추세는 쿠버네티스(이하 k8s)클러스터에 배포하는 방향으로 서비스를 배포하는데, 오래전에 작성한 웹서비스는 물리 서버 위에 Virtual Machine을 만들어 그 위에서 돌아가는 형태로 구축되어 있다.
이러다보니 여러가지 문제점이 생기는데,
1. 배포 방식이 단일화되지 않아 배포에 불편함이 생긴다.
2. 이미 할당된 VM의 공간이 부족해지면 더이상 파일을 못올린다.
2번 문제의 경우 특수한 경우이다.
우리 서버는 핫스왑베이에 디스크가 모두 장착되어 있고, VM 할당도 이상하게 되어 더이상 저장공간을 늘릴 수가 없다.
그런데, Virtual Machine에 올라간 서비스들이 로컬 파일 시스템을 이용하여 사용자가 업로드한 파일 등을 관리하다보니 더이상 용량이 부족해 파일을 올리지 못하는 사태가 발생하기도 했다.
그래서 우리 단체에서 최근 활용하는 쿠버네티스와 MinIO(오픈소스로 제공되는 오브젝트 스토리지로, Amazon S3와 호환된다)를 이용하여 배포하는 방식을 변경하기로 했다. 사실 아무도 안하길래 내가 해야지 싶었다

물론 내가 직접하지는 않고, 요즘 핫한 AI Agent인 Openai의 Codex를 활용할 것이다.
여러 AI Agent가 있지만 경험상 Codex가 가장 깔끔한 코드와 응답을 제공했던 것 같다.
제미나이는 모델의 자체적인 성능은 좋은것 같지만 내가 프롬프트 엔지니어링을 못하는지 내 작업을 제대로 이해하지 못하는 경우가 있었다. 사실 내가 프롬프팅만 잘 했어도 더 나은 결과를 얻었을 수도..?
반면 Codex는 내가 개떡같이 말해도 찰떡같이 알아듣고 작업을 수행했다.
보고있나 OpenAI 내게 광고를..!
리팩토링 시작
배포방식을 변경하는데 리팩토링을 왜 해야하냐고 물어볼 수 있다.
일단 기존 소스코드에는 다음과 같은 문제점이 있었다.
1. 환경변수와 같은 민감한 파일이 소스코드 내에 상수로 작성되어 있었다.
2. 로컬 파일 시스템을 이용하는 기능을 MinIO를 이용하도록 수정해야 한다.
3. 오래전에 작성된 소스코드라 관련한 의존성이 deprecated된 경우가 있다.
이 문제점들을 해결하기 위해 먼저 feat/refactoring 이라는 새로운 브랜치를 만들었다.
이후에 작업의 순서를 미리 구상했다.
1. 너무 오래된 node 버전이나 의존성의 경우 코드 리팩터링을 최소화하는 수준으로 노드 버전을 업그레이드 한다.
2. 프로젝트 내에 있는 민감한 정보나 상수는 환경변수로 분리하고, 소스코드를 수정한다.
3. 로컬 파일 시스템을 이용하는 기능을 MinIO를 이용하도록 수정한다.
4. 기존 서버에 있는 정적 파일들을 MinIO로 이전하고 테스트한다.
5. 테스트가 통과되면 k8s를 통해 배포한다.
이중에서 4,5는 안정성의 문제로 내가 직접하기로 했고, 나머지 소스코드를 수정하는 1,2,3 번 작업을 AI한테 맡기기로 했다.
의존성 업데이트
가능한 최신 버전으로 올리고 싶었지만, 불가능한 경우도 있었다.
Sequelize의 경우 버전을 올리면 문법이 매우 달라져서 소스코드를 전부 뜯어야 하는 문제가 있었다.
Swig 템플릿 엔진의 경우 아예 2018년에 read-only로 바뀌면서 유지보수가 막혀서.. 최신버전으로 올리는거는 전부 포기하기로 했다.
단 node 버전을 적어도 16 수준으로 올리고 기타 라이브러리 의존성은 그대로 두기로 했다.
환경변수 분리
귀찮은 작업중 하나인데 Codex가 프롬프트 한번에 해결해줬다.
"프로젝트 내에 있는 상수와 민감정보(db연결 등)을 전부 찾아서 .env로 분리해. 그리고 프로젝트에서 dotenv를 이용해 환경변수를 참조할 수 있도록 해줘. 그리고 환경변수 정보를 README.md에 작성해"
저 프롬프트 하나로 환경변수를 분리하는 작업은 한번에 해결했다.
심지어 기존에 작성된 README.md 파일의 중간에 환경변수 내용을 적절히 추가해줬다.
MinIO 이전
우리 모두가 제일 막막하다고 여겼던 작업이 MinIO 이전이다.
로컬 파일 시스템을 프로젝트 여러군데에서 사용하고, 또 로컬파일시스템에 있는 파일들 자체가 양이 너무 많았기 때문이다.
근데 Codex가 기존에 로컬파일시스템을 이용하는 코드를 찾아서 MinIO를 이용하도록 전부 재작성했다.
나한테는 해당 디렉터리 그대로 업로드하면 된다고 말해줘서 그대로 MinIO로 업로드했다.
결과는 성공적이였다.
신규 파일 업로드/다운로드와 함께 기존파일 다운로드도 정상적으로 작동했다.
K8s 배포
쿠버네티스에 배포하는건 사실 쉬웠다.
Gitops 템플릿 그대로 가져다가 이름과 도메인만 수정해주면 끝났다.
하나 귀찮은 점은 환경변수를 Vault에 등록하는 일이였고, 그 외에는 할게 없었다.
소감
AI Agent를 써보면서 느낀건데, 이젠 AI를 사용하지 않는 개발자는 시장에서 점점 사라질것 같다는 생각이 들었다.
AI가 발전하는 속도가 매우 빠른 만큼 직접 사용해보면서 새로 나오는 기술들을 빠르게 익혀야 할 것 같다.
단순히 AI만 쓴다고 좋은 개발자가 되는건 아닌거 같고, 내가 알고있는 CS 지식과 프로젝트에 대한 배경들과 함께 AI를 활용할때 가장 빛을 볼 수 있는 도구인것 같다.
'Coding' 카테고리의 다른 글
| 기술부채란 무엇인가? (feat. 내가 쌓은 기술부채) (3) | 2025.01.03 |
|---|
소프트웨어학과 현주씌의 일상을 담는 블로그
포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!