사내 해커톤 '우아톤' 운영 효율화를 위해 AI 기반 플랫폼 개발을 시도하며 기술 도입의 필요성을 느낌
코딩 경험이 없는 상태에서 Claude AI 도구를 활용하여 프론트엔드, 백엔드, DB 연동 등 플랫폼 구축
배포, DB 권한, 디자인 구현, AI 연동 등 개발 과정에서 겪은 네 가지 주요 난관을 극복하며 성장
AI가 95%를 완성해도 마지막 5%는 사람의 섬세함이 필요함을 체감하며 개발 경험 확장
코딩 경험이 전무한 상태에서 Claude AI의 디자인 기능(Claude Design)과 handoff 기능을 활용하여 프론트엔드 화면을 구현했습니다. 초기에는 단순 HTML 파일로 시작했으나, 배포(Deployment)를 통해 웹사이트 형태로 만들고, Claude Design으로 시안을 제작했습니다. 시안을 코드로 옮기는 과정에서 디자인 도구와 코드 간의 미묘한 차이로 어려움을 겪었으나, handoff 링크와 상세 지침서(HTML)를 함께 제공하고 정확한 색상 값(Hex 코드) 및 치수(px)를 명시하는 방식으로 해결했습니다. 특히 '비슷하게'라는 표현을 금지하고 디자인 값을 우선하도록 명확한 규칙을 설정한 것이 핵심이었습니다. 이 과정은 AI가 95%를 완성해도 마지막 5%는 사람의 섬세함이 필요함을 보여줍니다.
사내망에 개발한 페이지를 배포하는 과정에서 배포 그룹 생성 실패(Failed to create deployment group)와 같은 예상치 못한 문제에 직면했습니다. 초기에는 Python FastAPI로 개발했으나, 사내 표준 언어인 Kotlin과 Spring Boot로 포팅하는 과정을 거쳤습니다. 배포 설정 시 AWS 계정 선택 오류로 인해 베타 환경 배포에 실패했으며, 이는 보안팀의 안내를 놓쳤기 때문입니다. 이 문제는 오프라인 미팅을 통해 배포 담당자와 함께 해결했습니다. 사내 배포 시스템의 12단계 작업 중 5단계가 실행되었고, 3분 뒤 배포가 완료되어 최소 기능의 페이지가 사내 주소로 열리는 것을 확인했습니다. 이 경험은 코드뿐 아니라 사내 정책 및 권한 관리도 개발 과정의 중요한 요소임을 시사합니다.
개발 초기에는 SQLite를 사용하여 로컬 파일 기반으로 데이터를 관리했으나, 사내 시스템의 복제 환경에서 데이터 불일치 문제가 발생했습니다. 이에 따라 사내 표준 DB인 MySQL을 도입했습니다. 하지만 테이블 생성 권한 부재로 인해 첫 명령이 0.1초 만에 실패하는 상황을 겪었고, 이는 보안 정책 때문이었습니다. DB 문의 채널과 상세 로깅 시도에도 불구하고 원인 파악에 어려움을 겪었으나, 결국 권한 문제를 해결했습니다. 또한, 로그인 상태(세션) 공유 문제는 공유 DB에 세션 정보를 저장하도록 변경하여 해결했습니다. 이 과정에서 데이터 격리 아키텍처(Data Isolation Architecture)의 중요성과 함께, 코드 외적인 정책 및 권한 설정이 개발에 미치는 영향을 체감했습니다.
마지막 관문은 AWS Bedrock을 이용한 AI 모델 연동이었습니다. 사내에서 발급받은 Bearer 토큰이 AWS 표준 방식인 비밀키 기반의 서명 인증과 맞지 않아 SDK에서 계속 인증 실패가 발생했습니다. SDK가 기본적으로 비밀키를 찾는 구조 때문에 토큰을 어디에 넣어도 서명 시도가 실패했던 것입니다. 이 문제를 해결하기 위해 사내 Bedrock 연동 가이드를 참조하여 SDK의 서명 동작을 비활성화하고 요청에 토큰을 직접 삽입하는 방식으로 연동을 완료했습니다. 이 경험은 외부 서비스 연동 시 표준 방식과 사내 환경의 차이를 인지하고, 공식 가이드라인을 우선 확인하는 것이 중요함을 강조합니다.
개발 초기에는 Claude 데스크톱 앱 채팅 기능과 일반 터미널을 사용했으나, 파일 공유의 불편함으로 Claude Cowork로 전환했습니다. 이후 개발자 동료의 추천으로 IntelliJ IDE를 도입하여 코드 작성부터 실행, 오류 확인까지 통합 환경에서 작업하게 되었습니다. 초기에는 Claude Cowork와의 코드 복사-붙여넣기 방식을 사용했으나, 점차 IntelliJ 터미널에서 Claude Code를 직접 호출하고 커밋하는 방식으로 발전했습니다. 이러한 개발 환경의 변화는 코드 추적의 용이성을 높였으며, 협업 방식의 진화를 가져왔습니다. 최종적으로는 `/design-sync` 기능을 통해 디자인과 코드 간의 오차를 더욱 줄일 수 있을 것으로 기대됩니다.