우리의 데이터는 소중해!
"아놔, 누구냐고!"
"파일 실종된 거 실화?"
"아니, 내 파일 어디 갔어!"
"누가 삭제 버튼 눌렀냐"
"팀장님, 지금도 파일이 빛삭되고 있어요!"
분위기 순식간에 싸해지고… 팀장은 결단을 내립니다.
"일단 서버부터 내려!"
회사에서 이런 일 벌어지면 정말 킹받지 않나요?
업무에 꼭 필요한 '핵꿀템' 파일이 삭제되는 순간. 그건 개인의 빡침을 넘어 회사 전체의 손실로 이어지는 대참사가 되죠. 날아간 데이터를 복구하지 못해서 처음부터 다시 작업해야 한다면? 으… 생각만 해도 현타가 제대로 옵니다. 시간, 돈, 노동력이 순식간에 증발하는 건 기본이고, 이것 때문에 팀원들이랑 싸우기라도 하면 그날 하루는 그냥 망한 거죠.
"백업 안 했냐고?"
"왜? 도대체 왜?"
"아니, 백업도 안 하고 뭐 했냐고!"
"이 자료 다시 받는 게 얼마나 빡센 줄 앎?"
"이걸 어떻게 또 보내달라고 메일을 보내요!
데이터가 날아가면 여기저기서 불만이 폭주하는 거. 완전 인정하시죠? 자료가 필요한 사람이든 관리하는 사람이든 개빡치는 스트레스에 결국엔 말싸움 각이 나오는 거예요. 삭제 로그를 딱! 보여줘도 소용없어요.
"내가 안 그랬는데?"
"난 진짜 아무것도 안 만졌음"
아니, 파일은 증발했는데 삭제한 사람은 없다는 이 어이없는 시추에이션은 대체 뭐죠?
데이터를 조금이라도 다루는 회사라면 '백업'은 그냥 기본 중의 기본 스킬인데 막상 일하다 보면 다들 이걸 너무 쉽게 잊어버린다는 게 함정이죠.
데이터를 다루는 조직에게 백업은 국룰입니다. 하지만 모두가 그 중요성을 알면서도 제대로 지키지 못하는 경우가 태반이죠.
백업 시스템? 그런 거 없는데요.
아직도 체계적인 백업 시스템이 없는 회사가 정말 많아요. 그냥 정책도 시스템도 없는 거죠. '알아서 잘하겠지' 하는 마음이랄까요.
"아, 맞다! 백업!"
업무에만 집중하다 보면 백업은 그냥 머릿속에서 잊혀져요. 일단 눈앞에 닥친 일이 바쁘면 백업은 우선순위에서 저~ 멀리 밀려나는 거죠.
"전 아닌데요?" (네 탓 내 탓 책임 회피)
그러다 데이터가 사라지면? 다들 "전 아닌데요?" 시전하기 바빠요. '내 잘못은 절대 아니다'라는 이 암묵적인 문화. 다들 아시죠?
무늬만 백업, "백업은 했는데 복구는..."
백업은 하고 있는데 막상 필요할 때 신속하게 복구하는 절차는 한참 부족해요. 그래서 정작 데이터가 날아가도 그 백업 파일을 제대로 쓰지 못하는 아이러니한 상황이 벌어지죠.
막간 Tip: Cursor에서 에러가 나면?
Cursor가 짜준 코드에서 에러가 떠도 절대 당황하지 마세요. 앞 챕터에서도 말씀드렸 듯이 마치 옆자리 동료에게 묻는 것처럼 자연스럽게 대화하듯 물어보는 게 핵심이랍니다.
Cursor 코딩 중 에러? 이렇게 하면 끝!
1. '패키지 설치' 에러가 떴을 때
터미널에 뜬 에러를 쭉~ 긁어서 Add to Chat으로 보내주세요.
2.Cursor에게 SOS 요청하기
커서 우측 채팅 패널에 수정 요구 사항 입력.
코드를 확인해보니 pandas 모듈이 필요한데 설치되어 있지 않아서 오류가 발생하고 있습니다. 이 문제를 해결하기 위해 필요한 패키지들을 설치하겠습니다.
3. Run 버튼만 누르면 끝!
Run 버튼만 누르면 필요한 패키지가 자동으로 설치되고 에러도 싹~ 사라져요.
4. 파이썬 코드 실행
이제 다시 실행해보면 우리의 백업 앱이 아무 문제 없이 잘 돌아가는 걸 볼 수 있답니다. 정말 쉽죠?
이번에도 ChatGPT에게 먼저 말을 걸었어요. 만들고 싶은 백업 툴의 '주문서'를 아주 상세하게 전달했죠.
질문: 백업 툴의 핵심 기능이야. 아래 요구대로 파이썬 코드로 작성해줘. (ChatGPT)
폴더 선택 & 백업 실행
진행률 표시
중복 파일 건너뛰기
로그 기록
스케줄링
GUI 프레임워크는 PyQt로!
진행률 표시 바
복사 중인 파일 이름 실시간으로 표시
시작/중지/일시정지 버튼
상태 메시지로 현재 상황 알려주기
증분 백업
파일 해시 비교
백업 히스토리 관리
자동 정리
이렇게 구체적으로 '주문'하면 AI가 훨씬 더 똑똑하게 알아듣고 우리가 원하는 결과물에 가까운 코드를 만들어준답니다.
ChatGPT, 코드를 부탁해!
'주문서'를 전달하고 조금만 기다리면 ChatGPT가 정말 촤라라락- 하고 코드를 뱉어내기 시작해요.
ChatGPT가 만들어준 코드를 가지고 우리의 만능 작업대인 Cursor로 돌아올 시간이에요.
1. 새로운 파일 만들기
backup_test.py 라는 이름으로 새로운 파일을 만들어주고요.
2. 코드 복사 & 붙여넣기
ChatGPT가 짜준 코드를 여기에 그대로 붙여넣습니다.
3. 떨리는 첫 실행!
Run Python File 버튼을 클릭해서 실행하면...
짜잔! 이렇게 우리의 첫 번째 '백업 툴'이 모습을 드러냅니다. 매번 볼 때마다 신기해요.
4. 1차 백업, 한번 실행해 볼까요?
일단 돌아는 가네요!
5. 스케줄 백업 실행
간단한 스케줄 백업도 잘 돌아가네요.
AI가 처음 뱉어낸 코드는 솔직히... 좀 못생겼을 수 있어요. 기능도 부족하고 디자인도 밋밋하죠. 하지만 절대 실망하실 필요 없어요! 원래 그런 거니까요.
초기 버전의 목표는 정말 딱 하나, '일단 돌아가는가?' 입니다.
버그 없이 실행만 된다면 이미 절반 이상은 성공한 거예요.
그때부터가 진짜 시작이랍니다!
하나씩 기능을 더하고 디자인을 다듬으면서 '나만의 앱'으로 진화시키는 거죠. 튼튼한 뼈대를 세우고 그 위에 예쁜 살을 붙여나가는 과정. 그 즐거움을 한번 느껴보세요!
UI 디자인. 이거 정말 항상 고민이죠?
그래서 준비해 봤습니다. 요즘 가장 핫하다는 AI 모델들을 싹 모아놓고 똑같은 코드를 던져주며 UI 개선을 요청하는 미니 실험!
실험 참가자:
Cursor, ChatGPT, Claude, Gemini, Grok 등등…
놀랍게도 AI마다 개성이 정말 폭발하더라고요. 어떤 친구는 모던하고 미니멀하게, 또 어떤 친구는 화려하고 직관적인 디자인을 제안했죠.
여러분들이 할 일은 정말 간단해요.
AI들이 제안하는 다양한 시안을 구경하고 내 취향을 저격하는 스타일을 '픽'해서 그걸 기반으로 발전시키면 끝! 디자인 영감을 얻는 가장 빠르고 쉬운 방법일 거예요.
밋밋한 내 UI, AI로 심폐소생 질문:
UI가 너무 촌스러워. 상용 툴처럼 고급스럽게 바꿔줘. 요즘 유행하는 스타일로.
커서의 채팅 창에 앞에 질문을 그대로 입력.
아래 결과물을 보시죠. 정말 다채로운 UI를 만들어주죠.
Cursor
고급 스러운 UI 장착
Claude
Claude Code
ChatGPT
Grok
Gemini
Gemini Cli
일단 돌아가는 앱을 뽑아낸 것만으로도 정말 칭찬할 일이죠. 하지만 이건 이제 막 데모 딱지를 뗀 '찐' 프로토타입. 이왕이면 다홍치마라고. 이 정도로는 아직 만족할 수 없죠.
지금부터는 Cursor에게 디테일하게 '요청'해서 우리 회사에 '착붙'하는 앱으로 만들어야 해요.
국룰인 백업 기능부터 제대로 다듬어주고 우리 팀만 아는 '바로 그' 편의 기능들까지 야무지게 추가하는 거죠.
이제 데모 딱지 떼고 실전용으로 떡상시킬 시간입니다!
솔직히... 시중에 쓸 만한 백업 툴이 정말 없더라고요. 좋은 건 너무 비싸고요.
저희 조건이 좀 빡세긴 했어요. 이걸 다 만족하는 툴을 찾는 게 아마 더 힘들었을 거예요.
실시간 백업은 기본이고
DB 연동도 필수
거기에 수천만 개 자잘한 파일 폭탄까지 처리해야 함.
매일같이 리눅스 rsync 스크립트를 들여다보는 것도 지치고 짜증도 나서... 그냥 AI 멱살 잡고 직접 만들기로 했습니다.
결과는? 폼 미쳤음.
그동안 골치 아팠던 실시간 모니터링 & 상세한 로그 기록? 이제 전부 다 돼요. 그냥... AI가 다 해줬거든요.
'이걸 정말 AI로 만들었다고?' 싶으시죠?
네, 이게 되더라고요. AI 바이브 코딩이 이걸 정말로 해결해 줬습니다.
이제 우리만의 보물인 AI 백업 툴이 완성되었어요. 깔끔한 인터페이스까지... 이 정도면 한번 팔아볼까 하는 생각도 살짝 드네요.
상용 백업 툴 못지 않게 안정적이며 수많은 파일을 핸들링 가능한 앱이 필요했어요. 기존 상용 툴을 여럿 테스트해봤지만, 이 모든 조건을 충족하는 프로그램은 없었어요.
안전제일: 사용자가 지정한 폴더를 주기적으로 그리고 아주 안전하게 백업하기!
스마트하게: 중복되거나 불필요한 파일은 알아서 척척 건너뛰기.
유연하게: 미러링(똑같이 복사) 백업과 인크리멘탈(변경된 것만 추가) 백업 모두 지원하기.
빠르게: 어마어마한 대용량/대규모 파일도 빠르고 효율적으로 관리하기.
예쁘게: 상용 소프트웨어 부럽지 않은 고급스러운 GUI 제공하기.
실용적이게: 기업이든 개인이든 누구에게나 유용한 실용적인 기능 제공하기.
1. AI 바이브 코딩의 구조화, 왜 필요할까요?
AI 바이브 코딩의 최대 장점이자 동시에 무서운 함정이 뭔지 아세요?
바로 '일단 되게' 만들어준다는 거예요.
그래서 처음에는 main.py 파일 하나에 모든 걸 다 쑤셔 넣게 돼요. 마치 원룸에 가구, 옷, 전자제품, 책을 그냥 다 던져 넣는 것처럼요.
근데 저희가 만든 백업 앱처럼 기능이 덕지덕지 붙고 복잡해지기 시작하면? 그 원룸은 순식간에 쓰레기장이 되는 거죠.
나중에 AI에게 "저기 파란색 셔츠 좀 찾아줘" 하고 부탁해도 AI는 코드 더미 속에서 길을 잃고 헤매기 시작해요.
이때 필요한 게 바로 '구조화', 즉 '폴더 정리'랍니다.
예를 들면 이런 거죠.
옷은 옷장에
책은 책장에
설정 파일은 config 폴더에.
이렇게 기능별로 파일을 분리해서 착착! 정리해두는 거예요. 그래야 나중에 내가 찾기도 쉽고 AI가 도와주기도 훨씬 수월해진답니다.
2. 구조화의 장점!
코드가 깔끔해서 나중에 내가 다시 봐도 편하고요.
수정할 일이 생겼을 때 해당 파일만 쏙 빼서 고치면 되니 정말 쉬워져요.
무엇보다 AI가 코드를 훨씬 더 빠르고 정확하게 이해한답니다.
한 줄 요약:
코드를 길게 늘어뜨리지 말고 기능별로 잘게 쪼개세요. 그게 바로 당신과 AI 우리 모두가 사는 길이랍니다.
3. backup_app의 구조화
│
├── � main.py # 메인 애플리케이션 진입점
│
├── �️ ui/ # UI를 생성하고 backup을 초기화하며, config를 불러오는 핵심적인 역할.
│ ├── widgets.py # (중요) 메인 창, 버튼, 목록 등 핵심 UI 컴포넌트를 포함.
│ ├── styles.py # 테마 및 스타일 관리
│ └── project_manager.py # 백업할 프로젝트를 추가, 수정, 삭제하는 UI 로직을 처리.
│
├── ⚙️ backup/ # 백업 엔진. 실제 백업 작업을 수행하는 핵심 로직.
│ ├── worker.py # (중요) 파일 복사, 동기화 등 무거운 작업을 백그라운드 스레드에서 처리.
│ ├── handlers.py # 파일 생성, 수정, 삭제와 같은 파일 시스템 이벤트를 감지하고 대응.
│ └── initializer.py # 백업 시작 전 초기 동기화 작업을 담당
│
├── �️ utils/ # 애플리케이션 전반에서 사용되는 보조 기능들의 모음.
│ ├── logger.py # 작업 내역과 오류를 기록.
│ ├── rsync_config.py # rsync 설정
│ ├── path_manager.py # 파일 및 디렉토리 경로를 관리.
│ ├── admin_auth.py # 시스템의 특정 폴더에 접근하기 위한 관리자 권한 획득.
│ └── memory_manager.py # 메모리 관리
│
└── � config/ # 애플리케이션의 동작 방식을 제어하는 설정 파일들이 위치.
├── settings.py # 애플리케이션 기본 설정
└── projects.json # 등록한 백업 프로젝트 목록을 저장하여, 앱 재시작 시 목록을 유지.
코드를 한 파일에 전부 몰아넣는 거요? 그거 우리 같은 초보 때나 하는 거예요.
진짜 '쫌 아는' 개발자분들은 기능별로 파일을 샥샥 쪼개서 쓴다고 하더라고요. 이걸 있어 보이게 '구조화' 또는 '모듈화'라고 부른답니다.
1. Cursor에서 하는 리팩토링: '코드 대청소' 시간!
리팩토링? 그거 어려운 말 아니에요.
그냥 '코드 대청소' 하는 거라고 생각하면 편해요.
한번 상상해보세요. 여러분의 방은 그대로인데 내부 가구 배치를 싹 바꾸고, 엉망으로 꼬여있던 전선들을 깔끔하게 정리하는 거예요.
방의 기능(자는 곳, 노는 곳)은 바뀌지 않죠? 하지만 훨씬 더 깔끔하고 살기 편해지잖아요.
리팩토링이 딱 그거예요.
겉으로 보이는 결과물은 똑같지만 코드의 뼈대를 더 튼튼하게 만들어서 미래의 나를 구원하는 아주 중요한 작업이라고 할 수 있죠. 나중에 기능을 추가하거나 버그를 잡을 때, '아... 그때 정리 좀 해둘걸...' 하고 머리를 쥐어뜯기 싫으면 꼭 해야 하는 거랍니다.
물론 hello_world.py 같은 간단한 코드에 리팩토링은 좀 오바죠.
하지만 우리 백업 앱처럼 방 5개짜리 대저택 수준이라면?
주기적으로 대청소(리팩토링)를 안 해주면 금방 쓰레기장이 되고 말 거예요.
그러니까 조금이라도 복잡한 코드를 짤 땐, 무조건 리팩토링 각을 잡고 들어가야 한다는 사실! 잊지 마세요.
2. 구조화 전, 한 개 파일로 작성한 백업 코드
이게 바로 그 '모든 걸 쑤셔 넣은 원룸' 같은 코드예요.
기존 코드는 한 개의 파일에 모든 기능이 몰빵되어 있었죠.
3. 모듈화 리팩토링 고고!
Cursor의 채팅 창에 이렇게 한번 질문해 보세요.
UI, 백업, 상수 부분으로 구조화 시켜서 리펙토링 해줘.
그러면 Cursor가 자동으로 코드를 분할하기 시작해요. 잠시만 기다리면 정말 쭉쭉 잘도 뽑아준답니다.
4. 리팩토링 완료
기존의 단일 파일(backup_test_cursor_refactoring.py)을 다음과 같이 역할에 따라 깔끔하게 정리했어요.
모듈별 분리
constants.py - 상수들만 모아두는 비밀 서랍장
파일 경로, 윈도우 설정, 색상 코드 같은 모든 설정을 여기에 중앙 관리!
backup_engine.py - 백업의 '심장'을 담당하는 엔진룸
실제 백업 작업을 수행하고 관리하는 모든 로직이 여기에!
ui_components.py - 재사용 가능한 예쁜 버튼과 막대기들
앱 곳곳에서 쓰이는 UI 부품들을 모아뒀어요.
main_window.py - 우리 앱의 '얼굴'
전체적인 UI 레이아웃을 구성하고, 버튼 클릭 같은 이벤트를 처리해요.
app.py - 모든 것을 시작하는 '시동키'
애플리케이션을 초기화하고 실행하는 바로 그 파일!
5. 주요 개선사항
모듈화: 단일 파일 → 6개 모듈로 분리
상수 관리: 모든 설정값을 constants.py로 중앙화
UI 컴포넌트화: 재사용 가능한 UI 컴포넌트 생성
백업 엔진 분리: 백업 로직과 UI 로직 분리
코드 가독성: 명확한 구조와 주석
이제 app.py만 돌리면 됨.
이제 그 길고 복잡했던 backup_test_cursor_refactoring.py 파일 대신, app.py 파일 하나만 실행하면 돼요. 그러면 놀랍게도 결과물은 이전과 완전 똑같이 나온답니다.
이게 바로 그 유명한 '겉바속촉'이죠.
겉(기능)은 똑같고, 속(코드)만 깔끔해진 거예요.
6. 코드 해체쇼 끝. 이제 각 파츠별로 완벽 분리됨.
이제 우리 앱은 각자 자기 역할만 하는 부품들로 완벽하게 조립된 상태예요.
왜 이렇게까지 하냐고요? 이게 바로 똑똑하게 코딩하는 '지름길'이니까요.
이렇게 했을 때 뭐가 좋을까요?
수정할 때: 길 잃을 일 없이 딱 그 파일만 열어서 고치면 돼요.
업글할 때: 새로운 기능? 그냥 새 파일로 만들어서 '부품'처럼 끼워 넣으면 끝!
테스트할 때: 전체를 다 돌릴 필요 없이 필요한 부품만 쏙 빼서 테스트하면 되고요.
재활용할 때: 이 UI, 이 엔진? 다른 프로젝트에서도 얼마든지 가져다 쓸 수 있어요.
코드 읽을 때: 누가 와서 봐도 "아, 이 프로젝트 구조 좀 치네" 소리가 절로 나오죠.
AI 바이브 코딩할 때 '한 파일 몰빵'은 그냥 습관성 자해 행위예요.
AI랑 코딩하다 보면 자연스럽게 한 파일에 코드를 계속 쌓게 돼요. 그게 편하니까요.
어차피 '나'는 코딩 안 하고 AI가 다 해주니까 코드가 좀 길어져도 상관없어 보이죠.
...그거, 정말 큰 착각입니다.
코드가 뚱뚱해질수록 AI는 점점 길을 잃고 헛소리를 하기 시작해요.
분명 여기를 고쳐달라고 했는데 저 멀리 다른 곳을 망가뜨려 놓거나 그런 끔찍한 경험을 정말, 정말 많이 하게 되실 거예요.
이걸 방지하는 유일한 방법이 바로 '구조화', 즉 기능별로 파일을 잘게 쪼개는 것이랍니다.
이렇게 하면요?
관리? 쌉가능. 업그레이드? 아주아주 쉬움.
기억하세요.
똑똑한 AI를 더 똑똑하게 쓰는 건 결국 '구조'를 짜는 당신의 몫이라는 것을요.