| name | fe-content-enhance |
| description | Use when translating Code Complete's Java/C++ examples into 2026 React/TypeScript Before-After pairs, or when mapping FE checklist items to specific ESLint / typescript-eslint / react-hooks / jsx-a11y rules. Also use when original code has no FE equivalent (pointers, manual memory management) and a "principle only, no code" fallback is needed. Do not use when content belongs to human_only zone. |
fe-content-enhance
Overview
์์๋ 2004๋
Java/C++ ๊ด์ ์ด๋ค. ๊ฐ์ ์์น์ 2026๋
React/TypeScript ์ค๋ฌด์์ ์ด๋ป๊ฒ ์ฒด๊ฐํ๋์ง ๋ฒ์ญํ๋ ๊ฒ ์ด ์คํฌ์ ๋ชซ์ด๋ค. ๋จ์ ๋ฌธ๋ฒ ์นํ์ด ์๋๋ผ ๊ฐ์ ์์น์ ๋๋ฌ๋ด๋ FE ์ํฐํจํด๊ณผ ์์ ๋ณธ์ ๋ง๋ ๋ค.
์ดํฌ ๊ฐ์ด๋: ์ฝ๋ ์๋ค ํด์ค ์ฐ๋ฌธ์ writing-voice-ff ์คํฌ์ ํด์์ฒดยท"์ฝ๋๋ฅผ ์ฝ๋ ์ฌ๋" ๊ด์ ์ ๋ฐ๋ฅธ๋ค. Before/After ํด์ค ์์(๋ฌธ์ โ์ง๋จโ๊ฐ์ โํจ๊ณผ)๋ ๊ทธ ์คํฌ์ ์ ์๋ผ ์๋ค.
When to Use
- Before/After ์ฝ๋๊ฐ Java/C++๋ก ๋ผ ์์ด FE ๋
์๊ฐ ์ฒด๊ฐ ๋ชปํ ๋
- ์ฒดํฌ๋ฆฌ์คํธ ํญ๋ชฉ์ด "์๋ ๋๋ฌ๋๋ ์ด๋ฆ" ๊ฐ์ ์ถ์ ํ
์คํธ๋ผ ์ค๋ฌด ์ฐ๊ฒฐ ์ฝํ ๋
- ์์ ์์ ์ ํฌ์ธํฐ/ํค๋/๋งคํฌ๋ก ๊ฐ์ FE ๋ฑ๊ฐ ์๋ ์์๋ฅผ ๋ง๋ฌ์ ๋
๋ฒ์ญ 3์์น
- ์์น ๋ณด์กด, ๋ฌธ๋ฒ ๋ฒ์ญ๋ง โ ์์๊ฐ ๋งํ๋ ์์น X๋ฅผ ๊ทธ๋๋ก ์ ์ง. ๋ค๋ฅธ ์์น์ผ๋ก ์นํ ๊ธ์ง
- Before = ์ค์ ํํ ์ค์ โ ํ์์๋น ์ฝ๋ ๊ธ์ง. ์ค๋ฌด์์ ์์ฃผ ๋ณด์ด๋ ์ํฐํจํด
- After = ์ต์ ์์ โ ์ ๋ฉด ์ฌ์์ฑ ์๋, ์์น ์ ์ฉ ์ง์ ๋ง ๊ณ ์นจ
FE ์ํฐํจํด ์นดํ๋ก๊ทธ (๋ฒ์ญ ์ฐธ์กฐ)
| ์์ ์์น | FE Before ํ๋ณด | FE After ํ๋ณด |
|---|
| ์๋ ๋๋ฌ๋ด๋ ๋ณ์๋ช
| items.map((_, i) => ...) | items.map((item, index) => ...) |
| ํจ์ ํ๋์ ์ฑ
์ | useUserAndProducts() ํ
| useUser() + useProducts() ๋ถ๋ฆฌ |
| ๋ถํ์ํ ์ฃผ์ | // useEffect ์ ๋ฆฌ + ๋น ํจ์ | ์ฃผ์ ์ ๊ฑฐ, ์ฝ๋ ์์ฒด๋ก ์๋ ๋๋ฌ๋ |
| ๋งค์ง ๋๋ฒ ์ ๊ฑฐ | setTimeout(fn, 3000) | const RETRY_DELAY_MS = 3000 |
| ๊น์ ์ค์ฒฉ ํํผ | if { if { if ... } } } | early return, guard clause |
| ๋ฐ์ดํฐ์ ๋ก์ง ๋ถ๋ฆฌ | ์ปดํฌ๋ํธ ์์ fetch + ๋ ๋ | useQuery + presentational ์ปดํฌ๋ํธ |
| ๋ถ๋ณ์ฑ ๋ณด์ฅ | array.push(item) | [...array, item] |
| Boolean ์ด๋ฆ | data | isLoading, hasError |
| useEffect ์์กด์ฑ ์์ ์ฑ | useEffect(() => fn(x), []) | useEffect(() => fn(x), [x]) |
| ํ์
์ขํ๊ธฐ | as any ์บ์คํ
| ํ์
๊ฐ๋ + narrow |
์ ์นดํ๋ก๊ทธ๋ ์์์ ์ด์ง ์ ๋ถ๊ฐ ์๋๋ค. ์์ ์์น์ ๊ฐ์ฅ ๊ฐ๊น์ด FE ํจํด์ ํ๋จํด์ ์ ์ฉ.
After ์ฝ๋ ํ์ง ๊ธฐ์ค
type User = { id: string; name: string };
export function useUsers(): {
users: User[];
isLoading: boolean;
error: Error | null;
} {
const { data, isLoading, error } = useQuery<User[]>({
queryKey: ['users'],
queryFn: fetchUsers,
});
return { users: data ?? [], isLoading, error };
}
์ฒดํฌ ํญ๋ชฉ:
ESLint ๋ฃฐ ๋งคํ
์ฒดํฌ๋ฆฌ์คํธ text โ ๊ณต์ ESLint/TS-ESLint ๋ฃฐ.
์ ๋ขฐํ ์ ์๋ ์์ค
์์ฃผ ์ฐ๋ ๋งคํ
| ์ฒดํฌ๋ฆฌ์คํธ ํ
์คํธ ํจํด | ESLint ๋ฃฐ |
|---|
| "๋ณ์ ์ด๋ฆ ์๋" / "์งง์ ์ด๋ฆ ํผํ๊ธฐ" | id-length |
| "์ฌ์ฉ ์ ํ๋ import" | @typescript-eslint/no-unused-vars |
| "useEffect ์์กด์ฑ" | react-hooks/exhaustive-deps |
| "any ํ์
๊ธ์ง" | @typescript-eslint/no-explicit-any |
| "๋งค์ง ๋๋ฒ" | no-magic-numbers |
| "ํค ์๋ ๋ฆฌ์คํธ" | react/jsx-key |
| "alt ํ
์คํธ" | jsx-a11y/alt-text |
| "if ์ค๊ดํธ" | curly |
| "unused expressions" | @typescript-eslint/no-unused-expressions |
๋งคํ ์์ ๋
๊ฐ์ ๋ก ๋ง๋ค์ง ๋ง ๊ฒ. eslint_rule: null + translation_note: "ESLint ์๋ํ ๋ถ๊ฐ, ์ฝ๋ ๋ฆฌ๋ทฐ ํญ๋ชฉ" ์ถ๊ฐ.
์์ ์์ FE ๋ฑ๊ฐ ์์ (Fallback)
ํฌ์ธํฐ/๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ/๋งคํฌ๋ก ๋ฑ FE์ ์๋ ๊ฐ๋
:
code_examples:
- title: "๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ"
before: null
after: null
language: typescript
translation_note: |
์์์ C++ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์์ ๋ FE ๋ฑ๊ฐ ์์.
์์น ("๋ฆฌ์์ค ์ ๋ฆฌ ์ฑ
์์ ๋ช
ํํ")์ React์์ useEffect cleanup ํจ์์
`AbortController` ํจํด์ผ๋ก ์ด์ด์ง๋ค. ์์ธ๋ Common Mistakes ์น์
์ฐธ์กฐ.
์ด ๊ฒฝ์ฐ mdx-writer๋ ์ด ํญ๋ชฉ์ ์ฝ๋ ๋ธ๋ก ์์ด ์ค๋ช
paragraph๋ก ๋ ๋.
Common Mistakes
| ์ค์ | ์ ๋ฌธ์ | ์์ |
|---|
useState<any> ๋จ์ฉ ์์ | any ๊ธ์ง ์์น์ ๋ฐํจ | ์ ๋๋ก ํ์
์ง์ ํ Before ๋ง๋ค๊ธฐ (ํํ ์ค์ ํจํด์ ๋ฐ๋ก) |
| ESLint ๋ฃฐ ์ด๋ฆ ์ถ์ธก | ์กด์ฌํ์ง ์๋ ๋ฃฐ ๋งํฌ | WebSearch๋ก ์ค์ ๋ฌธ์ ํ์ธ |
| Before์ After๊ฐ ๋ก์ง์ด ๋ค๋ฆ | ๋ฆฌํฉํฐ๋ง์ด์ง ์์น ์ ์ฉ์ด ์๋ | ๋ก์ง์ ๋์ผ, ์์น ์ ์ฉ ์ง์ ๋ง ๋ฐ๋์ด์ผ |
| 15์ค ์ด์ ๊ธด ์์ | ๋
์ ์ฃผ์ ๋ถ์ฐ | ํต์ฌ๋ง ์ถ์ถ, ๋ถํ์ํ boilerplate ์ ๊ฑฐ |
| ์ฃผ์์ผ๋ก ํด์ค ("์ฌ๊ธฐ๊ฐ ํต์ฌ!") | ๊ต๊ณผ์ ํฐ | ์ฃผ์ ์ต์ํ, ๋ณธ๋ฌธ paragraph์ผ๋ก ์ค๋ช
|