AI로 만든 앱에 진짜 데이터베이스가 필요한 순간 (그리고 필요 없는 순간)

데이터베이스가 필요해지는 순간은 세 가지입니다 — 두 사람이 동시에 앱을 수정할 때, 데이터가 늘어나면서 속도가 느려질 때, 그리고 조건 두 개 이상으로 레코드를 필터링해야 할 때. 파일로는 이걸 안전하게 처리할 수 없습니다.

데이터베이스는 실제로 무슨 일을 하나요?

데이터베이스의 본질적인 역할은, 같은 앱을 쓰는 두 사람이 서로의 작업을 실수로 덮어쓰거나 망가뜨리지 않도록 막는 것입니다 — 속도, 구조, 복잡한 검색은 그 한 가지 문제를 해결하는 과정에서 따라오는 부산물일 뿐입니다.

AI로 앱을 만들었습니다. 잘 작동합니다. 파일이나 스프레드시트에 데이터를 저장합니다. 모든 게 괜찮아 보입니다.

그러다 다음 두 가지 중 하나가 일어납니다.

  1. 누군가 앱을 쓸 때마다 점점 느려진다.
  2. 두 사용자가 동시에 앱을 쓰다가 뭔가가 망가진다.

이 두 가지 실패는 일이 터지기 전까지는 눈에 띄지 않습니다. 둘 다 사실은 데이터베이스 문제가 다른 모습으로 나타난 것입니다.

아직 파일이나 스프레드시트를 쓰고 있다면, 아마 데이터베이스가 없는 상태일 겁니다. 그건 괜찮습니다. 다만 곧 데이터베이스가 필요해질 거라는 경고 신호는 알고 있어야 합니다.

데이터베이스 없이 그냥 파일만 써도 괜찮은 경우는?

파일은 앱을 쓰는 사람이 나 혼자뿐이고, 데이터 변경이 드문 경우라면 충분히 괜찮습니다 — 이게 판단 기준의 전부입니다.

프리랜서의 포트폴리오 사이트? 파일로 완벽합니다. 개인 가계부? 파일로 충분합니다. 사용자가 한 명뿐인 취미 프로젝트? 굳이 복잡하게 만들지 마세요.

파일이 잘 맞는다는 진짜 신호들:

  • 한 번에 한 사람만 앱을 사용한다(또는 다른 사람이 작업 중일 때 나머지는 오프라인이다).
  • 데이터를 자주 바꾸지 않는다(하루에 한 번, 일주일에 한 번, 한 달에 한 번).
  • 최근 30초 정도의 작업을 잃어도 괜찮다(빌더가 다시 시도하면 되니까).
  • 데이터 파일을 이메일로 보낼 수 있을 만큼 작다(10MB 이하).

네 가지가 모두 해당한다면, 파일을 계속 쓰세요. 정말로요. 단순함은 한계가 아니라 하나의 장점입니다.

AI로 만든 앱이 왜 점점 느려질까요?

앱이 느려지는 이유는 저장하는 파일이 계속 커지는데, 빌더가 뭔가를 수정할 때마다 그 파일 _전체_를 메모리로 불러오기 때문입니다 — 처음에는 거의 티가 안 나지만, 파일이 커질수록 부담이 커집니다.

느려지는 건 처음엔 그냥 “느낌”으로 옵니다. 예전보다 앱이 느리게 느껴집니다. 버튼을 클릭하면 1초쯤 더 걸립니다. 검색은 눈에 띄게 느려집니다. 코드를 바꾼 것도 아닌데 왜 느려졌을까요? 패턴은 이렇습니다.

  1. 앱이 전체 데이터 파일을 불러온다(100줄, 빠르다).
  2. 사용자가 레코드를 하나 추가한다(이제 101줄).
  3. 앱이 확인을 위해 파일 전체를 다시 읽는다(아직은 빠르다).
  4. 레코드 2,000개가 넘으면 파일을 읽는 데 2초가 걸린다.
  5. 레코드 10,000개가 넘으면 20초가 걸린다.

기하급수적으로 느려지는 건 아니지만, 5,000개 근처부터 체감이 되고 20,000개 근처부터는 정말 답답해집니다.

첫 번째 해법(데이터베이스를 도입하기 전에): 빌더에게 데이터를 필요할 때만 불러오도록 요청하세요. 화면에 보여줄 레코드만, 또는 보여줄 열(column)만 불러오게 하는 겁니다. 불러오는 방식만 똑똑하게 바꿔도 파일로 계속 버틸 수 있는 앱이 많습니다.

데이터베이스로 옮겨야 할 때: 데이터가 50,000개 레코드를 넘거나, 불러오기를 최적화했는데도 느림이 계속될 때입니다.

두 사람이 동시에 앱을 썼더니 왜 데이터가 사라졌을까요?

두 사람이 동시에 같은 파일을 수정할 수 있는데, 앱은 그 사실을 알 방법이 없기 때문입니다 — 나중에 저장한 쪽이 이기고, 먼저 저장한 사람의 변경 내용은 조용히 사라집니다. 이걸 “충돌하는 쓰기(conflicting write)“라고 부르며, 전형적인 데이터 손실 버그입니다.

두 사람 모두 자기 화면에서는 자신의 변경 내용을 봅니다. 둘 다 “저장”을 누릅니다. 다음과 같은 일이 생긴다면 이 문제를 겪고 있는 겁니다.

  • 사용자들이 가끔 데이터가 사라졌다고 보고한다(특히 여러 사람이 앱에 동시에 있을 때).
  • 사용자들이 이유 없이 자기 변경 사항이 “되돌려졌다”고 보고한다.
  • 두 사용자가 같은 레코드를 수정했는데 한쪽의 수정 내용이 사라진다.
  • “분명 어제 이걸 추가했는데 지금은 없어졌어요” 같은 메시지를 받는다.

이건 앱의 잘못이 아닙니다. 파일이라는 방식 자체의 한계입니다. 데이터베이스 없이 이 문제를 제대로 해결할 방법은 없습니다.

데이터베이스로 옮겨야 할 때: 아직 문제가 터지지 않았더라도, 두 사람이 동시에 앱을 쓰기 시작하는 순간부터입니다.

파일로는 왜 복잡한 검색을 처리할 수 없나요?

파일을 쓰면 빌더가 관련된 모든 데이터셋을 한 단계씩 직접 불러오고 걸러내야 하기 때문입니다 — 질문 하나를 던지고 답 하나를 받는 게 아니라요. 데이터베이스는 똑같은 일을 쿼리 하나로 밀리초 만에 해냅니다.

예를 들어 “지난 일주일간 연락하지 않은 캘리포니아 고객의 미결제 청구서 전부”를 찾고 싶다고 해봅시다. 파일로 하면 빌더는 이렇게 해야 합니다.

  1. 모든 청구서를 불러온다.
  2. 미결제(unpaid = true) 항목만 걸러낸다.
  3. 모든 고객 정보를 불러와서 ID로 매칭한다.
  4. 주(state) = “CA”인 항목만 걸러낸다.
  5. 모든 연락 기록을 불러와서 고객 ID로 매칭한다.
  6. 날짜가 일주일 이전인 항목만 걸러낸다.

데이터베이스라면 쿼리 하나만 작성하면 됩니다. 밀리초 만에 이 모든 걸 처리합니다.

데이터베이스로 옮겨야 할 때: 빌더가 “그 질문에 답하려면 커스텀 코드를 따로 짜야 한다”고 말할 때입니다. 또는 필터링된 데이터를 보여주기 위해 앱이 지나치게 많은 일을 하고 있다는 게 눈에 띌 때입니다.

데이터베이스가 필요할 때 빌더에게 뭐라고 말해야 하나요?

무엇이 문제인지 있는 그대로 말하고 계획을 물어보세요. 예를 들면 이렇게: “앱이 [느려지고 있어요 / 데이터가 사라졌어요 / 더 복잡한 검색이 필요해요]. 데이터베이스를 추가해야 할 것 같은데, 얼마나 큰 작업일까요?”

대부분의 빌더는 작은 앱이라면 1~2일, 더 큰 앱이라면 며칠 정도면 파일에서 데이터베이스로 옮길 수 있습니다. 과정은 대략 이렇습니다.

  1. 앱은 대체로 그대로 유지한다(사용자 입장에서는 큰 변화가 없다).
  2. 데이터베이스 백엔드를 연결한다(나머지 코드 입장에서는 여전히 파일처럼 보이지만, 내부는 데이터베이스다).
  3. 정말 철저하게 테스트한다(데이터를 옮기는 건 민감한 작업이니까).
  4. 확신이 들 때까지 일주일 정도 둘을 병행 운영한다.

빌더가 이렇게 물어볼 수도 있습니다.

  • “PostgreSQL, MySQL, 아니면 다른 걸 쓸까요?”
    • 당신의 답: “가장 편한 걸로 하세요. 저는 차이를 모르지만 당신을 믿어요.”
  • “3일 정도 걸릴 텐데, 할 만한 가치가 있을까요?”
    • 당신의 답: “어차피 옮겨야 한다면, 데이터가 더 늘어나기 전에 빨리 하는 게 나아요.”
  • “예전 데이터도 옮길까요?”
    • 당신의 답: “네, 100개 미만이 아니라면요. 그 정도면 그냥 새로 시작해도 괜찮아요.”

데이터베이스를 저 스스로 이해해야 하나요?

아니요 — 데이터베이스가 뭔지 알 필요도, SQL을 배울 필요도, PostgreSQL과 MySQL 중 뭐가 나은지 따질 필요도 없습니다. 빌더에게 해야 할 말은 이것뿐입니다: “두 사람이 동시에 앱을 써도 서로의 작업을 잃지 않게 해주세요.”

그게 전부입니다. 데이터베이스 선택은 빌더에게 맡기면 됩니다. SQLite처럼 단순한 것(동시 사용자 10명 미만의 개인용·팀용 앱)이든 PostgreSQL(더 큰 규모라면)이든, 둘 다 그 역할을 해냅니다.


내 앱에 데이터베이스가 필요한지 어떻게 알 수 있나요?

아래 네 가지 중 나에게 해당하는 항목을 체크해보세요 — 두 개 이상 체크됐다면 지금 데이터베이스를 추가할 때입니다.

  • 느려짐: 3개월 전엔 더 빨랐는데 지금은 느려졌다. 데이터 파일이 20MB가 넘거나 레코드가 10,000개를 넘는다.
  • 데이터 손실: 누군가의 변경 내용이 사라졌거나, 여러 사용자가 편집 내용이 사라졌다고 보고했다.
  • 복잡성: “X를 Y로 필터링해서 보여줘” 같은 질문을 하고 싶은데 빌더가 “파일로는 어렵다”고 말한다.
  • 사용자: 한 명 이상이 동시에 앱을 쓴다(가끔이라도).

두 개 이상 체크했다면, 앱은 데이터베이스를 도입할 준비가 된 상태입니다.

하나도 체크하지 않았다면, 파일로 충분합니다. 그대로 유지하세요. 단순함은 그 자체로 가치가 있습니다.

한 개만 체크했다면, 빌더에게 물어보세요: “앞으로 6개월은 이 속도로 버틸 만한가요?” 그렇다면 기다리세요. 아니라면 지금 옮기세요.