#μ•± μ•„μ΄μ½˜ 도ꡬ

ν•˜λ‚˜μ˜ κΈ°λ³Έ μ•„μ΄μ½˜μœΌλ‘œ ν”Œλž«νΌλ³„ μ•± μ•„μ΄μ½˜μ„ μƒμ„±ν•˜λŠ” λ„κ΅¬μž…λ‹ˆλ‹€.

#κ°œμš”

generate-app-icons λ„κ΅¬λŠ” 단일 κΈ°λ³Έ μ•„μ΄μ½˜(icon.png)μœΌλ‘œλΆ€ν„° ν•„μš”ν•œ λͺ¨λ“  μ•„μ΄μ½˜ λ³€ν˜•μ„ μƒμ„±ν•©λ‹ˆλ‹€:

  1. iOS μ•± μ•„μ΄μ½˜ (1024x1024) - λ‘œκ³ κ°€ 890px 원 μ•ˆμ— μœ„μΉ˜
  2. Android μ μ‘ν˜• μ•„μ΄μ½˜ (1024x1024) - λ‘œκ³ κ°€ 475px 원 μ•ˆμ— μœ„μΉ˜
  3. μŠ€ν”Œλž˜μ‹œ ν™”λ©΄ μ•„μ΄μ½˜ (1024x1024) - λ‘œκ³ κ°€ 614px 원 μ•ˆμ— μœ„μΉ˜
  4. Android μ•Œλ¦Ό μ•„μ΄μ½˜ (500x500) - 투λͺ… 배경의 흰색 둜고

#μ›Œν¬ν”Œλ‘œμš°

1. κΈ°λ³Έ μ•„μ΄μ½˜μ„ {app-slug}/icons/icon.png에 배치
2. generate-app-icons μ‹€ν–‰ β†’ λͺ¨λ“  ν”Œλž«νΌλ³„ μ•„μ΄μ½˜ 생성

#디렉토리 ꡬ쑰

public/products/{app-slug}/icons/
β”œβ”€β”€ icon.png                          # κΈ°λ³Έ μ†ŒμŠ€ μ•„μ΄μ½˜
β”œβ”€β”€ ios-light.png                     # iOS μ•± μ•„μ΄μ½˜ (1024x1024)
β”œβ”€β”€ adaptive-icon.png                 # Android μ μ‘ν˜• μ•„μ΄μ½˜ (1024x1024)
β”œβ”€β”€ splash-icon-light.png             # μŠ€ν”Œλž˜μ‹œ ν™”λ©΄ μ•„μ΄μ½˜ (1024x1024)
└── android-notification-icon.png     # μ•Œλ¦Ό μ•„μ΄μ½˜ (500x500, 흰색)

#generate-app-icons

κΈ°λ³Έ μ•„μ΄μ½˜μœΌλ‘œλΆ€ν„° ν”Œλž«νΌλ³„ μ•± μ•„μ΄μ½˜μ„ μƒμ„±ν•©λ‹ˆλ‹€.

#μš”κ΅¬μ‚¬ν•­

  • κΈ°λ³Έ μ•„μ΄μ½˜: public/products/{slug}/icons/icon.png
  • μ•Œλ¦Ό μ•„μ΄μ½˜ 생성 μ‹œ: GEMINI_API_KEY λ˜λŠ” GOOGLE_API_KEY ν™˜κ²½ λ³€μˆ˜ ν•„μš”

#μž…λ ₯ νŒŒλΌλ―Έν„°

νŒŒλΌλ―Έν„°νƒ€μž…ν•„μˆ˜κΈ°λ³Έκ°’μ„€λͺ…
appNamestring예-μ•± 이름, slug, bundleId, packageName
iconTypes("ios-light" | "adaptive-icon" | "splash-icon-light" | "android-notification")[]μ•„λ‹ˆμ˜€λͺ¨λ“  νƒ€μž…μƒμ„±ν•  νŠΉμ • μ•„μ΄μ½˜ νƒ€μž…
backgroundColorstringμ•„λ‹ˆμ˜€"transparent"배경색 (hex λ˜λŠ” "transparent")
logoPositionstringμ•„λ‹ˆμ˜€-Gemini API용 μœ„μΉ˜ 힌트
skipExistingbooleanμ•„λ‹ˆμ˜€false좜λ ₯ 파일이 이미 있으면 κ±΄λ„ˆλ›°κΈ°
dryRunbooleanμ•„λ‹ˆμ˜€falseμ‹€μ œ 생성 없이 미리보기

#μ•„μ΄μ½˜ 사양

#1. iOS 라이트 μ•„μ΄μ½˜ (ios-light.png)

  • 크기: 1024x1024px
  • 세이프 μ‘΄: λ‘œκ³ κ°€ 890px 직경 원(445px λ°˜μ§€λ¦„) μ•ˆμ— μœ„μΉ˜
  • λ°°κ²½: μ„€μ • κ°€λŠ₯ (투λͺ… λ˜λŠ” μ»€μŠ€ν…€ 색상)
  • μ‚¬μš©μ²˜: iOS App Store μ•„μ΄μ½˜

#2. Android μ μ‘ν˜• μ•„μ΄μ½˜ (adaptive-icon.png)

  • 크기: 1024x1024px
  • 세이프 μ‘΄: λ‘œκ³ κ°€ 475px 직경 원(237.5px λ°˜μ§€λ¦„) μ•ˆμ— μœ„μΉ˜
  • λ°°κ²½: μ„€μ • κ°€λŠ₯ (투λͺ… λ˜λŠ” μ»€μŠ€ν…€ 색상)
  • μ‚¬μš©μ²˜: Android 런처 μ•„μ΄μ½˜(μ μ‘ν˜•)

#3. μŠ€ν”Œλž˜μ‹œ μ•„μ΄μ½˜ 라이트 (splash-icon-light.png)

  • 크기: 1024x1024px
  • 세이프 μ‘΄: λ‘œκ³ κ°€ 614px 직경 원(307px λ°˜μ§€λ¦„) μ•ˆμ— μœ„μΉ˜
  • λ°°κ²½: μ„€μ • κ°€λŠ₯ (투λͺ… λ˜λŠ” μ»€μŠ€ν…€ 색상)
  • μ‚¬μš©μ²˜: μ•± μŠ€ν”Œλž˜μ‹œ ν™”λ©΄ μ•„μ΄μ½˜

#4. Android μ•Œλ¦Ό μ•„μ΄μ½˜ (android-notification-icon.png)

  • 크기: 500x500px
  • μŠ€νƒ€μΌ: 투λͺ… 배경의 흰색 둜고
  • λ°°κ²½: 항상 투λͺ…
  • μ‚¬μš©μ²˜: Android μƒνƒœλ°” μ•Œλ¦Ό μ•„μ΄μ½˜
  • μ°Έκ³ : Gemini APIλ₯Ό μ‚¬μš©ν•˜μ—¬ μ§€λŠ₯적으둜 흰색 λ§ˆμŠ€ν‚Ή 처리

#μ‚¬μš© 예제

#투λͺ… 배경으둜 λͺ¨λ“  μ•„μ΄μ½˜ 생성

{
  "appName": "my-app"
}

#흰색 배경으둜 νŠΉμ • μ•„μ΄μ½˜λ§Œ 생성

{
  "appName": "my-app",
  "iconTypes": ["ios-light", "adaptive-icon"],
  "backgroundColor": "#FFFFFF"
}

#μ•Œλ¦Ό μ•„μ΄μ½˜μ˜ μ»€μŠ€ν…€ 둜고 μœ„μΉ˜ μ§€μ •

{
  "appName": "my-app",
  "iconTypes": ["android-notification-icon"],
  "logoPosition": "쀑앙에 μœ„μΉ˜ν•˜λ˜ 상단을 μ•½κ°„ κ°•μ‘°"
}

#세이프 μ‘΄ κ°€μ΄λ“œλΌμΈ

세이프 쑴은 λ‹€μ–‘ν•œ ν”Œλž«νΌ μ•„μ΄μ½˜ μ²˜λ¦¬μ—μ„œ λ‘œκ³ κ°€ 보이도둝 보μž₯ν•©λ‹ˆλ‹€:

μ•„μ΄μ½˜ νƒ€μž…μ„Έμ΄ν”„ μ‘΄ 직경이유
iOS 라이트890px (87%)iOSλŠ” λͺ¨μ„œλ¦¬λ₯Ό λ‘₯κΈ€κ²Œ ν•˜κ³  마슀크 적용
μ μ‘ν˜• μ•„μ΄μ½˜475px (46%)AndroidλŠ” λ‹€μ–‘ν•œ λͺ¨μ–‘μœΌλ‘œ 클리핑
μŠ€ν”Œλž˜μ‹œ μ•„μ΄μ½˜614px (60%)μŠ€ν”Œλž˜μ‹œ 화면에 κ· ν˜•μž‘νžŒ κ°€μ‹œμ„±

ꢌμž₯사항: κΈ°λ³Έ icon.pngλ₯Ό λ””μžμΈν•  λ•Œ μ€‘μš”ν•œ 둜고 μš”μ†Œκ°€ κ°€μž₯ μž‘μ€ 세이프 μ‘΄(μ μ‘ν˜• μ•„μ΄μ½˜μ˜ 475px) μ•ˆμ— 듀어가도둝 ν•©λ‹ˆλ‹€.

#배경색

#투λͺ… λ°°κ²½ μ‚¬μš© (κΈ°λ³Έκ°’)

{
  "appName": "my-app",
  "backgroundColor": "transparent"
}

#μ»€μŠ€ν…€ 색상 μ‚¬μš©

{
  "appName": "my-app",
  "backgroundColor": "#000000"
}

μ°Έκ³ : android-notification-icon은 이 μ„€μ •κ³Ό 관계없이 항상 투λͺ… 배경을 μ‚¬μš©ν•©λ‹ˆλ‹€.

#AI 기반 흰색 λ§ˆμŠ€ν‚Ή

μ•Œλ¦Ό μ•„μ΄μ½˜ 생성은 Gemini APIλ₯Ό μ‚¬μš©ν•˜μ—¬ 둜고의 λͺ¨μ–‘κ³Ό λ””ν…ŒμΌμ„ μœ μ§€ν•˜λ©΄μ„œ μ§€λŠ₯적으둜 ν°μƒ‰μœΌλ‘œ λ³€ν™˜ν•©λ‹ˆλ‹€:

  • μ •ν™•ν•œ 둜고 λͺ¨μ–‘κ³Ό 윀곽 μœ μ§€
  • λͺ¨λ“  둜고 픽셀을 순수 흰색(#FFFFFF)으둜 λ³€ν™˜
  • 배경을 μ™„μ „νžˆ 투λͺ…ν•˜κ²Œ λ§Œλ“¦
  • 둜고 μœ„μΉ˜ 힌트 반영

#둜고 μœ„μΉ˜ 힌트

AIλ₯Ό κ°€μ΄λ“œν•  μžμ—°μ–΄ 힌트 제곡:

  • "쀑앙" - 둜고λ₯Ό μ™„λ²½ν•˜κ²Œ 쀑앙에 배치
  • "쀑앙보닀 μ•½κ°„ μœ„" - 둜고λ₯Ό 더 λ†’κ²Œ 배치
  • "λΈŒλžœλ“œ ν…μŠ€νŠΈ κ°•μ‘°" - ν…μŠ€νŠΈ μš”μ†Œμ— 초점

#팁 및 λͺ¨λ²” 사둀

#κΈ°λ³Έ μ•„μ΄μ½˜ λ””μžμΈ

  1. λ‹¨μˆœμ„±: μž‘μ€ ν¬κΈ°μ—μ„œ 인식 κ°€λŠ₯ν•œ λ‹¨μˆœν•œ λ””μžμΈ
  2. λŒ€λΉ„: λ‘œκ³ μ™€ λ°°κ²½ κ°„ 쒋은 λŒ€λΉ„ 확보
  3. 세이프 μ‘΄: μ€‘μš”ν•œ μš”μ†Œλ₯Ό 475px 원 μ•ˆμ— 배치
  4. 고해상도: 벑터 κ·Έλž˜ν”½ λ˜λŠ” 고해상도 PNG(2048x2048+) μ‚¬μš©

#색상 선택

  • 투λͺ…: λšœλ ·ν•œ ν˜•νƒœμ˜ λ‘œκ³ μ— κ°€μž₯ 적합
  • λΈŒλžœλ“œ 색상: μ•±μ˜ λΈŒλžœλ“œ 아이덴티티와 일치
  • 흰색/검은색: ν΄λž˜μ‹ν•˜λ©° λŒ€λΆ€λΆ„μ˜ λ””μžμΈκ³Ό 잘 μ–΄μšΈλ¦Ό

#파일 ꡬ쑰

icons/
β”œβ”€β”€ icon.png              # μ†ŒμŠ€ (κ³ ν’ˆμ§ˆ)
β”œβ”€β”€ ios-light.png         # 생성됨
β”œβ”€β”€ adaptive-icon.png     # 생성됨
β”œβ”€β”€ splash-icon-light.png # 생성됨
└── android-notification-icon.png # 생성됨

icon.pngλŠ” 버전 관리에 ν¬ν•¨ν•˜λ˜, 자주 μž¬μƒμ„±ν•˜λŠ” 경우 μƒμ„±λœ νŒŒμΌμ€ .gitignoreλ₯Ό κ³ λ €ν•˜μ„Έμš”.

#일반적인 문제

#문제: μ μ‘ν˜• μ•„μ΄μ½˜μ—μ„œ λ‘œκ³ κ°€ λ„ˆλ¬΄ μž‘κ²Œ λ³΄μž„

ν•΄κ²°: μ μ‘ν˜• μ•„μ΄μ½˜μ€ κ°€μž₯ μž‘μ€ 세이프 μ‘΄(475px)을 κ°€μ§‘λ‹ˆλ‹€. λ‘œκ³ κ°€ 이 ν¬κΈ°μ—μ„œ 읽을 수 μžˆλŠ”μ§€ ν™•μΈν•˜μ„Έμš”.

#문제: μ•Œλ¦Ό μ•„μ΄μ½˜μ— μ›μΉ˜ μ•ŠλŠ” μš”μ†Œκ°€ 포함됨

ν•΄κ²°: logoPosition νŒŒλΌλ―Έν„°λ₯Ό μ‚¬μš©ν•˜μ—¬ AIλ₯Ό κ°€μ΄λ“œν•˜κ±°λ‚˜, 생성 전에 icon.pngλ₯Ό νŽΈμ§‘ν•˜μ—¬ λ””μžμΈμ„ λ‹¨μˆœν™”ν•˜μ„Έμš”.

#문제: 배경색이 μ μš©λ˜μ§€ μ•ŠμŒ

ν•΄κ²°: backgroundColorκ°€ μœ νš¨ν•œ hex 색상(예: "#FFFFFF") λ˜λŠ” "transparent"인지 ν™•μΈν•˜μ„Έμš”. μ•Œλ¦Ό μ•„μ΄μ½˜μ€ 항상 투λͺ… 배경을 μ‚¬μš©ν•©λ‹ˆλ‹€.