/Teamble-Web

๐Ÿ’™๐Ÿ’™๋Ÿฌ๋ธ”๋ฆฌํ•œ ์›น ํŒ€๋ธ”๋Ÿฌ๐Ÿ’™๐Ÿ’™

Primary LanguageTypeScript


์„œ๋กœ ๋‹ค๋ฅธ ์ƒ‰์˜ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋‚˜๋Š” ๊ณต๊ฐ„, ํŒ€๋ธ” ๐Ÿ’œ

# ์šฐ๋ฆฌ_ํŒ€๋ธ”ํ•˜์ž!

KakaoTalk_20220107_191904466

Teamble : ์„œ๋กœ ๋‹ค๋ฅธ ์ƒ‰์˜ ์šฐ๋ฆฌ๊ฐ€ ๋งŒ๋‚˜๋Š” ๊ณต๊ฐ„, ํŒ€๋ธ”

ํ˜‘์—…์„ฑํ–ฅํ…Œ์ŠคํŠธ ๊ธฐ๋ฐ˜ IT ์‚ฌ์ด๋“œ ํ”„๋กœ์ ํŠธ ํŒ€ ๋งค์นญ ์„œ๋น„์Šค

22.01.02 ~ 22.01.22 - SOPT 29th APPJAM



Developers

๋ฐ•๊ฑด์˜ ์ •์„ธ์—ฐ ๊น€์—ฐ์ด
Tekiter n0eyes YounYi

Role

์ด๋ฆ„ ์—ญํ• 
๋ฐ•๊ฑด์˜ ์ดˆ๊ธฐ ํ™˜๊ฒฝ ์„ธํŒ…, API ์ถ”์ƒํ™”, ์ˆ˜์ •์ƒํ™ฉ ๋Œ€์‘
์ •์„ธ์—ฐ ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„, ๋ ˆ์ด์•„์›ƒ ๋ฐ API ์—ฐ๊ฒฐ, ์ˆ˜์ •์‚ฌํ•ญ ๋Œ€์‘
๊น€์—ฐ์ด ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„, ๋ ˆ์ด์•„์›ƒ ๋ฐ API ์—ฐ๊ฒฐ, ์ˆ˜์ •์‚ฌํ•ญ ๋Œ€์‘

์Šคํƒ

  • next.js
  • typescript
  • recoil
  • styled-components
  • husky
  • storybook

์„œ๋น„์Šค์˜ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

1. Main View - Landing Page

  • ๋žœ๋”ฉํŽ˜์ด์ง€๋ฅผ ํ†ตํ•ด, ํ˜‘์—… ์„ฑํ–ฅ ํ…Œ์ŠคํŠธ ๋ฒ„ํŠผ์„ ํ†ตํ•ด ํŒ€๋ธ”์—์„œ ์ œ๊ณตํ•˜๋Š” ์ฒซ๋ฒˆ์งธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ์ธ ํ˜‘์—… ์„ฑํ–ฅ ํ…Œ์ŠคํŠธ ํŽ˜์ด์ง€๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค. แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-01-21 แ„‹แ…ฉแ„’แ…ฎ 8 41 14 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-01-21 แ„‹แ…ฉแ„’แ…ฎ 8 41 21 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-01-21 แ„‹แ…ฉแ„’แ…ฎ 8 41 34 แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2022-01-21 แ„‹แ…ฉแ„’แ…ฎ 8 41 56

2. ํ˜‘์—… ์„ฑํ–ฅ ํ…Œ์ŠคํŠธ

  • ํŒ€๋ธ”์—์„œ ์ œ๊ณตํ•˜๋Š” ํ˜‘์—… ์„ฑํ–ฅ ํ…Œ์ŠคํŠธ๋Š” DISC ์„ฑ๊ฒฉ ์œ ํ˜• ๊ฒ€์‚ฌ ๊ธฐ๋ฐ˜์œผ๋กœ ์ œ์ž‘๋˜์—ˆ์œผ๋ฉฐ, 3๋‹จ๊ณ„ ํ•ด๋‹นํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ๊ฑฐ์น˜๊ฒŒ ๋˜๋ฉด 8๊ฐ€์ง€ ์ข…๋ฅ˜์˜ ๊ฒฐ๊ณผ๊ฐ’ ์ค‘, ์œ ์ €์—๊ฒŒ ํ•ด๋‹นํ•˜๋Š” ๊ฒฐ๊ณผ๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

localhost_3000_project (5) localhost_3000_project (6) localhost_3000_project (7)

3. ํ”„๋กœ์ ํŠธ ํŒ€ ์ฐพ๊ธฐ

  • ๊ธฐ์กด์˜ ์ค„๊ธ€๋กœ๋งŒ ์ž‘์„ฑ๋˜์–ด ํ•„ํ„ฐ ๊ฒ€์ƒ‰์ด๋‚˜, ์ •ํ™•ํ•œ ์ •๋ณด๋ฅผ ํ™•์ธํ•˜๊ธฐ ์–ด๋ ค์› ๋˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ ์ž, ํ”„๋กœ์ ํŠธ ์˜ˆ์ƒ ๊ธฐ๊ฐ„, ๋ชจ์ง‘ ํฌ์ง€์…˜๋ณ„ ์ธ์›, ๋ชฉํ‘œ, ํ˜‘์—… ์„ ํ˜ธ ์„ฑํ–ฅ๊ณผ ๋”๋ถˆ์–ด ํ”„๋กœ์ ํŠธ ๋ถ„์•ผ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

localhost_3000_project (1)

4. ํ”„๋กœ์ ํŠธ ํŒ€ ์ƒ์„ฑ

  • ์˜ˆ์ƒ ๊ธฐ๊ฐ„, ๋ชจ์ง‘ ํฌ์ง€์…˜๋ณ„ ์ธ์›, ๋ชฉํ‘œ, ํ˜‘์—… ์„ ํ˜ธ ์„ฑํ–ฅ๊ณผ ๋”๋ถˆ์–ด ํ”„๋กœ์ ํŠธ ๋ถ„์•ผ๋ฅผ ์„ ํƒํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ํ”„๋กœ์ ํŠธ ํŒ€์— ์ด๋ฏธ ๊ตฌ์„ฑ์›์ด ์žˆ๋‹ค๋ฉด, ํ•˜๋‹จ์— ์ด๋ฉ”์ผ ์ž…๋ ฅ์„ ํ†ตํ•ด, ํŒ€์› ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

localhost_3000_project (3)

5. ์ฝ• ์ฐŒ๋ฅด๊ธฐ

  • ์ฝ• ์ฐŒ๋ฅด๊ธฐ ๊ธฐ๋Šฅ์€, Z์„ธ๋Œ€๋“ค์ด ํŒ€๋ธ”์„ ํ†ตํ•ด ๋ถ€๋‹ด์—†์ด ์—ฐ๋ฝํ•˜๊ณ , ํ”„๋กœ์ ํŠธ์— ์ง€์›ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•์Šต๋‹ˆ๋‹ค. ์ฝ• ์ฐŒ๋ฅด๊ธฐ๋ฅผ ๋ˆ„๋ฅด๋ฉด, ๋‚ด ๋งˆ์ด ํ”„๋กœํ•„ ์ •๋ณด๊ฐ€ ์ฐŒ๋ฅธ ์ƒ๋Œ€์—๊ฒŒ ๋ณด๋‚ด์ง€๋ฉฐ โ€˜์ง€์›โ€™์ด๋ผ๋Š” ๋ฌด๊ฑฐ์šด ๊ณผ์ •์ด ์•„๋‹Œ, ๋ถ€๋‹ด์—†์ด ์—ฐ๋ฝํ•˜๋˜ ํ™•์‹คํžˆ ๋ณธ์ธ์˜ ๊ด€์‹ฌ ์˜์‚ฌ๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. localhost_3000_project (4)

localhost_3000_poke_1


IA

์›Œ๋„ˆ๋น„ํŒ€ IA


Git Workflow

main โ† develop โ† feat/issue

Click!

main์€ ๋ชจ๋“  ์ž‘์—…์ด ๋๋‚œ ํ›„ develop์—์„œ Merge ์‹œํ‚จ๋‹ค.

โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”

  • main - ์ดˆ๊ธฐ ์„ธํŒ… ์กด์žฌ

  • develop - local ์ž‘์—… ์™„๋ฃŒ ํ›„ Merge ๋ธŒ๋žœ์น˜

  • feat/issue - ๊ฐ์ž์˜ ๊ธฐ๋Šฅ ์ถ”๊ฐ€ ๋ธŒ๋žœ์น˜

    ex) feat/atom

โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”โ€”

  1. ๊ฐ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค Issue ๋ฐ Branch ์ƒ์„ฑ
  2. local - feat/atom ์—์„œ ๊ฐ์ž ๊ธฐ๋Šฅ ์ž‘์—…
  3. ์ž‘์—… ์™„๋ฃŒ ํ›„ remote - develop ์— Pull Request
  4. ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ›„ Confirm ๋ฐ›๊ณ  Merge
  5. remote - develop ์— Merge ๋  ๋•Œ ๋งˆ๋‹ค ๋ชจ๋“  ํŒ€์› remote - develop pull ๋ฐ›์•„ ์ตœ์‹  ์ƒํƒœ ์œ ์ง€

Commit Message Convention

Click!

ํƒœ๊ทธ ์„ค๋ช…
[INIT] ์ž‘์—… ์„ธํŒ… ์ปค๋ฐ‹
[CHORE] ์ฝ”๋“œ ์ˆ˜์ •, ๋‚ด๋ถ€ ํŒŒ์ผ ์ˆ˜์ •
[FEAT] ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ๊ตฌํ˜„
[STYLE] ๊ธฐ๋Šฅ์— ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๋Š” ์ปค๋ฐ‹, ์ฝ”๋“œ ์ˆœ์„œ ๋“ฑ์˜ ํฌ๋งท์— ๊ด€ํ•œ ์ปค๋ฐ‹
[HOTFIX] issue๋‚˜, QA์—์„œ ๊ธ‰ํ•œ ๋ฒ„๊ทธ ์ˆ˜์ •์— ์‚ฌ์šฉ
[FIX] ๋ฒ„๊ทธ, ์˜ค๋ฅ˜ ํ•ด๊ฒฐ
[DOCS] README๋‚˜ WIKI ๋“ฑ์˜ ๋ฌธ์„œ ๊ฐœ์ •
[RENAME] ํŒŒ์ผ ์ด๋ฆ„ ๋ณ€๊ฒฝ์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
[REFACTOR] ์ „๋ฉด ์ˆ˜์ •์ด ์žˆ์„ ๋•Œ ์‚ฌ์šฉ
[MERGE] ๋‹ค๋ฅธ ๋ธŒ๋žœ์น˜๋ฅผ Merge ํ•  ๋•Œ ์‚ฌ์šฉ
[BUILD] ๋นŒ๋“œ ๊ด€๋ จ ํŒŒ์ผ ์ˆ˜์ •

Coding Convention

Click!

๋ช…๋ช…๊ทœ์น™(Naming Conventions)


  1. ์ด๋ฆ„์œผ๋กœ๋ถ€ํ„ฐ ์˜๋„๊ฐ€ ์ฝํ˜€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ์“ด๋‹ค.
  • ex)

    // bad
    function q() {
      // ...stuff...
    }
    
    // good
    function query() {
      // ..stuff..
    }

  1. ์˜ค๋ธŒ์ ํŠธ, ํ•จ์ˆ˜, ๊ทธ๋ฆฌ๊ณ  ์ธ์Šคํ„ด์Šค์—๋Š” camelCase๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // bad
    const OBJEcttsssss = {};
    const this_is_my_object = {};
    function c() {}
    
    // good
    const thisIsMyObject = {};
    function thisIsMyFunction() {}

  1. styled-components ์‚ฌ์šฉ์‹œ ์ฒซ ๋ฒˆ์งธ wrapper์˜ ์ด๋ฆ„์€ ์ปดํฌ๋„ŒํŠธ ์ด๋ฆ„๊ณผ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑํ•œ๋‹ค.
  • ex)

    // bad
    function CopyModal(options) {
      return <StyledModal />
    }
    
    const StyledModal = styled.div``
    
    // good
    function CopyModal(options) {
      return <StyledCopyModal />
    }
    
    const StyledCopyModal = styled.div``

  1. ํ•จ์ˆ˜ ์ด๋ฆ„์€ ๋™์‚ฌ - ๋ช…์‚ฌ ํ˜•ํƒœ๋กœ ์ž‘์„ฑํ•œ๋‹ค.

    ex) postUserInformation( )


  1. ์•ฝ์–ด ์‚ฌ์šฉ์€ ์ตœ๋Œ€ํ•œ ์ง€์–‘ํ•œ๋‹ค.

์ฐธ์กฐ(References)


  1. ๋ชจ๋“  ์ฐธ์กฐ๋Š” const๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , var๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค.

  2. ์ฐธ์กฐ๋ฅผ ์žฌํ• ๋‹น ํ•ด์•ผํ•œ๋‹ค๋ฉด var๋Œ€์‹  let์„ ์‚ฌ์šฉํ•œ๋‹ค.

    ์ด๋•Œ, const์™€ let์€ ๋ธ”๋ก์Šค์ฝ”ํ”„์ž„์„ ์œ ์˜


๋ธ”๋ก(Blocks)


  1. ๋ณต์ˆ˜ํ–‰์˜ ๋ธ”๋ก์—๋Š” ์ค‘๊ด„ํ˜ธ({})๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // bad
    if (test)
      return false;
    
    // good
    if (test) return false;
    
    // good
    if (test) {
      return false;
    }
    
    // bad
    function() { return false; }
    
    // good
    function() {
      return false;
    }

  1. ๋ณต์ˆ˜ํ–‰ ๋ธ”๋ก์˜ if ์™€ else ๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฒฝ์šฐ else ๋Š” if ๋ธ”๋ก ๋์˜ ์ค‘๊ด„ํ˜ธ(})์™€ ๊ฐ™์€ ํ–‰์— ์œ„์น˜์‹œํ‚จ๋‹ค.
  • ex)

    // bad
    if (test) {
      thing1();
      thing2();
    }
    else {
      thing3();
    }
    
    // good
    if (test) {
      thing1();
      thing2();
    } else {
      thing3();
    }

์ฝ”๋ฉ˜ํŠธ(Comments)


  1. ๋ณต์ˆ˜ํ˜•์˜ ์ฝ”๋ฉ˜ํŠธ๋Š” /** ... */ ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // good
    /**
     * @param {String} tag
     * @return {Element} element
     */
    function make(tag) {
    
      // ...stuff...
    
      return element;
    }

  1. ๋‹จ์ผํ–‰์˜ ์ฝ”๋ฉ˜ํŠธ์—๋Š” // ์„ ์‚ฌ์šฉํ•˜๊ณ  ์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์€ ์ฝ”๋“œ์˜ ์ƒ๋ถ€์— ๋ฐฐ์น˜ํ•œ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ฝ”๋ฉ˜ํŠธ์˜ ์•ž์— ๋นˆํ–‰์„ ๋„ฃ๋Š”๋‹ค.
  • ex)

    // bad
    const active = true;  // is current tab
    
    // good
    // is current tab
    const active = true;
    
    // good
    function getType() {
      console.log('fetching type...');
    
      // set the default type to 'no type'
      const type = this._type || 'no type';
    
      return type;
    }

๊ณต๋ฐฑ(Whitespace)


  1. ์ฃผ์š” ์ค‘๊ด„ํ˜ธ({}) ์•ž์—๋Š” ์ŠคํŽ˜์ด์Šค 1๊ฐœ๋ฅผ ๋„ฃ๋Š”๋‹ค.
  • ex)

    // bad
    function test(){
      console.log('test');
    }
    
    // good
    function test() {
      console.log('test');
    }

  1. ์ œ์–ด๊ตฌ๋ฌธ (if ๋ฌธ์ด๋‚˜ while ๋ฌธ ๋“ฑ) ์˜ ์†Œ๊ด„ํ˜ธ (()) ์•ž์—๋Š” ์ŠคํŽ˜์ด์Šค๋ฅผ 1๊ฐœ ๋„ฃ๊ณ  ํ•จ์ˆ˜ ์„ ์–ธ์ด๋‚˜ ํ•จ์ˆ˜ ํ˜ธ์ถœ์‹œ ์ธ์ˆ˜ ๋ฆฌ์ŠคํŠธ์˜ ์•ž์—๋Š” ์ŠคํŽ˜์ด์Šค๋ฅผ ๋„ฃ์ง€ ์•Š๋Š”๋‹ค.
  • ex)

    // bad
    if(isJedi) {
      fight ();
    }
    
    // good
    if (isJedi) {
      fight();
    }
    
    // bad
    function fight () {
      console.log ('Swooosh!');
    }
    
    // good
    function fight() {
      console.log('Swooosh!');
    }

  1. ์—ฐ์‚ฐ์ž ์‚ฌ์ด์—๋Š” ์ŠคํŽ˜์ด์Šค๋ฅผ ๋„ฃ๋Š”๋‹ค.
  • ex)

    // bad
    const x=y+5;
    
    // good
    const x = y + 5;

์ฝค๋งˆ(Commas)


  1. ์„ ๋‘์˜ ์ฝค๋งˆ BAD
  • ex)

    // bad
    const story = [
        once
      , upon
      , aTime
    ];
    
    // good
    const story = [
      once,
      upon,
      aTime,
    ];

  1. ๋์˜ ์ฝค๋งˆ GOOD
  • ex)

    // bad
    const hero = {
      firstName: 'Dana',
      lastName: 'Scully'
    };
    
    // good
    const hero = {
      firstName: 'Dana',
      lastName: 'Scully',
    };

์„ธ๋ฏธ์ฝœ๋ก (Seminolons)


  1. ์„ธ๋ฏธ์ฝœ๋ก ์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // bad
    (function() {
      const name = 'Skywalker'
      return name
    })()
    
    // good
    (() => {
      const name = 'Skywalker';
      return name;
    })();

๋ฌธ์ž์—ด(Strings)


  1. ๋ฌธ์ž์—ด์—๋Š” ์‹ฑํฌ์ฟผํŠธ '' ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // bad
    const name = "Capt. Janeway";
    
    // good
    const name = 'Capt. Janeway';

  1. ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋ฌธ์ž์—ด์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ๋Š” ๋ฌธ์ž์—ด ์—ฐ๊ฒฐ์ด ์•„๋‹Œ template strings๋ฅผ ์ด์šฉํ•œ๋‹ค.
  • ex)

    // bad
    function sayHi(name) {
      return 'How are you, ' + name + '?';
    }
    
    // bad
    function sayHi(name) {
      return ['How are you, ', name, '?'].join();
    }
    
    // good
    function sayHi(name) {
      return `How are you, ${name}?`;
    }

ํ•จ์ˆ˜(Functions)


  1. ์ฝœ๋ฐฑ ํ•จ์ˆ˜๋Š” ํ™”์‚ดํ‘œ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    var arr1 = [1, 2, 3];
    var pow1 = arr.map(function (x) { // ES5 Not Good
      return x * x;
    });
    
    const arr2 = [1, 2, 3];
    const pow2 = arr.map(x => x * x); // ES6 Good

  1. ๊ทธ ์™ธ์—๋Š” ํ•จ์ˆ˜ ์„ ์–ธ์„ ์ด์šฉํ•œ๋‹ค.
  • ex)

    // bad
    const foo = function () {
    };
    
    // good
    function foo() {
    }

์กฐ๊ฑด์‹๊ณผ ๋“ฑ๊ฐ€์‹(Comparison Operators & Equality)


  1. == ์ด๋‚˜ != ๋ณด๋‹ค === ์™€ !== ์„ ์‚ฌ์šฉํ•œ๋‹ค.

  1. ๋‹จ์ถ•ํ˜•์„ ์‚ฌ์šฉํ•œ๋‹ค.
  • ex)

    // bad
    if (name !== '') {
      // ...stuff...
    }
    
    // good
    if (name) {
      // ...stuff...
    }
    
    // bad
    if (collection.length > 0) {
      // ...stuff...
    }
    
    // good
    if (collection.length) {
      // ...stuff...
    }

  1. ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ Promiseํ•จ์ˆ˜์˜ ์‚ฌ์šฉ์€ ์ง€์–‘ํ•˜๊ณ  async, await๋ฅผ ์“ฐ๋„๋ก ํ•œ๋‹ค.


Foldering

|-๐Ÿ“‹ .gitignore
|-๐Ÿ“ .storybook
|-๐Ÿ“ styles_
|-๐Ÿ“ utils_
|-๐Ÿ“ pages_
|-๐Ÿ“ components_
               |- ๐Ÿ“ atom_
               |         |- ๐Ÿ“ button_
               |                     |- ๐Ÿ“‹ Button.tsx
               |                     |- ๐Ÿ“‹ Button.stories.tsx
               |
               |- ๐Ÿ“ molecule_
               |             |- ๐Ÿ“ entryField_
               |                             |- ๐Ÿ“‹ EntryField.tsx
               |                             |- ๐Ÿ“‹ EntryField.stories.t
               |- ๐Ÿ“ organism_
               |             |- ๐Ÿ“ recruitPostion_
               |                                  |- ๐Ÿ“‹ RecruitPostion.tsx
               |                                  |- ๐Ÿ“‹ RecruitPostion.stories.tsx