Skip to content

๐Ÿชท 35๊ธฐ ์ ˆ๋กœ๊ฐ€ ์›นํŒŒํŠธ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ๐Ÿชท

Notifications You must be signed in to change notification settings

SOPT-all/35-APPJAM-WEB-JEOLLOGA

Repository files navigation

๐Ÿชท์ ˆ๋กœ๊ฐ€๐Ÿชท (Jeolloga)

โ€œ๋‚ด ๋งˆ์Œ์— ๋”ฑ ๋งž๋Š” ํ…œํ”Œ์Šคํ…Œ์ด๋ฅผ ์ฐพ์•„์ฃผ๋Š” ํž๋ง ์ถ”์ฒœ ์„œ๋น„์Šคโ€

์ ˆ (์‚ฌ์ฐฐ)๋กœ ๋– ๋‚˜๊ณ  ์‹ถ๋‹ค๋Š” ๋งˆ์Œ์ด ์ ˆ๋กœ ๋“ค๊ฒŒ ๋งŒ๋“œ๋Š” ์„œ๋น„์Šค, ์ ˆ๋กœ๊ฐ€์ž…๋‹ˆ๋‹ค.


๐Ÿ“Œ ํ”„๋กœ์ ํŠธ ์†Œ๊ฐœ

ํ…œํ”Œ์Šคํ…Œ์ด๋ฅผ (์ฒ˜์Œ) ๊ฐ€๋ณด๋ ค ํ•˜๋ฉดโ€ฆ

  • ์œ„์น˜๊ฐ€ ์–ด๋””์ธ์ง€
  • ์–ด๋–ค ํ”„๋กœ๊ทธ๋žจ๋“ค์ด ์žˆ๋Š”์ง€
  • ํ›„๊ธฐ๋Š” ์–ด๋– ํ•œ์ง€
  • ์˜ˆ์•ฝ์€ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ•˜๋Š”์ง€

๋“ฑ๋“ฑ ํ•„์š”ํ•œ ์ •๋ณด๊ฐ€ ํ•œ๋ฐ ๋ชจ์—ฌ ์žˆ์ง€ ์•Š์•„, ์—ฌ๊ธฐ์ €๊ธฐ ํ”Œ๋žซํผ์„ ์˜ฎ๊ฒจ๋‹ค๋‹ˆ๋ฉฐ ์ˆ˜๋งŽ์€ ๊ณผ์ •์„ ๊ฑฐ์ณ์•ผ๋งŒ ํ–ˆ์Šต๋‹ˆ๋‹ค.


์ ˆ๋กœ๊ฐ€๋Š” ๋‚˜๋งŒ์˜ ํ…œํ”Œ์Šคํ…Œ์ด๋ฅผ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์ถ”์ฒœ ์„œ๋น„์Šค๋กœ

  • ์›ํ•˜๋Š” ์กฐ๊ฑด์— ๋งž๊ฒŒ ์‚ฌ์ฐฐยทํ”„๋กœ๊ทธ๋žจ์„ ํƒ์ƒ‰ํ•˜๊ณ 
  • ํ•œ๋ˆˆ์— ํ›„๊ธฐ์™€ ์ฐธ์—ฌ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๋ฉฐ
  • ์ง€๋„ ๊ธฐ๋ฐ˜์œผ๋กœ ์œ„์น˜ ์ •๋ณด๋ฅผ ์–ป์–ด

ํ•œ ๋ฒˆ์˜ ์ ‘์†๋งŒ์œผ๋กœ๋„ ๋‚˜์—๊ฒŒ ๋”ฑ ๋งž๋Š” ํ…œํ”Œ์Šคํ…Œ์ด๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!


๐Ÿ‘ถ OUR TEAM

ํ”„๋กœํ•„์‚ฌ์ง„ ํ”„๋กœํ•„์‚ฌ์ง„ ํ”„๋กœํ•„์‚ฌ์ง„ ํ”„๋กœํ•„์‚ฌ์ง„
์„ฑํฌ
ํƒœ์šฑ
์˜๊ฒฝ
๊ฐ€ํ˜„
@seong-hui @Taew00k @bykbyk0401 @maylh

๐Ÿ›  ๊ธฐ์ˆ  ์Šคํƒ ๋ฐ ์„ ์ • ์ด์œ  (Tech Stack)

์—ญํ•  ๊ธฐ์ˆ  ์„ ์ • ์ด์œ 
Library React ์ปดํฌ๋„ŒํŠธ ๊ธฐ๋ฐ˜ ์•„ํ‚คํ…์ฒ˜๋กœ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋›ฐ์–ด๋‚จ.
ํ’๋ถ€ํ•œ ์ƒํƒœ๊ณ„๋กœ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ์‰ฝ๊ฒŒ ํ†ตํ•ฉ ๊ฐ€๋Šฅ.
๋™์  UI ๊ฐœ๋ฐœ์— ์ ํ•ฉํ•˜๊ณ , ๊ฐ€์ƒ DOM์„ ํ™œ์šฉํ•ด ๋น ๋ฅธ ๋ Œ๋”๋ง ์„ฑ๋Šฅ ์ œ๊ณต.
Programming Language TypeScript ์•ˆ์ •์ ์ธ ์ฝ”๋“œ ์ž‘์„ฑ๊ณผ ํ˜‘์—… ์‹œ ํƒ€์ž… ๋ณด์žฅ์ด ๊ฐ€๋Šฅ, ์œ ์ง€๋ณด์ˆ˜์„ฑ์ด ๋›ฐ์–ด๋‚จ
Styling Vanilla Extract CSS CSS-in-TypeScript ๋ฐฉ์‹์œผ๋กœ ํƒ€์ž… ์•ˆ์ „์„ฑ์„ ์ œ๊ณตํ•˜๋ฉฐ, ๋Ÿฐํƒ€์ž„ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ๋นŒ๋“œ ์‹œ ์ •์  CSS๋กœ ์ถ”์ถœ.
๋™์  ์Šคํƒ€์ผ๋ง๊ณผ ๋ชจ๋“ˆํ™”๋œ ์Šคํƒ€์ผ ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ดํ•˜๊ณ , ์œ ์ง€๋ณด์ˆ˜์„ฑ๊ณผ ํ˜‘์—… ํšจ์œจ์„ฑ์„ ๋†’์ž„.
Data Fetching Axios TanStack Query Axios: HTTP ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ฉฐ ์ธํ„ฐ์…‰ํ„ฐ ์„ค์ •์œผ๋กœ ์š”์ฒญ/์‘๋‹ต ๊ด€๋ฆฌ๊ฐ€ ์šฉ์ด
TanStack Query: ๋น„๋™๊ธฐ ๋ฐ์ดํ„ฐ ์ƒํƒœ ๊ด€๋ฆฌ์— ํŠนํ™”, ์บ์‹ฑ ยท ์ค‘๋ณต ์š”์ฒญ ์ œ๊ฑฐ ยท ์ž๋™ ๋ฆฌํŽ˜์น˜ ๊ธฐ๋Šฅ์œผ๋กœ ํšจ์œจ์ ์ธ ๋ฐ์ดํ„ฐ ๊ด€๋ฆฌ
UI Development Storybook UI ์ปดํฌ๋„ŒํŠธ ๊ฐœ๋ฐœ ๋ฐ ํ…Œ์ŠคํŠธ ํŽธ์˜์„ฑ ์ œ๊ณต, ๋””์ž์ด๋„ˆ์™€์˜ ์›ํ™œํ•œ ์†Œํ†ต ๊ฐ€๋Šฅ
Formatting ESLint Prettier ์ฝ”๋“œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ•˜๊ณ , ๊ฐ€๋…์„ฑ์„ ๋†’์ด๋ฉฐ, ์Šคํƒ€์ผ ์ปจ๋ฒค์…˜์„ ํ†ตํ•ฉ์ ์œผ๋กœ ๊ด€๋ฆฌ
Package Manager Yarn ๋น ๋ฅด๊ณ  ํšจ์œจ์ ์ธ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ ๋ฐ ์˜์กด์„ฑ ์„ค์น˜
Version Control Git GitHub ์ฝ”๋“œ ๋ฒ„์ „ ๊ด€๋ฆฌ์™€ ํ˜‘์—…์— ํ•„์ˆ˜์ ์ธ ๋„๊ตฌ
Deployment Vercel ์ดˆ๊ธฐ ๋ฐฐํฌ์— ์ ํ•ฉํ•œ ํ”Œ๋žซํผ์œผ๋กœ, ๊ฐ„ํŽธํ•œ ์„ค์ •๊ณผ ๋น ๋ฅธ ๋ฐฐํฌ ๊ฐ€๋Šฅ
์ถ”ํ›„ AWS๋กœ ํ™•์žฅ ๊ฐ€๋Šฅ

1๏ธโƒฃ Commit ์ปจ๋ฒค์…˜

commit ๊ทœ์น™

ํ‚ค์›Œ๋“œ: ๋‚ด์šฉ

  • ์˜ˆ์‹œ:
    • init: ์ดˆ๊ธฐ ์„ธํŒ…
    • feat: ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ

Commit ๋ฉ”์‹œ์ง€ ์ข…๋ฅ˜ ์„ค๋ช…

์ œ๋ชฉ ๋‚ด์šฉ
feat ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•  ๊ฒฝ์šฐ
style ์ฝ”๋“œ formatting, ์„ธ๋ฏธ์ฝœ๋ก  ๋ˆ„๋ฝ, ์ฝ”๋“œ ์ž์ฒด์˜ ๋ณ€๊ฒฝ์ด ์—†๋Š” ๊ฒฝ์šฐ
fix ๋ฒ„๊ทธ๋ฅผ ๊ณ ์นœ ๊ฒฝ์šฐ
refactor ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
docs ๋ฌธ์„œ๋ฅผ ์ˆ˜์ •ํ•œ ๊ฒฝ์šฐ
chore ํŒจํ‚ค์ง€ ๋งค๋‹ˆ์ € ์ˆ˜์ •, ๊ทธ ์™ธ ๊ธฐํƒ€ ์ˆ˜์ • ex) .gitignore
design CSS ๋“ฑ ์‚ฌ์šฉ์ž UI ๋””์ž์ธ ๋ณ€๊ฒฝ
comment ํ•„์š”ํ•œ ์ฃผ์„ ์ถ”๊ฐ€ ๋ฐ ๋ณ€๊ฒฝ
rename ํŒŒ์ผ ๋˜๋Š” ํด๋” ๋ช…์„ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ ์˜ฎ๊ธฐ๋Š” ์ž‘์—…๋งŒ์ธ ๊ฒฝ์šฐ
remove ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๋Š” ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•œ ๊ฒฝ์šฐ
!BREAKING CHANGE ์ปค๋‹ค๋ž€ API ๋ณ€๊ฒฝ์˜ ๊ฒฝ์šฐ
!HOTFIX ๊ธ‰ํ•˜๊ฒŒ ์น˜๋ช…์ ์ธ ๋ฒ„๊ทธ๋ฅผ ๊ณ ์ณ์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ

์ปค๋ฐ‹ ๋ฉ”์‹œ์ง€ ์ž‘์„ฑ ๊ฐ€์ด๋“œ๋ผ์ธ

  • ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ๋นˆ ํ–‰์œผ๋กœ ๋ถ„๋ฆฌ

    • ์ปค๋ฐ‹ ์œ ํ˜• ์ดํ›„ ์ œ๋ชฉ๊ณผ ๋ณธ๋ฌธ์„ ํ•œ๊ธ€๋กœ ์ž‘์„ฑํ•˜์—ฌ ๋‚ด์šฉ์ด ๋ช…ํ™•ํžˆ ์ „๋‹ฌ๋  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
    • ๋ณธ๋ฌธ์—๋Š” ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ๊ณผ ์ด์œ ๋ฅผ ์„ค๋ช…ํ•˜๋ฉฐ, "์–ด๋–ป๊ฒŒ"๋ณด๋‹ค๋Š” "๋ฌด์—‡"๊ณผ "์™œ"๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ์ œ๋ชฉ ํ˜•์‹

    • ์ œ๋ชฉ์˜ ์ฒซ ๊ธ€์ž๋Š” ์†Œ๋ฌธ์ž๋กœ ์‹œ์ž‘ํ•œ๋‹ค.
    • ์ œ๋ชฉ ๋์— ๋งˆ์นจํ‘œ(.)๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • ์ œ๋ชฉ์€ ์˜๋ฌธ ๊ธฐ์ค€ 50์ž ์ด๋‚ด๋กœ ์ž‘์„ฑํ•œ๋‹ค.
  • ๋ณธ๋ฌธ ์ž‘์„ฑ

    • ๋ณ€๊ฒฝํ•œ ๋‚ด์šฉ๊ณผ ์ด์œ ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑํ•œ๋‹ค.
    • "์ž์‹ ์˜ ์ฝ”๋“œ๊ฐ€ ์ง๊ด€์ ์œผ๋กœ ๋ฐ”๋กœ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ๋ง์ž"๋Š” ์›์น™์„ ๋ฐ”ํƒ•์œผ๋กœ ์„ค๋ช…์„ ๋ช…ํ™•ํžˆ ํ•œ๋‹ค.
    • ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ํ•ญ๋ชฉ์ด ์žˆ๋‹ค๋ฉด ๊ธ€๋จธ๋ฆฌ ๊ธฐํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ€๋…์„ฑ์„ ๋†’์ธ๋‹ค.
2๏ธโƒฃ Git, Branch ์ „๋žต

Git, Branch ์ „๋žต

feat/#์ด์Šˆ๋ฒˆํ˜ธ/์ด์Šˆ์ด๋ฆ„

Git Branch

  • GitHub-Flow ์ „๋žต + develop
  • ๋ธŒ๋žœ์น˜ ์šด์˜
    • feat/#์ด์Šˆ๋ฒˆํ˜ธ/์ด์Šˆ์ด๋ฆ„ (์ผ€๋ฐฅ ์ผ€์ด์Šค): ๊ธฐ๋Šฅ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๊ฐ์ž๊ฐ€ ์‚ฌ์šฉํ•œ ๋ธŒ๋žœ์น˜
      • main: ์™„์ „ํžˆ ์•ˆ์ „ํ•˜๋‹ค๊ณ  ํŒ๋‹จ๋˜์—ˆ์„ ๋•Œ, ์ฆ‰ ๋ฐฐํฌ๊ฐ€ ๊ฐ€๋Šฅํ•œ ์ตœ์ข… mergeํ•˜๋Š” ๋ธŒ๋žœ์น˜
      • develop: ๋ฐฐํฌํ•˜๊ธฐ ์ „ ๊ฐœ๋ฐœ ์ค‘์ผ ๋•Œ ๊ฐ์ž์˜ ๋ธŒ๋žœ์น˜์—์„œ mergeํ•˜๋Š” ๋ธŒ๋žœ์น˜ (default ๋ธŒ๋žœ์น˜)
        • feat/#์ด์Šˆ๋ฒˆํ˜ธ/๊ธฐ๋Šฅ๋ช…: feature ๋ธŒ๋žœ์น˜. ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ. ๊ฐœ๋ฐœ์ด ์™„๋ฃŒ๋˜๋ฉด develop ๋ธŒ๋žœ์น˜๋กœ ๋ณ‘ํ•ฉ
        • fix/#์ด์Šˆ๋ฒˆํ˜ธ/๊ธฐ๋Šฅ๋ช…: feature ๋ธŒ๋žœ์น˜ ์ƒ์„ฑ ํ›„ ๋ฒ„๊ทธ๊ฐ€ ์ƒ๊ฒผ์„ ๋•Œ ์ˆ˜์ •ํ•˜๋Š” ๋ธŒ๋žœ์น˜
        • PR ๋จธ์ง€ ํ›„ ํ†ก๋ฐฉ ๋ฉ”์„ธ์ง€ ๋ณด๋‚ด๊ธฐ
        • approve ์ตœ์†Œ 2๋ช… ์ด์ƒ ๋ฐ›์•„์•ผ ๋จธ์ง€ ๊ฐ€๋Šฅ
        • pull ๋ฐ›์•„์˜ฌ ๋•Œ๋Š” merge ๋ณด๋‹ค๋Š” rebase ์‚ฌ์šฉ ๊ถŒ์žฅ
3๏ธโƒฃ ์ฝ”๋“œ ์ปจ๋ฒค์…˜
  1. ์ปดํฌ๋„ŒํŠธ ๋ฐ ํ•จ์ˆ˜ ๋„ค์ด๋ฐ

    • ๋ชจ๋‘ ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋กœ ์„ ์–ธ(rafce)
  2. ๋„ค์ด๋ฐ

    • ๋ณ€์ˆ˜ ํ•จ์ˆ˜๋Š” ์†Œ๋ฌธ์ž ์นด๋ฉœ ์ผ€์ด์Šค๋กœ ์„ ์–ธ
    • ๋ฐฐ์—ด์€ ๋ณต์ˆ˜ํ˜•์œผ๋กœ ์„ ์–ธ
    • ์ƒ์ˆ˜๋Š” ์Šค๋„ค์ดํฌ ์ผ€์ด์Šค๋ฅผ ํ™œ์šฉํ•ด ๋Œ€๋ฌธ์ž์™€ _ ๋ฅผ ์‚ฌ์šฉํ•ด ์„ ์–ธ
    • ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ ํŒŒ์Šค์นผ ์ผ€์ด์Šค๋กœ ์„ ์–ธ
    • interface ์„ ์–ธ: ์ปดํฌ๋„ŒํŠธ๋ช… + props
  3. Function

    • ํ•จ์ˆ˜์˜ ์‹๋ณ„์ž๋ช…์€ ํ•ญ์ƒ ์‹œ๋ฉ˜ํ‹ฑํ•˜๊ฒŒ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. (์–ด๋–ค ๊ธฐ๋Šฅ์„ ํ•˜๋Š” ํ•จ์ˆ˜์ธ์ง€ ํ•จ์ˆ˜๋ช…์„ ๋ณด๊ณ  ์•Œ ์ˆ˜ ์žˆ๋„๋ก ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค.)
    • ์ด๋ฒคํŠธ๋ฅผ ํ•ธ๋“ค๋ง ํ•˜๋Š” ํ•จ์ˆ˜๋Š” handle ์ ‘๋‘์‚ฌ๋ฅผ ์ด์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ๋ฐ˜ํ™˜๊ฐ’์ด boolean ์ธ ํ•จ์ˆ˜๋Š” is ์ ‘๋‘์‚ฌ๋ฅผ ํ™œ์šฉํ•˜๋ฉฐ, ์–ด๋–ค ๊ฐ’์„ ๋ฆฌํ„ดํ•˜๋Š” ํ•จ์ˆ˜๋Š” get ์ ‘๋‘์‚ฌ๋ฅผ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
    • ํ•จ์ˆ˜๋Š” ํ•จ์ˆ˜ ํ‘œํ˜„์‹๋งŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค
  4. React & TypeScript

    • ์ปดํฌ๋„ŒํŠธ๋Š” ํ•ญ์ƒ ํŒŒ์Šค์นผ ์ผ€์ด์Šค๋กœ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: SmallBanner)

    • Inline Style ์„ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

    • ์Šคํƒ€์ผ ๋ณ€์ˆ˜๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ํ•˜๋‹จ์— ์ž‘์„ฑ

    • any ์‚ฌ์šฉ๊ธˆ์ง€


4๏ธโƒฃ Styling ์ปจ๋ฒค์…˜
  • rem ์‚ฌ์šฉ์„ ๊ธฐ๋ณธ์œผ๋กœ ํ•œ๋‹ค.
  • border-radius: px๋กœ ์„ค์ •
  • ๊ธฐ๋ณธ ๊ธ€์ž ํฌ๊ธฐ 10pt ์„ค์ •
  • asset ํ˜•์‹
    • ํ•„์š”ํ•œ ์•„์ด์ฝ˜ ํŒŒ์ผ์€ Figma์—์„œ svg๋กœ export ํ•œ ํ›„ assets/icons (ex. ic_arrow.svg)
    • ํ•„์š”ํ•œ ์ด๋ฏธ์ง€ ํŒŒ์ผ์€ Figma ์—์„œ png๋กœ export ํ•œ ํ›„ assets/imagesํด๋”์— ๋„ฃ๊ธฐ (ex. img_picture.png)


๐Ÿ“ ํด๋” ๊ตฌ์กฐ

|-- ๐Ÿ“ .github
|-- ๐Ÿ“ node_modules
|-- ๐Ÿ“ public
|-- ๐Ÿ“ src
  |-- ๐Ÿ“ apis
  |-- ๐Ÿ“ assets
      |-- ๐Ÿ“ icons (svgํŒŒ์ผ)
      |-- ๐Ÿ“ images (pngํŒŒ์ผ)
  |-- ๐Ÿ“ components
      |-- ๐Ÿ“ common
         |-- ๐Ÿ“ Button
             |-- Button.tsx
             |-- Button.css.ts
  |-- ๐Ÿ“ constants
  |-- ๐Ÿ“ layout
  |-- ๐Ÿ“ pages
  |-- ๐Ÿ“ route
  |-- ๐Ÿ“ styles
  |-- ๐Ÿ“ types
  |-- App.tsx
  |-- main.tsx

About

๐Ÿชท 35๊ธฐ ์ ˆ๋กœ๊ฐ€ ์›นํŒŒํŠธ ๋ ˆํŒŒ์ง€ํ† ๋ฆฌ ๐Ÿชท

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Contributors 4

  •  
  •  
  •  
  •