Frontend
프론트엔드
프론트엔드는 사용자가 직접 보고 상호작용하는 웹 애플리케이션의 클라이언트 측 영역입니다. HTML, CSS, JavaScript를 기반으로 React, Vue, Angular 등의 프레임워크로 현대적인 UI를 구축합니다.
프론트엔드
프론트엔드는 사용자가 직접 보고 상호작용하는 웹 애플리케이션의 클라이언트 측 영역입니다. HTML, CSS, JavaScript를 기반으로 React, Vue, Angular 등의 프레임워크로 현대적인 UI를 구축합니다.
프론트엔드(Frontend)는 웹 애플리케이션에서 사용자가 직접 보고 상호작용하는 모든 부분을 의미합니다. 브라우저에서 실행되는 코드로, HTML로 구조를, CSS로 스타일을, JavaScript로 동작을 구현합니다. "클라이언트 사이드(Client-side)"라고도 불리며, 서버에서 처리되는 백엔드와 대비됩니다.
현대 프론트엔드 개발의 핵심은 컴포넌트 기반 아키텍처입니다. React, Vue, Angular, Svelte 같은 프레임워크들은 UI를 재사용 가능한 컴포넌트로 분리하여 복잡한 인터페이스를 관리합니다. 상태 관리(Redux, Zustand, Pinia)와 라우팅, 폼 처리 등 다양한 생태계가 발전해 있습니다.
프론트엔드 개발자는 단순히 디자인을 구현하는 것을 넘어, 성능 최적화, 접근성(a11y), SEO, 반응형 디자인, 크로스 브라우저 호환성까지 고려해야 합니다. Core Web Vitals(LCP, FID, CLS) 같은 성능 지표가 검색 순위에 영향을 미치면서, 기술적 품질의 중요성이 더욱 커졌습니다.
최근 트렌드는 서버 컴포넌트, 하이브리드 렌더링(SSR/SSG/ISR), Edge Computing으로 서버와 클라이언트의 경계가 흐려지고 있습니다. Next.js, Nuxt, SvelteKit 같은 메타 프레임워크가 풀스택에 가까운 개발 경험을 제공하며, 프론트엔드 개발자의 역할이 확장되고 있습니다.
// React 컴포넌트 예제 - 사용자 프로필 카드
import { useState, useEffect } from 'react';
import styles from './ProfileCard.module.css';
interface User {
id: number;
name: string;
email: string;
avatar: string;
}
export function ProfileCard({ userId }: { userId: number }) {
const [user, setUser] = useState<User | null>(null);
const [isLoading, setIsLoading] = useState(true);
useEffect(() => {
async function fetchUser() {
try {
const response = await fetch(`/api/users/${userId}`);
const data = await response.json();
setUser(data);
} finally {
setIsLoading(false);
}
}
fetchUser();
}, [userId]);
if (isLoading) return <div className={styles.skeleton} />;
if (!user) return <div>사용자를 찾을 수 없습니다</div>;
return (
<article className={styles.card}>
<img
src={user.avatar}
alt={`${user.name}의 프로필`}
className={styles.avatar}
loading="lazy"
/>
<h2 className={styles.name}>{user.name}</h2>
<p className={styles.email}>{user.email}</p>
</article>
);
}
/* ProfileCard.module.css */
.card {
display: flex;
flex-direction: column;
align-items: center;
padding: 2rem;
border-radius: 12px;
background: var(--card-bg);
box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);
transition: transform 0.2s ease;
}
.card:hover {
transform: translateY(-4px);
}
.avatar {
width: 80px;
height: 80px;
border-radius: 50%;
object-fit: cover;
margin-bottom: 1rem;
}
.name {
font-size: 1.25rem;
font-weight: 600;
margin-bottom: 0.5rem;
}
.email {
color: var(--text-secondary);
font-size: 0.9rem;
}
/* 반응형 디자인 */
@media (max-width: 768px) {
.card {
padding: 1.5rem;
}
}
/* 다크 모드 지원 */
@media (prefers-color-scheme: dark) {
.card {
--card-bg: #1e293b;
--text-secondary: #94a3b8;
}
}