Culture

코드에서 1급 시민으로 다룬다는 것

AI에게 기능이 아니라 설계를 시키는 법

Matthew (형섭)Matthew (형섭)
·
# Software Design# Clean Code# Soft Skill
코드에서 1급 시민으로 다룬다는 것
date
slug
author
status
tags(최대 3개)
summary
type
thumbnail
category
updatedAt
AI에게 기능을 만들어 달라고 하면 기능이 생깁니다. 개념을 1급 시민으로 다뤄 달라고 하면 설계가 생깁니다. 그 차이에 대한 이야기입니다.

Why

AI로 코드를 짜는 시대가 되면서 코드를 많이 만드는 일은 쉬워졌습니다. 그런데 좋은 코드를 만드는 일은 여전히 어렵습니다.
AI에게 "사이트가 만료되면 막아 줘"라고 말하면 금방 코드를 만들어 줍니다.
if (site.expired) { throw new Error('Site expired'); }
틀린 코드는 아닙니다. 하지만 이런 코드가 여기저기 생기기 시작하면 문제가 됩니다. 로그인에서도 막고, API에서도 막고, 결제에서도 막고, 관리자에서도 막습니다. 처음에는 단순한 조건 하나였는데 어느 순간 시스템 전체에 흩어진 규칙이 됩니다.
이럴 때 필요한 표현이 있습니다. 이 개념을 1급 시민으로 다뤄야 한다.
notion image

1급 시민

원래 프로그래밍에서 1급 시민(first-class citizen)은 어떤 대상을 다른 값들과 동등하게 다룰 수 있다는 뜻입니다. 예를 들어 TypeScript에서 함수는 1급 시민입니다.
const fn = () => console.log('Hello'); run(fn); return fn;
함수를 변수에 담을 수 있고, 인자로 넘길 수 있고, 다시 반환할 수도 있습니다. 함수가 특별한 문법이 아니라 하나의 값처럼 다뤄지는 것이죠.
그런데 실제 서비스를 만들다 보면 이 말은 조금 더 넓은 의미로 쓰입니다. 제가 생각하는 1급 시민은, 시스템이 이해하고 관리해야 하는 하나의 개념이 되는 것입니다.

만료를 1급 시민으로 다룬다는 것

사이트가 만료되었다고 해보겠습니다. 처음에는 단순히 이렇게 처리할 수 있습니다.
if (site.expired) { throw new Error('Site expired'); }
하지만 서비스가 커지면 "만료이면 오류" 정도로 끝나지 않습니다. 만료된 사이트는 로그인 정책이 다를 수 있고, 관리자 화면에서 다르게 보여야 할 수 있고, API 응답도 달라야 할 수 있습니다. 결제나 연장 안내로 이어져야 할 수도 있고, 로그와 통계에서도 구분되어야 할 수 있습니다.
이쯤 되면 만료는 단순한 boolean 값이 아닙니다. 시스템이 알아야 하는 상태입니다. 그래서 이렇게 승격시킵니다.
enum SiteStatus { ACTIVE = 'ACTIVE', EXPIRED = 'EXPIRED', SUSPENDED = 'SUSPENDED', }
코드는 이렇게 바뀝니다.
if (site.status === SiteStatus.EXPIRED) { // 만료 상태에 맞는 정책을 적용한다. }
이 차이는 생각보다 큽니다. 이제 만료는 흩어진 조건문이 아니라 이름을 가진 공식적인 상태가 됩니다. 화면도, API도, 로그도, 통계도 이 상태를 이해하고, 알림도 이 상태를 기준으로 움직일 수 있습니다. 시스템 안에서 시민권을 얻은 셈입니다.

AI에게 맡기는 법

AI에게 일을 맡길 때도 이 표현은 중요합니다. 그냥 이렇게 말하면 기능이 생깁니다.
사이트가 만료되면 접근을 막아 줘.
하지만 이렇게 말하면 설계를 하게 됩니다.
사이트 만료 상태를 1급 시민으로 다뤄 줘.
이 말은 단순히 if문을 하나 추가하라는 뜻이 아닙니다. 만료라는 개념을 타입에 반영하고, 도메인 모델에 반영하고, API 응답에 반영하고, 로그와 이벤트에 반영하고, 테스트에서도 하나의 시나리오로 다루라는 뜻입니다.
AI는 요구사항을 빠르게 코드로 바꾸는 데 강합니다. 하지만 그냥 기능만 요청하면 가장 가까운 곳에 조건문을 추가할 가능성이 높습니다. 반대로 1급 시민으로 다뤄 달라고 말하면, 그 기능을 임시로 처리하지 않고 시스템이 관리하는 정식 개념으로 설계하려 합니다.
저는 이 차이가 앞으로 더 중요해질 거라고 봅니다. AI 시대에는 코드를 쓰는 능력보다, 어떤 개념을 시스템의 중심에 올려야 하는지 AI에게 말해 주는 능력이 더 중요해질 수 있습니다.

마무리

좋은 설계는 예외를 계속 추가하는 일이 아닙니다. 반복해서 등장하는 개념을 발견하고, 그 개념을 시스템의 1급 시민으로 승격시키는 과정에 가깝습니다. 처음에는 조건문이었던 것이 상태가 되고, 상태였던 것이 이벤트가 되고, 이벤트였던 것이 정책이 됩니다. 그 과정에서 코드는 조금씩 단순해집니다.
새로운 기능을 만들 때 저는 종종 이렇게 묻습니다.
이건 시스템이 이해하는 1급 시민인가?
아직 if문으로만 존재한다면, 언젠가 여러 곳에 흩어질 가능성이 높습니다. 반대로 시스템이 이해하는 개념이 되면 그때부터는 관리할 수 있습니다. 코드는 기능을 만드는 작업이기도 하지만, 그보다 더 중요한 건 시스템이 관리해야 할 개념을 발견하는 작업인지도 모릅니다.
AI에게도 마찬가지입니다. 이 기능을 만들어 달라고 하면 기능이 생기고, 이 개념을 1급 시민으로 다뤄 달라고 하면 설계가 생깁니다.
 
김형섭 CTO 아임웹 기술 조직을 이끌고 있습니다. 개발을 사랑합니다.

댓글