알파카랩스의 코드 품질과 일반 외주 개발의 차이를 직접 확인하세요
효율적인 데이터 관리가 성능을 좌우합니다
// useEffect에서 직접 fetch
function ProductList() {
const [data, setData] = useState([])
const [loading, setLoading] = useState(true)
const [error, setError] = useState(null)
useEffect(() => {
fetch('/api/products')
.then(res => res.json())
.then(data => {
setData(data)
setLoading(false)
})
.catch(err => setError(err))
}, [])
if (loading) return <div>로딩중...</div>
if (error) return <div>에러 발생</div>
return <div>{data.map(...)}</div>
}// useQuery 패턴 활용
function ProductList() {
const { data, error, isLoading } = useQuery({
queryKey: ['products'],
queryFn: fetchProducts,
staleTime: 1000 * 60 * 5, // 5분
retry: 3
})
if (isLoading) return <Skeleton />
if (error) return <ErrorFallback />
return <List items={data} />
}확장 가능한 구조로 복잡도를 낮춥니다
// Props Drilling 문제
function App() {
const [user, setUser] = useState(null)
const [theme, setTheme] = useState('light')
return (
<Header
user={user}
setUser={setUser}
theme={theme}
setTheme={setTheme}
/>
)
}
function Header({ user, setUser, theme, setTheme }) {
return <Nav user={user} theme={theme} ... />
}
function Nav({ user, theme, ... }) {
// 계속해서 props 전달...
}// React Context로 깔끔한 상태 관리
// contexts/user-context.tsx
const UserContext = createContext()
export function UserProvider({ children }) {
const [user, setUser] = useState(null)
return (
<UserContext.Provider value={{ user, setUser }}>
{children}
</UserContext.Provider>
)
}
// 어떤 컴포넌트에서든 사용
function UserMenu() {
const { user } = useContext(UserContext)
return <div>{user?.name}</div>
}일관된 디자인으로 브랜드 가치를 높입니다
// 인라인 스타일과 중복 코드
function Button({ children, variant }) {
const style = {
padding: '12px 24px',
borderRadius: '8px',
backgroundColor: variant === 'primary'
? '#3b82f6' : '#ffffff',
color: variant === 'primary'
? '#ffffff' : '#000000',
border: '1px solid #e5e7eb'
}
return (
<button style={style}>
{children}
</button>
)
}// shadcn/ui + Tailwind 디자인 시스템
import { Button } from '@/components/ui/button'
// 사용법
<Button>기본 버튼</Button>
<Button variant="outline">아웃라인</Button>
<Button size="sm">작은 버튼</Button>
// 디자인 토큰으로 일관된 스타일
// globals.css
:root {
--primary: 210 100% 50%;
--radius: 0.5rem;
}
// 자동으로 다크모드 지원
.dark { --primary: 210 100% 60%; }빠른 로딩으로 사용자 경험을 개선합니다
// 일반 img 태그 사용
function ProductImage({ src, alt }) {
return (
<img
src={src || "/placeholder.svg"}
alt={alt}
style={{ width: '100%', height: 'auto' }}
/>
)
}
// 원본 이미지 그대로 로드
// 예: 5MB 고해상도 이미지// Next.js Image 최적화
import Image from 'next/image'
function ProductImage({ src, alt }) {
return (
<Image
src={src || "/placeholder.svg"}
alt={alt}
width={800}
height={600}
sizes="(max-width: 768px) 100vw, 800px"
placeholder="blur"
priority
/>
)
}
// 자동으로 WebP 변환, 최적화된 크기 전송