
(기획서)
평소에 일을 주는 에이전시 누나가 앱 출시좀 도와달라고나한테 연락을 해왔다. 보통 이러한 어플리케이션 개발은 건수가 크기때문에 돈이 많이 들어오는 것이라 설레였는데, 웬걸? 앱 하나 만들기에는 너무 낮은 금액이었다. 아예 받지 않으려고 했다. 근데 처음부터 만드는게 아니라, 이미 앱이 있고 일부 수정만 하면된다고 했다. 나는 돈 한푼이 급하기때문에 그걸 받아들였다.
그리고 그 앱은 에이전시 누나가 만든 바이브 코딩 앱이었다.
"제가 바이브 코딩으로 만든 앱입니다"
그러니까 바이브 코딩으로 기능은 다 되는데 요점은 내부 코드 품질이나 문제등으로 인해서 통과가 안되니까 코드좀 고쳐달라고 하는 것이었다.
평소에 의뢰비도 적절히 주기도 하거니와, 이번 금액도 완전히 바닥부터 만드는게 아니었고, 인간 관계를 위해 일주일 정도 작업하였다.
위 화면이 프론트 서비스다. 생각보다 나는 AI틱해서 별로 마음에 들지 않는데, 에이전시 누나는 오히려 '이제 사람들이 AI에 익숙해서 오히려 이게 뉴 노멀이다'라고 했다.
일단 IOS 통과까지 하는 것을 금액으로 일정 금액을 받고 페이블 5.1과 아스트라 6.0이 만든 코드를 손보았다. 어쨌건 전부 통과까지 시켰다.
고치면서 느낀 것을 몇개 써보겠다.
1.에러 처리 방식의 일관화가 안되있었다.
보통 프로그래밍의 에러 처리는 중앙화 하고 에러 정책을 정해서 에러 종류에 따라서 포맷을 통일한다. 하지만 AI 코드에서 그런 방식이 없었다. 어떤 에러는 throw,어떤 건 return이었다. 호출자 입장에서 예측불가였다.
해결법: 라우트 안에서는 res.status() 직접 호출 금지와 에러타입 정의를 정의해서 작업했다.
2. server.js 한 파일의 책임 분리 실패
라우트와 SQL, 파일 I/O와 종료 코드가 Server.js 한 파일에 몰려 있었다.
여기에 더해서 /api/auth 의 action 분기는 RESET 설계상으로 나쁘다. 보통 POST/signup,POST/login 으로 나눠야하는데, 이러한 기본적인 일처리가 안되있었다
해결법:계층 분리 작업을 했다.
3. 선언 순서가 에러처리를 정하고 있었다.
호이스팅 함정의 문제였다. wrap이 const 화살표 함수라서, 선언(:330)보다 앞에 등록된 라우트 8개는 wrap을 못 쓰고 자체 try/catch를 썼다.
해결법:라우트 등록전에 모든 모든 미들 웨어를 선언하는 것으로 해결했다.
4. 보일러 플레이트가 많았다
헬퍼 함수가 있는데도 같은 검사를 인라인으로 18번 정도 반복했다.
보통 가드헬퍼는 재사용을 하는 것을 전제로 하는데, 인라인으로 돌면 18회 전부 일치해야한다. 이러한 것은 테스트가 불가능하다
해결법: 그냥 하나로 통일했다.
5. 중복코드가 많았다.
심지어 hashPasswrod 불일치가 심각했는데, SHA-256으로 해시한 비밀번호와 서버에서 scrypt로 해시한 비밀번호가 호환되지 않았다.
해결:서버쪽으로 통일 했다.
가장 뛰어난 인공지능이라고 불리는 FABLE 5.1과 Astra 6.0도 이러한 실수를 하고 있었다.
그외에도 다양한 문제가 있었다.
가입도 되고, AI API 호출해서 이미지도 만들어지는데, 뭐가 문제인지 이해가 안된다고 이야기를 했다. 처음에 기술적으로 몇마디 알려줬지만 그런거 말고 되는지 안되는지만 말해라고 해서 말을 하지 않았다.
어쨌건 이번 일은 정신적으로 좀 큰 충격이 되었다.
단순 CRUD앱에서 조차 이런 문제가 있었고, 내가 AI를 쓸때는 나오지 않은 문제가 나오길래 당황했다.
내가 쓰는 AI는 내가 이해하지 못하고 심지어 빠르기까지 한 코드를 생성하는데 이런 허술한 코드를 짜는게 말이 정말 되는 것인가?
이게 정말 충격적이었다. AI 코드를 아예 검증하지 않으면 내 코드에도 이런 문제가 있을 것일까 라는 충격이 있었다.
기능 구현은 실제로 눈에 보이니까.근데 그것과 별개로 내가 잘 아는 분야에서 이런 실수가 있다면 내가 AI를 신뢰할 수 있을까?
처음 몇몇부분은 정말 잘 짰지만 내가 눈을 뗀 시점부터 AI가 정말 내가 처음에 봤던 코드 퀄리티를 유지하느냐는 다른 문제인 것이다.
그외에도 스테이징 서버를 따로 두지 않았다는 점도 있었고 여러 문제가 있었지만, 그 누나는 너무 좋아했다.
"이거 성공할 거 같죠?"
기획은 좋았지만 너무 품질이 조악해서, '그건 아닐 거 같아요'라고 말을 하려 했지만 너무 좋아해서 뭐라고 말을 하지 않았다.
그외에 더 큰 문제가 있고 전부 고쳤다라고 말하긴 어렵다. 그리고 결국은 어쨌건 최대한 고쳤고, IOS와 구글 스토어를 통과시켰다.
여전히 내가 보기에 문제가 산재해있다. 스테이징 서버가 없어서 테스트도 힘들고, 여러 기능에서 validation이 없다.
그렇지만 앱은 나름 달리고 돌아가고 결정적으로 의뢰인이 너무 좋아하니까 말리고 싶지 않았다.
그나마 급한 불로 결제 관련한 것들은 테스트를 붙여서 결제와 환불은 실패하지 않게했다. 내 최소한의 양심이었다. 그렇지 충분한 테스트를 거치지 않아서 불안하다.
하지만 어쩌면 내 불안일 수도 있을 것이다.
이게 뉴노멀일 수도 있다. 다만 내 상식이 언제까지 상식일까.
그리고 이번에 내가 신뢰하던 AI에 대한 믿음이 깨진 것이 너무 충격적이었다.