스타트업에서 혼자 일하는 주니어 개발자가 야근 없이 스프린트 마치는 기준
TuBrief 편집팀
2026년 8월 22일
0
정신 건강원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
커뮤니티의 다른 글
댓글 (0)
Log in to leave a comment
아직 작성된 글이 없습니다
원본 영상을 바탕으로 AI의 도움을 받아 작성했습니다. 원본 영상이 기준입니다.
Log in to leave a comment
아직 작성된 글이 없습니다
사수 없이 혼자 프론트엔드를 개발하다 보면 기술적 불안감에 쫓깁니다. 클린 코드 책을 옆에 두고 완벽한 추상화를 고민하다가 결국 스프린트 마감 직전에 번아웃을 겪는 패턴이 반복됩니다. 필요한 것은 무결한 아키텍처가 아니라 제시간에 동작하는 제품을 내보내는 현실적인 기준입니다.
소프트웨어 설계 전문가 샌디 메츠는 잘못된 추상화를 걷어내는 비용이 중복 코드를 유지하는 비용보다 훨씬 크다고 지적합니다. 실제로 댄 아브라모프도 무리한 중복 제거가 컴포넌트의 유연성을 망친다고 경고했습니다.
단순한 코드 복사로 생긴 문제는 해당 파일 안에서 50분 내외로 고칠 수 있습니다. 반면 성급하게 만든 공통 훅이나 상속 구조는 요구사항이 조금만 바뀌어도 수많은 if-else 분기를 만들어냅니다. 결국 버그를 찾는 데만 2주 이상 걸립니다.
리팩토링 여부는 마틴 파울러의 기술 부채 사분면과 아담 돈힐의 핫스팟 분석을 기준으로 결정합니다.
| 영역 | 기준 (복잡도와 변경 빈도) | 대응 방식 |
|---|---|---|
| 즉시 수정 | 비즈니스 영향 높음 × 변경 빈도 높음 | 기능 구현 직후 테스트 작성과 인터페이스 정리 후 배포 |
| 선택적 수정 | 비즈니스 영향 높음 × 변경 빈도 낮음 | 백로그에 부채 티켓으로 등록 |
| 일단 배포 | 비즈니스 영향 낮음 × 변경 빈도 높음 | 최소 동작만 검증하고 배포, 추상화 금지 |
| 작업 보류 | 비즈니스 영향 낮음 × 변경 빈도 낮음 | 코드가 지저분해도 수정 생략 |
이 기준을 적용하면 불필요한 공통화 작업에 쏟는 시간을 줄여 전체 개발 속도를 끌어올릴 수 있습니다.
변수명, 줄 바꿈, 린트 규칙 위반 같은 스타일 지적은 도구로 걸러내야 합니다.
스마트베어가 시스코 시스템즈의 코드 리뷰 2,500건을 분석한 연구에 따르면, 한 번에 검토하는 코드 분량이 200줄 미만일 때 결함의 70%에서 90%가 발견됩니다. 작성자가 PR에 변경 이유를 직접 코멘트로 남기면 결함 밀도가 평균 30% 줄어듭니다.
// eslint.config.js
import js from "@eslint/js";
import globals from "globals";
import tseslint from "typescript-eslint";
import pluginReact from "eslint-plugin-react";
import pluginReactHooks from "eslint-plugin-react-hooks";
import eslintConfigPrettier from "eslint-config-prettier/flat";
export default tseslint.config(
{ ignores: ["dist/", "node_modules/", "build/"] },
js.configs.recommended,
...tseslint.configs.recommended,
pluginReact.configs.flat.recommended,
eslintConfigPrettier,
{
files: ["**/*.{js,jsx,ts,tsx}"],
languageOptions: {
ecmaVersion: "latest",
sourceType: "module",
globals: globals.browser,
},
plugins: {
"react-hooks": pluginReactHooks,
},
rules: {
"react/react-in-jsx-scope": "off",
"react/prop-types": "off",
"react-hooks/rules-of-hooks": "error",
"react-hooks/exhaustive-deps": "warn",
"@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
"@typescript-eslint/no-explicit-any": "warn",
},
settings: {
react: { version: "detect" },
},
}
);
이 설정을 저장소에 적용하면 스타일 관련 리뷰 피드백을 줄이고 실제 로직 검증에 집중할 수 있습니다.
기능을 개발하면서 동시에 구조를 뜯어고치면 작업 맥락이 흐트러집니다. 구글의 엔지니어링 연구에 따르면 PR 단위를 작게 쪼개고 작업 의도를 명시했을 때 코드 리뷰 대기 시간이 48시간에서 4시간으로 줄어듭니다.
하루 작업 시간을 세션으로 나눠 통제합니다.
## 개요
- 작업 내용: 유저 프로필 수정 및 API 연동
- 관련 이슈: #104
## 결함 허용 및 등록된 부채
- [x] 허용된 부채: 프로필 컴포넌트 내 스타일 로직 중복 (3회 미만 중복)
- [x] 허용된 부채: 에러 응답 시 alert 처리 (Toast 컴포넌트 연동 미룸)
- [ ] 필수 리뷰 대상: 런타임 오류 및 비즈니스 데이터 처리 로직
리뷰어가 부차적인 스타일 대신 핵심 로직에만 피드백을 집중하도록 유도해 승인 시간을 단축합니다.
기존 코드를 통째로 다시 작성하면 운영 환경에서 장애가 발생할 위험이 커집니다. 마이클 페더스는 레거시 코드를 수정할 때 전체 구조를 바꾸기보다 현재 입출력 동작을 고정하는 특성화 테스트를 먼저 작성해야 한다고 조언합니다.
런타임 오류가 발생했을 때 화면 전체가 하얗게 멈추는 현상을 막기 위해 에러 경계(ErrorBoundary)를 설정합니다.
// components/ErrorBoundary.tsx
import React, { Component, ErrorInfo, ReactNode } from "react";
import * as Sentry from "@sentry/react";
interface Props {
children: ReactNode;
fallbackUI?: ReactNode;
}
interface State {
hasError: boolean;
}
export class GlobalErrorBoundary extends Component<Props, State> {
public state: State = { hasError: false };
public static getDerivedStateFromError(_: Error): State {
return { hasError: true };
}
public componentDidCatch(error: Error, errorInfo: ErrorInfo) {
Sentry.captureException(error, { extra: { componentStack: errorInfo.componentStack } });
}
public render() {
if (this.state.hasError) {
return (
this.props.fallbackUI || (
<div className="p-4 border border-red-200 rounded-md bg-red-50 text-red-700">
<h3 className="font-bold">UI 로딩 중 오류가 발생했습니다.</h3>
<p className="text-sm">새로고침을 하거나 잠시 후 다시 시도해 주세요.</p>
</div>
)
);
}
return this.props.children;
}
}
git revert HEAD --no-edit
git push origin main
작업 단위를 작게 나누고 실패 시 돌아갈 수 있는 환경을 만들면 코드 수정에 대한 불안감을 통제할 수 있습니다. 완벽한 구조 대신 동작하는 시스템을 제시간에 전달하는 것이 실무 엔지니어링의 기본입니다.