-
[사이드 프로젝트] grep 명령로 리팩토링 작업 범위 파악, curl 도구로 Github API 이용하기사이드 프로젝트 2025. 4. 2. 01:17반응형
안녕하세요 아렉스입니다 :> 오늘은 사이드 프로젝트에 참여하여 레거시를 파악한 작업 방식에 대해 얘기해 보겠습니다.
no - architecture 로 진행하여, MVP 출시까지 빠른 흐름으로 개발이 되어있었습니다.
고도화 작업을 통해 아키텍처를 도입하고 코드 퀄리티를 점진적으로 개선하고 싶다는 기존 개발 팀의 요구사항이 있었습니다.
PM, iOS, 서버, 디자인팀으로 구성되어있으며, 일정 주기로 전체 회의를 진행하며, 작업 상황을 공유합니다.
작업 상황 공유를 원활하게 하기위해서는 명확한 작업 범위와 일정을 산정하는 것이 중요하다고 생각했습니다.
앞으로 팀원들과 해야할 일들을 정리하며 아래와 같이 우선순위를 정해보았습니다.
1. 신규 피처 개발 분배 및 일정 산정
2. no - architecture 에서 점진적으로 개선할 아키텍처 선정3. 리팩토링 작업 범위 및 일정 산정
회의를 진행하며, 신규 피처 개발 및 기술 적용이 최우선 하게되었습니다. 레거시이긴해도 현재 배포가 되어 대부분 버그 없이 서비스가 운영이 되는 코드이기 때문에 리팩토링은 프로젝트를 분리하여 관리하기로 했습니다.해야할 일을 역순으로 생각하며 정리해보곘습니다.
Github project를 사용하여 issue 및 Pull Request를 관리를 하기위해서는...
약 80개의 ViewController 파일에 대한 issue를 생성 하기위해서는...
뭘 어떻게 해서 파악해야하지 ?
1. 리팩토링 대상 파악
기존 조직에 합류하여 리팩토링에 대해서 묻게되면 보통 아래와 같은 답변을 들을 수 있습니다.
합류하기 이전 코드 전부요 ... ㅎ
코드 전부라는 표현은 매우 모호하고, 모호한 표현과 작업은 결국 작업에 있어서 혼란을 야기할 수 있다고 생각합니다.
이제 막 팀에 합류한 제가 기존 프로젝트 코드를 파악하는 것은 쉽지않은 일이었습니다.
작업 단위를 나누는 가장 편한 접근은 화면 단위로 나누는 것이었습니다.
전체 뷰와 파일을 하나하나씩 살펴보는 것은 프로젝트 파악에는 도움이 되겠지만, 리팩토링 대상을 파악하는데는 병목을 발생 시킬 수 있습니다.
맞습니다 iOS 앱 개발을 할 때 어떤 아키텍처를 채택하더라도, UIViewController를 상속한 클래스와 파일을 빼두고 얘기하긴 어렵습니다.
검색 기능을 활용해보자 ! Open Quickly.. 기능을 통해 현재 프로젝트에는 어떤 네이밍이 적용되었을지 빠르게 파악해보았습니다.
공통적으로 OOViewController.swift 로 네이밍이 되어있었습니다.
iOS 개발이라고 가정하여 해당 문제를 접근해본다면
프로젝트 디렉토리를 순회하며 OOViewController.swift 접미사를 가진 패턴 파일을 탐색을 떠올립니다.
해당 방식을 Xcode가 아닌 터미널에서 실행해주면 될 것 같습니다.
2. 명령어 실행하여 프로젝트 내 ViewController 목록 구하기
grep -rl "ViewController.swift" --include="*.swift" . | sed 's#.*/##' | sort -u | tee /dev/tty | wc -l # 현재 디렉토리(.)에서 "ViewController.swift" 문자열을 포함하는 Swift 파일 목록을 재귀적으로 검색 grep -rl "ViewController.swift" --include="*.swift" . # 파일 경로에서 디렉토리 경로를 제거하고, 파일명만 출력 sed 's#.*/##' # 중복된 파일명을 제거하고 정렬된 목록 출력 sort -u # 명령어 출력을 터미널에 표시하면서 동시에 파이프라인으로 넘김 tee /dev/tty # 출력된 파일 개수(라인 수)를 계산하여 출력 wc -l
해당 명령어를 실행하면 아래와 같은 파일 목록을 얻을 수 있습니다.
3. Shell Script 작성 및 curl 도구로 실행
Github API 를 활용하여 issue를 생성해줄 계획입니다.
2번 작업을 통해 구한 ViewController 리스트를 선언하여 순회하며 curl 도구를 통해 HTTPS 요청을 하는 스크립트입니다.
#!/bin/bash # 이슈로 등록할 ViewController 리스트 VIEW_CONTROLLERS=( "AccountDeleteFinalViewController.swift" "AccountDeleteViewController.swift" "AudioRecordViewController.swift" "BaseViewController.swift" "BottomSheetViewController.swift" ... 생략 ) # GitHub Personal Access Token (PAT) GITHUB_TOKEN="토큰 입력" # ✅ 위에서 생성한 토큰 입력 # Organization 및 Repository 설정 ORG="조직 이름" # ✅ Organization 이름 REPO="레포지터리 이름" # ✅ Repository 이름 # 모든 ViewController 파일에 대해 이슈 생성 for FILE in "${VIEW_CONTROLLERS[@]}"; do TITLE="🚀 [Refactor] $FILE 개선 작업" BODY="## 리팩토링 범위\n\n<!---\n$FILE, 관련 Scene 등을 구체적으로 작성해주세요 !\n-->\n\n### ✅ 리팩토링 계획\n- **변경 사항**:\n - [ ] 아키텍처 변경\n - [ ] 코드 정리\n - [ ] 중복 코드 제거\n - [ ] 성능 개선\n - [ ] 테스트 코드 추가/수정\n - [ ] 변수/함수 명 변경\n - [ ] 기타 (구체적으로 작성)\n\n## 🏃♂️➡️ 우선순위\n- [ ] 높음\n- [ ] 중간\n- [ ] 낮음\n\n## ⏰ 예상시간\n\n## 🤔 검토 사항\n- [ ] 리팩토링 중 발생할 수 있는 잠재적 리스크나 이슈가 있나요 ?\n- [ ] 이 리팩토링 작업이 다른 작업이나 기능에 의존하나요 ?\n\n### ⭐️ 완료 기준\n\n- [ ] 모든 코드 변경 완료\n- [ ] 코드 리뷰 완료 및 승인" # GitHub API 호출하여 이슈 생성 RESPONSE=$(curl -s -X POST "https://api.github.com/repos/$ORG/$REPO/issues" \ -H "Authorization: token $GITHUB_TOKEN" \ -H "Accept: application/vnd.github.v3+json" \ -d "{\"title\": \"$TITLE\", \"body\": \"$BODY\", \"labels\":[\"🔨 Refactor\"]}") # 이슈 URL 추출 ISSUE_URL=$(echo "$RESPONSE" | grep -o '"html_url": *"[^"]*' | cut -d'"' -f4) if [ -n "$ISSUE_URL" ]; then echo "✅ Created Issue: $ISSUE_URL" else echo "❌ Failed to create Issue for $FILE" echo "Response: $RESPONSE" fi # GitHub API Rate Limit 회피 (1초 대기) sleep 1 done
4. 확인 및 결론
issue 가 잘 생성되어, Github Project에 추가 된 모습입니다 ! 👏👏👏
막막했던 리팩토링 목록을 정리하고, Github Project에 추가해 작업 상황을 쉽게 트래킹할 수 있도록 프로세스를 개선하였습니다.
잘못된 내용 혹은 이해가 어려운 내용들은 언제든 댓글에서 의견 교환하고 싶습니다!
공감과 구독은 더 나은 글을 작성되는데 큰 도움이 됩니다.읽어주셔서 감사합니다.