서론

우리 서비스는 공고와 합격 자기소개서, 지원 후기, 멘토 질문 등의 기능을 지원하는 취업 플랫폼이다.

최근 이러한 기능들을 기업을 중심으로 한 데 모으고 큐레이션하는 기업정보페이지를 새롭게 출시했다. 

지금까지와는 다른 대규모 프로젝트였기에 여러 시행착오를 겪었는데, 그 중 하나는 개발 일정 산정이 두 차례 번복된 것이었다. 그 간은 일정이 조금 밀리더라도 약간의 초과근무와 QA 기간을 활용하여 처리가 가능했는데, 이번에는 기획 규모가 커지고 기능 간 의존성이 높아지면서 예상보다 훨씬 많은 지연이 발생했다.

그래서 프로젝트가 끝난 뒤, 과정을 돌아보며 원인을 정리하고, ChatGPT에게 개선 노하우를 물어보았다.

 

 본론

문제 1 : 기획서를 아무리 자세히 여러 번 읽어도 직접 개발하면서만 알아채는 사항이 있는 문제가 있었다. 

 

 

기획서는 보통사용자 입장으로 작성되므로 화면을 기준으로 작성된다. 백엔드 개발 범위를 파악하기 위해서는 기획서를 화면 중심”이 아니라 “데이터 흐름 중심”으로 읽어야 한다.

 

좋아요 버튼을 누르면 숫자가 올라간다.

→ 많은 백엔드 개발자가 단순히 /like 하나 만들면 끝이라 생각하지만, 실제로는 다음 작업이 필요하다.

좋아요 등록 좋아요 추가 POST /posts/:id/like
좋아요 취소 좋아요 제거 DELETE /posts/:id/like
좋아요 여부 조회 사용자가 이미 좋아요했는지 확인 GET /posts/:id/like/me
좋아요 수 조회 좋아요 총 개수 반환 GET /posts/:id/like/count
알림 처리 게시글 작성자에게 알림 전송 이벤트 트리거
통계 반영 인기글 지표 업데이트 비동기 큐 혹은 배치

 

즉, 겉보기에는 단순한 기능이라도
데이터 변화와 그 파급효과를 기준으로 보면 훨씬 많은 백엔드 작업이 숨어 있다.

 

문제 2: 이 작업은 1일이면 될 줄 알았는데 3일이 걸린다.


이는 기능을 구성하는 세부 요소를 충분히 분해하지 않은 채 일정 산정을 했기 때문이다. 작업을 시작하기 전에 다음 질문들을 점검해볼 필요가 있다.

데이터 모델 이 기능이 어떤 엔티티를 새로 만들거나 수정하는가?
API 설계 이 화면에서는 몇 개의 API 호출이 필요한가? CRUD 기준으로 나눠봤는가?
비즈니스 로직 단순 CRUD인가, 아니면 검증·트랜잭션·알림·로그 등이 추가되는가?
외부 연동 외부 API, 인증, 파일 업로드, 메시지큐 등의 의존이 있는가?
비기능 요구 캐시, 권한, 성능, 트래픽 대응 등의 고려사항이 있는가?

 

“사용자는 프로필을 수정할 수 있다.”

-> 위 기능을 백엔드 입장에서 세분화하면 다음과 같다.

 

데이터 모델: 이 기능이 어떤 엔티티를 새로 만들거나 수정하는가?
→ users 테이블의 nickname, profile_image_url, intro 필드를 수정한다.
필요 시 이미지 경로(cdn_path) 필드를 추가하거나, 변경 이력을 저장할 user_profile_log 테이블을 별도 관리할 수 있다.

 

API 설계: 이 화면에서는 몇 개의 API 호출이 필요한가? CRUD 기준으로 나눠봤는가?
→ 단일 엔드포인트 PATCH /users/:id/profile 을 제공한다.
요청에는 nickname, profile_image, intro가 포함되며, 응답으로 갱신된 사용자 정보를 반환한다.
일부 케이스에서는 GET/POST 병행 테스트가 필요할 수 있다.

 

비즈니스 로직: 단순 CRUD인가, 아니면 검증·트랜잭션·알림·로그 등이 추가되는가?
→ 단순 CRUD를 넘어 다음 처리가 필요하다.

  • 로그인 사용자만 접근 가능 (req.user.id === params.id)
  • 닉네임 중복 체크 (DB 또는 캐시 조회)
  • 이미지 업로드 후 S3 URL을 CDN 경로로 변환
  • 수정 후 로그 기록 및 알림 이벤트 발생
  • 트랜잭션 처리 및 예외 핸들링 포함

외부 연동: 외부 API, 인증, 파일 업로드, 메시지큐 등의 의존이 있는가?
→ S3를 사용하여 프로필 이미지를 업로드하고,CDN 경로를 저장한다.

(선택적으로 알림 시스템을 통해 수정 이벤트를 전송할 수도 있다.)

 

비기능 요구: 캐시, 권한, 성능, 트래픽 대응 등의 고려사항이 있는가?

  • 이미지 업로드 크기 제한 (최대 5MB)
  • S3 업로드 실패 시 재시도 처리
  • DB 트랜잭션 내 원자적 업데이트
  • Redis 캐시 무효화 (사용자 캐시 업데이트)
  • 수정 로그 및 모니터링 추가

 

이처럼 단순한 문장 하나가 실제로는 여러 단계의 로직을 포함하므로,
세부 항목 단위로 쪼개어 공수를 추정해야 실제 일정과의 차이를 줄일 수 있다.

+ Recent posts