////////
Search

추상화 역량 모델?

그렇네, 오히려 귀찮고 반복적인 일이 많은 서비스 개발자에게 오히려 더 추상화 역량이 많이 필요할 수도 있겠다. 심지어 플랫폼 개발자에게는 처음부터 추상화 요구가 발생하기 때문에 신경 쓸수밖에 없는 입장이지만 서비스 개발자는 처음부터 굳이 그런 요청을 받지 않으니 덜 신경쓸 가능성도 높고(그만큼 변경이 생겼을 때 신경쓰지 않았다면, 추상화 역량을 키워두지 않았다면 많은 피해를 입을 수 있겠다).
마이크로 추상화 표현도 좋다. 이런 마이크로 추상화를 하려면 어떤 역량 모델이 필요하다고 봐?

마이크로 추상화를 위한 5가지 핵심 역량

1. 패턴 인식 능력 - "반복을 알아채는 눈"

레벨 1: 복붙 인지
// "어? 이거 아까 짠 거랑 똑같네?" <button className="px-4 py-2 bg-blue-500 text-white rounded"> <button className="px-4 py-2 bg-blue-500 text-white rounded">
JavaScript
복사
레벨 2: 변주 인지
// "구조는 같고 값만 다르네?" <button className="px-4 py-2 bg-blue-500..."> <button className="px-4 py-2 bg-red-500..."> <button className="px-4 py-2 bg-green-500...">
JavaScript
복사
레벨 3: 추상 패턴 인지
// "이거랑 저거랑 본질적으로 같은 문제네?" // 검색 필터, 테이블 필터, 상품 옵션 선택 // → 모두 "선택지에서 고르기" 패턴
JavaScript
복사

2. 경계 설정 능력 - "어디서 자를 것인가"

잘못된 경계
// 너무 큰 덩어리 function UserDashboard() { // 500줄... 프로필, 설정, 통계, 알림 다 들어있음 } // 너무 작은 조각 function ButtonText({ children }) { return <span>{children}</span> } function ButtonIcon({ icon }) { return <i>{icon}</i> }
JavaScript
복사
적절한 경계
// 변경 이유가 하나인 단위 function PriceDisplay() { /* 가격 표시 책임만 */ } function UserAvatar() { /* 아바타 표시 책임만 */ }
JavaScript
복사

3. 인터페이스 설계 능력 - "무엇을 드러내고 숨길까"

나쁜 인터페이스: HOW를 노출
<DataList fetchUrl="/api/users" method="GET" headers={{ 'Authorization': token }} parseResponse={res => res.data.items} errorHandler={err => console.log(err)} />
JavaScript
복사
좋은 인터페이스: WHAT만 노출
<UserList users={users} onUserClick={handleClick} />
JavaScript
복사

4. 점진적 일반화 능력 - "조급하지 않게 추상화하기"

Stage 1: 구체적 구현
function ProductCard({ product }) { /* 특정 구현 */ }
JavaScript
복사
Stage 2: 파라미터화
function ProductCard({ product, showPrice = true }) { /* 옵션 추가 */ }
JavaScript
복사
Stage 3: 추상화
function Card({ data, renderer }) { /* 범용화 */ }
JavaScript
복사
Stage 4: 되돌리기 판단
// "너무 추상적이면 다시 구체화" // Card가 너무 복잡해졌다면 ProductCard, UserCard로 분리
JavaScript
복사

5. 합성 사고 능력 - "작은 것들을 조합하기"

모놀리식 사고
function SuperForm() { // 검증도 하고, 제출도 하고, 에러 표시도 하고... }
JavaScript
복사
합성 사고
// 각자 하나씩만 잘하는 것들을 조합 const form = useForm(); const validation = useValidation(schema); const submission = useSubmission(endpoint); return ( <Form {...form}> <ValidationProvider {...validation}> <SubmitHandler {...submission}>
JavaScript
복사

역량 개발 로드맵

Junior (0-2년): 패턴 인식

복붙하는 자신을 인지하기
코드 리뷰에서 "이거 반복되네요" 지적받으면 민감하게 반응
유틸 함수 만들기 시작

Mid (2-5년): 경계와 인터페이스

"이 컴포넌트 너무 크다/작다" 감각 생기기
Props 설계에 고민 시작
Custom Hook 적극 활용

Senior (5년+): 추상화와 합성

팀 차원의 패턴 라이브러리 구축
도메인 특화 추상화 설계
다른 사람이 쓸 수 있는 블록 만들기

실전 연습법

1. "3의 법칙" 적용

1번째: 그냥 만들기 2번째: "어? 또?" 인지 3번째: 추상화
JavaScript
복사

2. 코드 리뷰에서 질문하기

"이거 다른 곳에서도 쓸 것 같은데요?"
"이 로직 분리할 수 있을까요?"
"인터페이스를 이렇게 바꾸면 어떨까요?"

3. 리팩토링 일지 작성

// Before: 200줄 컴포넌트 // After: 50줄 × 4개 컴포넌트 // 배운 점: 검색과 필터는 분리하는게 좋다
JavaScript
복사
서비스 개발자가 플랫폼 개발자보다 추상화를 더 자주 연습할 기회가 있습니다. 매일 비슷한 문제를 다르게 풀어야 하니까요. 문제는 의식적으로 연습하지 않으면 10년 경력도 1년 경력 10번 반복이 된다는 것입니다.

질문법으로 추상화 개념 구체화하기

(도표) 마이크로 추상화를 통한 개발 역량 향상

"반복되는 패턴을 발견하고, 작은 추상화로 감싸고, 점진적으로 개선한다" | ---------------------------------------- | | | [반복되는 패턴?] [작은 추상화?] [점진적으로 개선?] | | | 어떤 반복? 어떻게 감싸? 언제 개선? | | | [어떤 반복?] ──────────────────────────────┐ | | [어디서?] [얼마나 자주?] [왜 반복?] | | | - 버튼 스타일 - 매일 3-4번 - 디자인 시스템 - 폼 유효성 - 프로젝트마다 없어서 - API 호출 - 컴포넌트마다 - 복붙이 빨라서 - 에러 처리 - 방법을 몰라서 [구체적으로?] | <button className="px-4 py-2 bg-blue-500 rounded"> <button className="px-4 py-2 bg-red-500 rounded"> → 색상만 다르고 나머지는 100% 동일 [작은 추상화?] ─────────────────────────────┐ | | [얼마나 작게?] [어떻게 감싸?] [무엇을 숨기고?] | | | 한 가지 책임 함수/컴포넌트로 구현 세부사항 10-30줄 Props로 인터페이스 HOW를 숨기고 Custom Hook으로 WHAT만 노출 [예시?] | // Before: 30줄 반복 if (loading) return <Spinner /> if (error) return <Error /> if (!data) return <Empty /> // After: 1줄 <DataState {...state} /> [점진적으로 개선?] ────────────────────────┐ | | [언제?] [어떻게?] [누가 결정?] | | | 두 번째 만날 때 테스트 추가 코드 리뷰에서 세 번째 만날 때 인터페이스 개선 팀 회의에서 PR 리뷰할 때 문서화 본인 판단으로 [왜 점진적?] | - 처음부터 완벽한 추상화는 불가능 - 사용하면서 문제점 발견 - 요구사항이 계속 변함
Plain Text
복사

더 깊은 질문 전개

"반복되는 패턴을 발견하고"

What? (무엇이 반복?)
// 로딩 상태 처리 - 50개 컴포넌트에서 반복 const [loading, setLoading] = useState(false); const [error, setError] = useState(null);
JavaScript
복사
Where? (어디서 반복?)
모든 데이터 페칭 컴포넌트
모든 폼 컴포넌트
모든 모달 컴포넌트
Why? (왜 못 찾았지?)
"이 정도는 당연한 거 아냐?"라고 생각
복붙이 더 빨라서
추상화 방법을 몰라서
When? (언제 발견?)
버그 수정하다가 10군데 고칠 때
신입이 "이거 왜 계속 반복해요?"라고 물을 때
요구사항 변경으로 20개 파일 수정할 때

"작은 추상화로 감싸고"

How small? (얼마나 작게?)
// ❌ 너무 큰 추상화 <SuperDataHandler /> // 500줄, 모든 걸 다 함 // ✅ 적절한 크기 <LoadingState /> // 10줄, 로딩만 <ErrorBoundary /> // 20줄, 에러만 <EmptyState /> // 15줄, 빈 상태만
JavaScript
복사
How? (어떻게 감싸?)
1.
공통 로직 추출 → 함수
2.
공통 UI → 컴포넌트
3.
공통 상태 로직 → Custom Hook
4.
공통 타입 → TypeScript Interface

"점진적으로 개선하면"

What pace? (어떤 속도로?)
1회차: 하드코딩 (완전 구체적) 2회차: 변수 추출 (약간 유연) 3회차: 함수 추출 (재사용 가능) 4회차: 모듈화 (독립적) 5회차: 라이브러리 (팀 공유)
Plain Text
복사
Who decides? (누가 판단?)
본인: "이거 개선해야겠다"
동료: "이 부분 추상화하면 어때요?"
리더: "이 패턴 표준화합시다"
What if? (실패하면?)
롤백은 쉬움 (작은 단위니까)
교훈을 문서화
다음엔 다른 방법 시도
이렇게 질문을 통해 막연한 "추상화"가 구체적인 행동과 판단 기준으로 변환됩니다.