React Native용 축구 포메이션 컴포넌트 구축 ⚽

발행: (2026년 1월 2일 오전 06:32 GMT+9)
13 min read
원문: Dev.to

I’m happy to translate the article for you, but I need the full text of the post (the content you’d like translated). Could you please paste the article’s body here? I’ll keep the source line exactly as you provided and translate the rest into Korean while preserving all formatting, markdown, and technical terms.

⚽️ 전술에서 코드까지

축구 애호가이자 React Native 개발자로서, 나는 아름다운 경기의 전술적인 면에 항상 매료되어 왔습니다. 구아르디올라의 4‑3‑3이 클롭의 포메이션과 어떻게 다른지 분석하든, 3‑5‑2가 4‑2‑3‑1을 어떻게 상쇄할 수 있는지 이해하든, 포메이션은 이야기를 들려줍니다.

팀 라인업을 모바일 앱에 표시해야 할 때, 나는 큰 장벽에 부딪혔습니다—플레이어 통계, 커스텀 스타일링, 그리고 적절한 TypeScript 지원을 갖춘 축구 포메이션을 우아하게 렌더링할 수 있는 준비된 React Native 컴포넌트가 없었습니다.

그래서 직접 만들었습니다. 오늘은 react-native-football-formation을 만드는 과정을 공유합니다. 이 패키지는 이제 npm에 공개되어 React Native 커뮤니티 전체가 사용할 수 있습니다.

🎯 문제점: 전술적 복잡성 시각화

축구 앱을 만들어 본 적이 있다면 그 어려움을 잘 알 것입니다. 팀 포메이션은 단순한 정적 이미지가 아니라, 다음과 같은 요구를 충족해야 하는 동적인 시각화입니다:

  • 전술 포메이션(4‑3‑3, 4‑2‑3‑1, 5‑3‑2 등)에 따라 11명의 선수를 정확히 배치
  • 플레이어 통계(골, 어시스트, 카드, 교체) 표시
  • 다양한 포메이션 지원(수십 가지 전술 설정 존재)
  • 커스터마이징 지원(팀 색상, 폰트, 아이콘)
  • 다양한 화면 크기와 방향에서 동작
  • 개발자 경험을 위한 뛰어난 TypeScript 지원

기존 솔루션은 너무 경직돼 있거나 관리가 부실했으며, React Native용은 거의 없었습니다. 대부분의 개발자는 정적 이미지를 삽입하거나 프로젝트마다 일회성 커스텀 솔루션을 만들고 있었습니다. 나는 더 나은 것을 원했습니다—유연하고, 프로덕션에 바로 사용할 수 있으며, 어떤 개발자라도 자신의 앱에 바로 끼워 넣을 수 있는 컴포넌트를.

demo

💡 솔루션: 고도로 맞춤화 가능한 포메이션 컴포넌트

몇 주간의 개발, 테스트 및 반복 작업 끝에, 제가 만든 것은 다음과 같습니다:

import { FormationField } from 'react-native-football-formation';

function MatchLineup() {
  const lineup = {
    players: [
      {
        playerId: '1',
        matchName: 'De Gea',
        shirtNumber: 1,
        rating: '7.5',
        position: 'Goalkeeper',
        formationPlace: '1',
        stats: [
          { type: 'goals', value: 1 },
          { type: 'yellowCard', value: '1' },
        ],
      },
      // ... 10 more players
    ],
    formationUsed: '433',
  };

  return (
    <FormationField
      lineup={lineup}
      playerImageUri={(playerId) => `https://api.example.com/players/${playerId}.png`}
      onPlayerPress={(player) => {
        // Navigate to player details
        console.log('Tapped:', player.matchName);
      }}
    />
  );
}

Simple API. Powerful features. 제가 목표로 했던 바로 그 점입니다.

🚀 돋보이는 주요 기능

1️⃣ 24가지 전술 포메이션 지원

클래식한 4‑4‑2부터 3‑2‑4‑1, 혹은 false 9 (4‑2‑4‑0)와 같은 현대적인 변형까지, 이 컴포넌트는 모두 처리합니다. 각 포메이션은 선수들을 필드에 현실감 있게 배치하기 위해 정밀하게 계산된 좌표 매핑을 가지고 있습니다.

퍼센트 기반 좌표 시스템 덕분에 포메이션이 다양한 디바이스 크기에서도 완벽하게 스케일됩니다:

const playerX = (player.x / 100) * fieldWidth - cardWidth / 2;
const playerY = (player.y / 100) * fieldHeight - cardHeight / 2;

2️⃣ 포괄적인 선수 통계

컴포넌트는 직관적인 시각 지표와 함께 선수 통계를 자동으로 렌더링합니다:

  • ⚽ 득점 (다중 득점 시 카운트 포함)
  • 👟 어시스트 제공
  • 🟨 옐로 카드
  • 🟥 레드 카드
  • 🔄 교체
  • ⚽🔴 자책골

모든 아이콘은 커스터마이징이 가능하며, 통계는 null 값과 0 카운트를 우아하게 처리합니다.

3️⃣ 완전한 테마 커스터마이징

시각적인 모든 요소는 포괄적인 테마 시스템을 통해 커스터마이징할 수 있습니다.

4️⃣ RTL 언어 지원 🌍

React Native의 I18nManager를 활용한 완전한 RTL(오른쪽‑왼쪽) 지원을 제공합니다. 컴포넌트는 아랍어, 히브리어 및 기타 RTL 언어에 맞춰 아이콘 위치와 텍스트 방향을 자동으로 조정합니다.

5️⃣ 커스텀 렌더링 훅

고급 사용 사례를 위해 개발자는 기본 선수 카드나 푸터를 오버라이드할 수 있습니다:

<FormationField
  {...props}
  renderPlayerCard={(player) => (
    // custom player card JSX
  )}
  renderFooter={(formation) => (
    // custom footer JSX
  )}
/>

🔧 기술적 결정 및 과제

TypeScript 우선

I wrote the entire package in TypeScript. This was non‑negotiable. The type safety not only caught countless bugs during development but also provides an excellent developer experience with full IntelliSense support.

interface Player {
  rating: string;
  playerId: string;
  position: string;
  matchName: string;
  shirtNumber: number;
  formationPlace?: string;
  stats: (PlayerStats | null)[];
}
interface PlayerStats {
  type: 'goals' | 'yellowCard' | 'redCard' | 'goalAssist' | 'totalSubOff' | 'ownGoals';
  value: string | number;
}

좌표 계산 수학 📐

24개의 서로 다른 포메이션에 대한 정확한 선수 위치를 계산하는 것은 수학적으로 많은 작업이 필요했습니다. 각 포메이션은 현실적인 전술 포지셔닝을 기반으로 수동 좌표 매핑이 필요했습니다:

export const FORMATION_COORDINATES_BY_PLACE = {
  '4-3-3': {
    '1': { x: 50, y: 90 }, // Goalkeeper
    '2': { x: 20, y: 70 }, // Right Back
    '3': { x: 40, y: 75 }, // Center Back
    // ... positions 4‑11
  },
  '4-2-3-1': {
    // Different coordinate mapping
  },
  // ... 22 more formations
};

이러한 위치를 정확히 맞추기 위해 경기 영상을 여러 시간 동안 시청하고 전술 다이어그램을 분석했습니다.

성능 최적화 ⚡

11개의 플레이어 카드마다 여러 조건부 렌더링(스탯 아이콘, 카드 등)이 포함되어 있어 성능이 중요했습니다. 저는 다음을 구현했습니다:

  • **React.memo**를 PlayerCard 컴포넌트에 적용하여 불필요한 재렌더링을 방지했습니다.
  • Conditional rendering을 사용해 스탯 아이콘이 존재할 때만 표시했습니다.
  • Optimized image loading을 적절한 리사이즈 모드와 함께 최적화했습니다.
  • Efficient coordinate calculations를 컴포넌트 수준에서 캐시했습니다.

💼 실제 사용 사례

패키지는 다양한 응용 프로그램에 활용될 만큼 다재다능합니다:

  • 판타지 풋볼 앱 – 실시간 선수 통계와 함께 사용자 라인업을 표시합니다.
  • 스포츠 뉴스 앱 – 경기 미리보기에서 팀 포메이션을 시각화합니다.
  • 전술 분석 도구 – 코치가 포메이션을 만들고 공유할 수 있게 합니다.
  • 경기 통계 앱 – 시작 11인과 성과 지표를 보여줍니다.
  • 풋볼 게임 – 팀 선택 화면을 표시합니다.

🎮 직접 해보세요

패키지는 이제 npm에서 사용할 수 있습니다:

npm install react-native-football-formation

또는 Yarn을 선호한다면:

yarn add react-native-football-formation

React Native 축구 포메이션

플레이어 포지션, 통계 및 경기 정보를 포함한 축구/사커 팀 포메이션을 표시하기 위한 고도로 커스터마이즈 가능한 React Native 컴포넌트입니다.

React Native
TypeScript
License

Status

Note: 이 패키지는 현재 활발히 개발 중이며 테스트 및 평가 목적으로만 제공됩니다. API는 변경될 수 있으며 안정성이 보장되지 않습니다. 현재는 프로덕션 환경에서 사용을 권장하지 않습니다.

데모

축구 포메이션 데모

Features

지원되는 24가지 포메이션 – 4‑3‑3, 4‑2‑3‑1, 3‑5‑2 등 주요 전술 포메이션 모두
플레이어 통계 – 골, 어시스트, 카드, 교체, 자체골
높은 커스터마이징 가능 – 색상, 폰트, 간격을 위한 테마 시스템
RTL 지원 – 오른쪽에서 왼쪽으로 쓰는 언어에 대한 내장 지원
TypeScript – 완전한 타입 안전성 및 IntelliSense 제공
Expo & Bare RN – Expo와 베어 React Native 프로젝트 모두와 호환
Asset Override – 직접 만든 필드 배경 및 아이콘 사용
Component Override – 플레이어 카드의 맞춤 렌더링…

최종 생각

  • 명확한 문제 정의 – 어떤 구체적인 문제를 해결하고 있나요?
  • 간단한 API 설계 – 쉬운 일은 쉽게, 어려운 일은 가능하게 만들세요.
  • 포괄적인 문서화 – 코드는 제품의 절반에 불과합니다.
  • 커뮤니티 참여 – 듣고, 반복하고, 개선하세요.
  • 프로덕션 품질 – TypeScript, 오류 처리, 엣지 케이스 커버리지.

축구 앱이든 다른 특수 컴포넌트이든, 이 여정이 여러분이 오픈소스 생태계에 기여하도록 영감을 주길 바랍니다. React Native 커뮤니티는 개발자들이 실제 문제를 해결하고 솔루션을 공유함으로써 번창합니다.

👋 연결해요!

유용하셨다면 GitHub에서 저장소에 ⭐를 주세요! 여러분의 의견을 듣고 싶어요:

  • 어떤 기능을 보고 싶으신가요?
  • 축구/스포츠 앱을 만들고 계신가요?
  • React Native 컴포넌트를 사용하면서 어떤 어려움을 겪으셨나요?

아래에 댓글을 남겨 주세요, 함께 이야기해요! 💬

⚽ 즐거운 코딩 되세요, 그리고 여러분의 포메이션이 언제나 전술적으로 완벽하길 바랍니다!

About Me: 저는 React Native 개발자로, 개발자 도구와 스포츠 애플리케이션을 만드는 데 열정을 가지고 있습니다. 제 GitHub는 GitHub에서 찾아보세요.

Back to Blog

관련 글

더 보기 »