Skip to content

MusicDigging/Mudig_BE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

Mudig

296149697-a6800871-704b-4d56-b8ff-6fc6db0bcf72

๐Ÿ‘‰ ๋ฎค๋”• ๋ฐ”๋กœ๊ฐ€๊ธฐ ๐Ÿ“Œ ๋ฎค๋”• ๊ฐœ๋ฐœ ์ผ์ง€

ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•ด๋ณด์‹ค ์ˆ˜ ์žˆ๋Š” ํ…Œ์ŠคํŠธ ๊ณ„์ •์ž…๋‹ˆ๋‹ค.

 ID : [email protected]
 PW : Mudig011

 ID : [email protected]
 PW : Mudig012

 ID : [email protected]
 PW : Mudig013

 ID : [email protected]
 PW : Mudig014

 ID : [email protected]
 PW : Mudig015

[๋ชฉ์ฐจ]

  1. ๊ฐœ์š”
  2. ๊ธฐ๋Šฅ
    a. ์ฃผ์š” ๊ธฐ๋Šฅ
  3. ๊ธฐ์ˆ  ์Šคํƒ ๋ฐ ๋ฐฐํฌ URL
  4. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์™€ ๊ฐœ๋ฐœ ์ผ์ •
    a. ERD
    b. ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์„œ
    c. API ๋ช…์„ธ์„œ
    d. URL ์„ค๊ณ„
    e. Architecture
    f. ๊ฐœ๋ฐœ ์ผ์ •
    g. git ์ „๋žต
  5. ๊ตฌํ˜„ ๊ธฐ๋Šฅ ์‹œ์—ฐ
  6. ๊ฐœ๋ฐœํ•˜๋ฉฐ ๋Š๋‚€์ 
    a. OpenAPI Specification
    b. CI/CD
    c. Restful API
    d. Oauth
  7. ์™ธ๋ถ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜
    a. ChatGPT
    b. Karlo
    c. Youtube Data API
  8. ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ํ›„ ๋ฐ˜์˜

๊ณ„๊ธฐ ๋ฐ ๋ชฉํ‘œ

1๏ธโƒฃ AI๋Š” ์•„์ง ์‚ฌ๋žŒ๋“ค๊ณผ ์นœํ•ด์ง€์ง€ ์•Š์•˜๋‹ค.

2๏ธโƒฃ AI์— ๋Œ€ํ•œ ๋ถ€์ •์ ์ธ ์‹œ์„ ์„ ๋‚ฎ์ถ”๊ณ , ์‚ฌ๋žŒ๋“ค๊ณผ ์นœํ•ด์ง€๋Š” ๊ณ„๊ธฐ๋ฅผ ์ œ๊ณตํ•˜์ž!

ํ˜„์žฌ AI ๊ธฐ์ˆ ์€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋งŽ์€ ๊ด€์‹ฌ์„ ๋ฐ›๊ณ  ์žˆ์ง€๋งŒ
์•„์ง๋„ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค๊ณผ๋Š” ์นœํ•ด์ง€์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ์ข€๋” ์นœํ•ด์งˆ ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

์ธ์‚ฌ๋ง

์•ˆ๋…•ํ•˜์„ธ์š”. ๐Ÿ™‡โ€โ™‚๏ธ

๋ฎค๋”•(Mudig, Music Digging ์ดํ•˜ ๋ฎค๋”•)์€ ์‚ฌ์šฉ์ž๋“ค์ด ์ƒˆ๋กœ์šด ์Œ์•…์„ ๋ฐœ๊ฒฌํ•˜๊ณ , ์ถ”์ฒœ๋ฐ›์œผ๋ฉฐ, ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์„ ๋งํ•ฉ๋‹ˆ๋‹ค.

GPT (Generative Pretrained Transformer) ๊ธฐ์ˆ ๊ณผ Karlo(T2I, Text to Image)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ธํ™”๋œ ์Œ์•… ์ถ”์ฒœ๊ณผ ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒํ•œ ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๋Š” ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

๋ฎค๋”•์€

  1. ์ž์ฒด ํšŒ์›๊ฐ€์ž… ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ตฌ๊ธ€, ์นด์นด์˜ค๋ฅผ ์ด์šฉํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ์„ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ์ธ๊ณต์ง€๋Šฅ์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์Œ์•…์„ ์ฐพ๋Š” ์ฆ๊ฑฐ์›€์„ ๋“œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ์ž์‹ ๋งŒ์˜ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณต์œ ํ•˜๊ณ , ์†Œํ†ตํ•˜๋ฉฐ ๋ฌด๋ฃŒํ•œ ์ผ์ƒ์— ์†Œ์†Œํ•จ ์ฆ๊ฑฐ์›€์„ ๋Š๋‚„ ์ˆ˜ ์žˆ๋„๋ก ์žฅ์†Œ๋ฅผ ์ œ๊ณตํ•ด๋“œ๋ฆฝ๋‹ˆ๋‹ค.

๋””๊น…์ด๋ž€?

โ€˜๋””๊น…โ€™์ด๋ž€ย ์›๋ž˜ ๋””์ œ์ด๊ฐ€ ์ž์‹ ์˜ ๊ณต์—ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด์„œ
์Œ์•…์„ ์ฐพ๋Š” ํ–‰์œ„๋ฅผย ์˜๋ฏธํ•˜๋‚˜, ํ˜„์žฌ๋Š” ์ž์‹ ์˜ ํŠน์ƒ‰์žˆ๋Š” ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ์งœ๋Š” ๊ฒƒ์œผ๋กœ
๊ทธ ์˜๋ฏธ๊ฐ€ ํ™•๋Œ€ ๋˜์–ด ์ผ๋ฐ˜์ธ๋“ค๋„ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

ํŒ€์› ์†Œ๊ฐœ

์•ˆ๋…•ํ•˜์„ธ์š”. Team Mudig ์ž…๋‹ˆ๋‹ค!

๊ฐ•ํ˜„์šฐ ๊น€์—ฌ์ฃผ ์‚ฌ์ˆ˜๋ด‰ ์‹ฌ๋ฏผ์ • ํ™ฉ๋ด‰์ˆ˜
๐Ÿ”— Hyunwooz ๐Ÿ”— kimyeoju ๐Ÿ”— su0797 ๐Ÿ”— MJ-SIM ๐Ÿ”— bnbbbb

์•ˆ๋…•ํ•˜์„ธ์š” ๐Ÿ™‡โ€โ™‚๏ธ
์ €ํฌ๋Š” Mudig์˜ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž ๋ฐฑ์—”๋“œ ํŒ€ ์ž…๋‹ˆ๋‹ค.
Estsoft์—์„œ ์ฃผ๊ด€ํ•˜๋Š” ๋ฐฑ์—”๋“œ ์˜ค๋ฅด๋ฏธ ๊ต์œก๊ณผ์ •์—์„œ ๋งŒ๋‚œ ๋น„์ „๊ณต์ž์™€ ์ „๊ณต์ž๋“ค๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด ๊ธฐ์ˆ ์„ ๋ฐ›์•„๋“ค์ž„์— ์žˆ์–ด์„œ ์—ด๋ฆฐ ๋งˆ์Œ์„ ๊ฐ€์ง„ ๋ถ„๋“ค์ด ๋ชจ์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
๊ธฐ์ˆ ์ ์œผ๋กœ ๋ถ€์กฑํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์ตœ์„ ์„ ๋‹คํ•ด ์ค€๋น„ํ–ˆ์Šต๋‹ˆ๋‹ค.
์ž˜๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค :)

์—ญํ• 

๋ฐฑ์—”๋“œ ์—ญํ• 

ํ˜‘์—… ๋„๊ตฌ

๐Ÿ“œ Notion , ๐Ÿ“ฑ Discord

Discord Webhook์„ ํ†ตํ•œ Gitgub ์—ฐ๋™

ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋ฅผ Github์œผ๋กœ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋ฉด์„œ Commit Log๋ฅผ ํ˜‘์—… ๋ฉ”์‹ ์ €๋กœ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” Discord์—์„œ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋„๋ก ์—ฐ๋™ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1. Discord Webhook ์ƒ์„ฑ

์Šคํฌ๋ฆฐ์ƒท 2024-01-08 111902

2. Github Webhook ์ƒ์„ฑ

์Šคํฌ๋ฆฐ์ƒท 2024-01-08 112032

3. Discord ์•Œ๋ฆผ ๋ฉ”์‹œ์ง€ ์ˆ˜์‹ 

์Šคํฌ๋ฆฐ์ƒท 2024-01-08 111603 ์Šคํฌ๋ฆฐ์ƒท 2024-01-08 111528 ์Šคํฌ๋ฆฐ์ƒท 2024-01-08 111544

Github Action์„ ํ†ตํ•ด CI/CD ๊ฒฐ๊ณผ ์•Œ๋ฆผ ์„ค์ •

๊ตฌํ˜„ ์ฝ”๋“œ

# CI ์„ฑ๊ณต ๋ฉ”์„ธ์ง€ ๋ฐœ์†ก
build-CI-Success:
  needs: CI
  runs-on: ubuntu-latest
  if: success()
  steps:
    - name: Discord notification
      env:
        DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
      uses: Ilshidur/action-discord@master
      with:
        args: "
          ## CI ์ง„ํ–‰\n

          ### ๐Ÿ“Œ Status\n
          > **Success** โœ…\n

          ### โœ๏ธ Commit message\n
          > ${{ github.event.commits[0].message }}\n"

# ๋ฐฐํฌ ์„ฑ๊ณต ๋ฉ”์„ธ์ง€ ๋ฐœ์†ก
build-Deploy-Success:
  needs: deploy
  runs-on: ubuntu-latest
  if: success()
  steps:
    - name: Discord notification
      env:
        DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
      uses: Ilshidur/action-discord@master
      with:
        args: "
          ## Deploy ์ง„ํ–‰\n

          ### ๐Ÿ“Œ Status\n
          > **Success** โœ…\n

          ### โœ๏ธ Commit message\n
          > ${{ github.event.commits[0].message }}\n

          ### ๐Ÿซก See changes\n
          > https://github.com/${{ github.repository }}/commit/${{github.sha}}\n"

# CI ์‹คํŒจ ๋ฉ”์„ธ์ง€ ๋ฐœ์†ก
build-CI-failure:
  needs: CI
  runs-on: ubuntu-latest
  if: failure()
  steps:
    - name: Discord notification
      env:
        DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
      uses: Ilshidur/action-discord@master
      with:
        args: "
          ## CI ์ง„ํ–‰\n

          ### ๐Ÿ“Œ Status\n
          > **Failure** โ›”\n

          ### โœ๏ธ Commit message\n
          > ${{ github.event.commits[0].message }}\n

          ### ๐Ÿ‘€ See Error Message\n
          > https://github.com/MusicDigging/Mudig_BE/actions\n"

#๋ฐฐํฌ ์‹คํŒจ ๋ฉ”์„ธ์ง€ ๋ฐœ์†ก
build-Deploy-failure:
  needs: deploy
  runs-on: ubuntu-latest
  if: ${{ needs.deploy.outputs['result'] == 'failure' }}
  steps:
    - name: Discord notification
      env:
        DISCORD_WEBHOOK: ${{ secrets.DISCORD_WEBHOOK }}
      uses: Ilshidur/action-discord@master
      with:
        args: "
          ## Deploy ์ง„ํ–‰\n

          ### ๐Ÿ“Œ Status\n
          > **Failure** โ›”\n

          ### โœ๏ธ Commit message\n
          > ${{ github.event.commits[0].message }}\n

          ### ๐Ÿ‘€ See Error Message\n
          > https://github.com/MusicDigging/Mudig_BE/actions\n"

1. ๊ธฐ๋Šฅ

1.1. ์ฃผ์š” ๊ธฐ๋Šฅ

  • ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ , ์†Œ์…œ ๋กœ๊ทธ์ธ (Kakao, Google)

    ๋ฎค๋”• ์„œ๋น„์Šค๋Š” ์ด๋ฉ”์ผ๋กœ ํšŒ์›๊ฐ€์ž…๊ณผ ๋กœ๊ทธ์ธ์„ ๊ธฐ๋ณธ์œผ๋กœ ์ œ๊ณตํ•˜๋ฉฐ, 
    ์นด์นด์˜ค์™€ ๊ตฌ๊ธ€์„ ํ™œ์šฉํ•œ ์†Œ์…œ ๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ์„œ๋น„์Šค๋ฅผ ํŽธ๋ฆฌํ•˜๊ฒŒ ์ด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 
    ๋˜ํ•œ, ๋งˆ์ด ํŽ˜์ด์ง€์—์„œ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ํšŒ์›ํƒˆํ‡ด, ๋กœ๊ทธ์•„์›ƒ๊ณผ ๊ฐ™์€ ์ฃผ์š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋ฉฐ 
    ์‚ฌ์šฉ์ž์˜ ๊ณ„์ • ์ •๋ณด๋ฅผ ์†์‰ฝ๊ฒŒ ํ™•์ธ ๋ฐ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    
  • ์ด๋ฉ”์ผ๋กœ ํ†ตํ•œ ํšŒ์›๊ฐ€์ž…์‹œ ๋ฉ”์ผ ์ธ์ฆ

    ์ด๋ฉ”์ผ๋กœ ํšŒ์›๊ฐ€์ž… ์‹œ, ๋ณด์•ˆ์„ ๊ฐ•ํ™”ํ•˜๊ธฐ ์œ„ํ•ด SMTP ์„œ๋ฒ„๋ฅผ ํ™œ์šฉํ•˜์—ฌ 
    ๋ฉ”์ผ ์ธ์ฆ ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•œ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋กœ ์ „์†ก๋˜๋Š” ์ธ์ฆ๋ฒˆํ˜ธ๋ฅผ 
    ํ†ตํ•ด์„œ ์‚ฌ์šฉ์ž์˜ ์‹ ์›์„ ํ™•์ธํ•˜๊ณ , ์ •ํ™•ํ•œ ์ธ์ฆ๋ฒˆํ˜ธ ์ž…๋ ฅ ์‹œ์—๋งŒ ํšŒ์›๊ฐ€์ž…์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    
  • JSON Web Token ์ธ์ฆ ๋ฐฉ์‹

    ๋กœ๊ทธ์ธ ์‹œ ๋ฐœ๊ธ‰๋œ Access Token์„ ํ™œ์šฉํ•˜์—ฌ ์œ ์ € ์ธ์ฆ์„ ์ˆ˜ํ–‰ํ•˜๋ฉด์„œ, 
    ๋™์‹œ์— ์ง€์†์ ์ธ ์„ธ์…˜ ์œ ์ง€๋ฅผ ์œ„ํ•ด Refresh Token์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. 
    Refresh Token ๊ฐฑ์‹ ์€ ๋ณ„๋„์˜ URL์ธ โ€˜api/token/refresh/โ€˜ ๋ฅผ ํ†ตํ•ด ์ด๋ค„์ง€๋ฉฐ, 
    Access Token์˜ ๋งŒ๋ฃŒ ์ „์— ์ž๋™์œผ๋กœ ์ƒˆ๋กœ์šด Access Token์„ ํš๋“ํ•ฉ๋‹ˆ๋‹ค. 
    ์ด๋กœ์จ ์‚ฌ์šฉ์ž๋Š” ๋กœ๊ทธ์ธ ์ƒํƒœ๋ฅผ ์ง€์†ํ•˜๋ฉด์„œ Mudig ์„œ๋น„์Šค๋ฅผ ๋ณด๋‹ค ์•ˆ์ „ํ•˜๊ฒŒ ์ฆ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    
  • ํ”„๋กœํ•„ CRU

    ํšŒ์›๊ฐ€์ž… ํ›„ ์ž์‹ ์„ ๋Œ€ํ‘œํ•˜๋Š” ํ”„๋กœํ•„์„ ๊พธ๋ฐ€ ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    ํ”„๋กœํ•„ ์ด๋ฏธ์ง€์™€ ํ•œ์ค„ ์†Œ๊ฐœ๋ฅผ ์ž‘์„ฑ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ๊ด€์‹ฌ ์žฅ๋ฅด, ๋Œ€ํ‘œ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ๋“ฑ์„ ์„ค์ • ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.
    
  • Follow / Unfollow ๊ธฐ๋Šฅ

    ์ž์‹ ๊ณผ ๊ด€์‹ฌ์‚ฌ๊ฐ€ ๋น„์Šทํ•œ ์œ ์ €์™€ ํŒ”๋กœ์›Œ๋ฅผ ๋งบ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    
  • ๋žœ๋ค ๋ฎค๋น„

    ์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ ๋ณด์œ  ์ค‘์ธ Music ๋ชฉ๋ก์—์„œ ๋žœ๋ค์œผ๋กœ 5๊ฐœ์˜ ์Œ์•…์„ ์ถ”์ฒœํ•ด๋“œ๋ฆฌ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    ํ•ด๋‹น ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์žฅ๋ฅด, ์—ฐ๋„์— ์ƒ๊ด€์—†์ด ๋‹ค์–‘ํ•œ ์Œ์•…์„ ๋žœ๋ค์œผ๋กœ ๋งŒ๋‚˜๋ณด์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    
  • ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ CRUD ๊ธฐ๋Šฅ

    ์‚ฌ์šฉ์ž๋“ค์ด ์›ํ•˜๋Š” ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ƒ์„ฑํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ˆ˜์ •์—๋Š” ๊ณก ์ˆœ์„œ ์ด๋™, ๊ณก ์‚ญ์ œ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
    ํ•ด๋‹น ๊ธฐ๋Šฅ์€ GPT API, YouTube Data API, Karlo ์™€ ์—ฐ๊ด€๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
    
  • ์ด๋ฒคํŠธ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ

    ์‚ฌ์šฉ์ž๋“ค์˜ ํ˜„์žฌ ์ƒํ™ฉ,๊ธฐ๋ถ„์— ๋Œ€ํ•œ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค.
    ์ด ๊ธฐ๋Šฅ์€ ์ด๋ฒคํŠธ์„ฑ์œผ๋กœ ๋ฐœ์ƒ๋ฉ๋‹ˆ๋‹ค.
    
  • ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ข‹์•„์š”

    ๋ฎค๋”• ์ด์šฉ ์ค‘ ๋ฐœ๊ฒฌํ•œ ์ทจํ–ฅ์ €๊ฒฉ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ์— ์ข‹์•„์š”๋ฅผ ๋ˆŒ๋Ÿฌ
    โ€˜๋งˆ์ดํŽ˜์ด์ง€ - ์ข‹์•„์š” ํ‘œ์‹œํ•œ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธโ€™์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    ์ €์žฅ๋œ ๋ฆฌ์ŠคํŠธ๋Š” ๋‚ด ํ”„๋กœํ•„์— ๋ฐฉ๋ฌธํ•œ ๋‹ค๋ฅธ ์œ ์ €๋“ค๋„ ๋ณผ ์ˆ˜ ์žˆ์–ด
    ์„œ๋กœ ๋‹ค์–‘ํ•œ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    
  • ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ, ์œ ์ € ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ

    ์›ํ•˜๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ž…๋ ฅ ํ›„ ๊ฒ€์ƒ‰ํ•˜๋ฉด ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ์˜ ์ œ๋ชฉ, ์œ ์ €์˜ ๋‹‰๋„ค์ž„
    ๋˜๋Š” ์†Œ๊ฐœ๊ธ€์— ํ•ด๋‹น ํ‚ค์›Œ๋“œ๊ฐ€ ํฌํ•จ๋œ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ์™€ ์œ ์ €๋ฅผ ์ฐพ์•„๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    
  • ๋Œ“๊ธ€๊ณผ ๋Œ€๋Œ“๊ธ€ CRUD

    ๋Œ“๊ธ€์„ ์ด์šฉํ•˜์—ฌ ๊ฒŒ์‹œ๊ธ€์— ๋Œ€ํ•œ ์˜๊ฒฌ์„ ๋‚จ๊ธธ ์ˆ˜๋„ ์žˆ์œผ๋ฉฐ ๋Œ“๊ธ€์˜ ๋Œ€๋Œ“๊ธ€ ๊ธฐ๋Šฅ ๊นŒ์ง€ ์ง€์›ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    ๋Œ“๊ธ€์„ ์ˆ˜์ •, ์‚ญ์ œํ•˜๋Š” ๊ธฐ๋Šฅ๊นŒ์ง€ ์ œ๊ณต ๋˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
    
  • GPT API, YouTube Data API, Karlo

    ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋‚ด์šฉ์„ ํ† ๋Œ€๋กœ GPT API๊ฐ€ ์ƒ์„ฑํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ YouTube Data API V3๋กœ
    ์ „์†กํ•˜์—ฌ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ์˜ ์ œ๋ชฉ, ๋…ธ๋ž˜๋“ค, Karlo ์ด๋ฏธ์ง€ ๊ฐ’ ๋“ฑ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
    

    # ์™ธ๋ถ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

2. ๊ธฐ์ˆ  ์Šคํƒ ๋ฐ ๋ฐฐํฌ URL

2.2. ๊ธฐ์ˆ  ์Šคํƒ

์‚ฌ์šฉ ๊ธฐ์ˆ  ย  ย  ย 
๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ย 
์ €์žฅ์†Œ ย 
๋ฐฐํฌ ย  ย 
API ๋ฌธ์„œ ย 
ํ˜‘์—… ย  ย  ย  ย 
IDE ย 

2.2. ๋ฐฐํฌ URL

2.2.1. Back-End

2.2.2. Front-End

3. ํ”„๋กœ์ ํŠธ ๊ตฌ์กฐ์™€ ๊ฐœ๋ฐœ ์ผ์ •

3.1. Entity Relationship Diagram

์Šคํฌ๋ฆฐ์ƒท 2024-01-02 203149

DB-Diagram ๋ฐ”๋กœ๊ฐ€๊ธฐ

3.2. ์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์„œ

์š”๊ตฌ์‚ฌํ•ญ ์ •์˜์„œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

ํ”„๋กœ์ ํŠธ ๋ฒ”์œ„

๋ฎค๋”•์€ ChatGPT๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ AI ์Œ์•… ๋””๊น… ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋“ค์€ AI๋ฅผ ํ™œ์šฉํ•ด ํ˜„์žฌ ๊ธฐ๋ถ„์ด๋‚˜ ์„ ํ˜ธํ•˜๋Š” ์Œ์•… ์žฅ๋ฅด ๋“ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ƒ์„ฑํ•œ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณต์œ ํ•˜๊ณ  ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๋“ค๊ณผ ๋Œ“๊ธ€๋กœ ์†Œํ†ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฎค๋”•์€ ์†Œ์…œ ์Œ์•… ๊ณต์œ  ํ”Œ๋žซํผ์œผ๋กœ์„œ ๋‹ค์–‘ํ•œ ์Œ์•…์„ ํƒ์ƒ‰ํ•˜๊ณ  ์†Œํ†ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ณต๊ฐ„์œผ๋กœ, ์Œ์•…์„ ์ฆ๊ธฐ๋Š” ์ฆ๊ฑฐ์šด ๊ฒฝํ—˜์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์šฉ์–ด์ง‘

์šฉ์–ด ์ •์˜
ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋Š” ์Œ์•…์ด๋‚˜ ๋น„๋””์˜ค, ์‚ฌ์ง„, ํ…์ŠคํŠธ ๋“ฑ์„ ๋ชจ์•„ ๋†“์€ ๋ชฉ๋ก์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ฃผ๋กœ ์Œ์•… ์ŠคํŠธ๋ฆฌ๋ฐ ์„œ๋น„์Šค์—์„œ๋Š” ํ•œ ํ…Œ๋งˆ๋‚˜ ๋ถ„์œ„๊ธฐ์— ๋งž๊ฒŒ ๊ณก๋“ค์„ ๋ชจ์•„๋‘” ๋ชฉ๋ก์œผ๋กœ ์ด์šฉ๋˜๋ฉฐ. ์ผ์ƒ์˜ ๋ฐฐ๊ฒฝ์Œ์•…๋ถ€ํ„ฐ ๊ฐ์„ฑ์ ์ธ ๋ถ„์œ„๊ธฐ๊นŒ์ง€, ๋‹ค์–‘ํ•œ ํ…Œ๋งˆ๋‚˜ ์ทจํ–ฅ์— ๋”ฐ๋ผ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด ๊ณต์œ ํ•˜๊ฑฐ๋‚˜ ์ฆ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ข…์ข… ์‚ฌ์šฉ์ž๋“ค์ด ์ข‹์•„ํ•˜๋Š” ์Œ์•…์ด๋‚˜ ์„ ๊ณก์„ ๋ชจ์•„๋‘” ๋ชฉ๋ก์œผ๋กœ๋„ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.
์œ ์ € ์œ ์ €(User)๋ž€ ํŠน์ • ์›น์‚ฌ์ดํŠธ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋˜๋Š” ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ๊ฐœ์ธ์ด๋‚˜ ๊ธฐ์—…์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค. ์ด์šฉ์ž๊ฐ€ ํ•ด๋‹น ํ”Œ๋žซํผ์— ๋“ฑ๋กํ•˜๊ณ , ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. "์‚ฌ์šฉ์ž" ๋˜๋Š” "๊ณ ๊ฐ"๊ณผ ์œ ์‚ฌํ•œ ์˜๋ฏธ๋กœ ์“ฐ์ž…๋‹ˆ๋‹ค. ์œ ์ €๋Š” ๋กœ๊ทธ์ธํ•˜์—ฌ ์„œ๋น„์Šค์— ์ ‘๊ทผํ•˜๊ณ , ์„œ๋น„์Šค์˜ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜๋ฉฐ, ๊ฐœ์ธ์ ์ธ ํ”„๋กœํ•„์„ ์„ค์ •ํ•˜๊ณ  ์ •๋ณด๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
ํšŒ์›๊ฐ€์ž… ํšŒ์›๊ฐ€์ž…์€ ์–ด๋–ค ์›น์‚ฌ์ดํŠธ๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋“ฑ๋ก๋˜์–ด ๊ทธ ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ์ ˆ์ฐจ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ์ •๋ณด(์ด๋ฆ„, ์ด๋ฉ”์ผ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ)๋ฅผ ์ œ๊ณตํ•˜์—ฌ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜๊ณ , ํ•ด๋‹น ์„œ๋น„์Šค๋ฅผ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…์„ ํ†ตํ•ด ์‚ฌ์ดํŠธ์— ๋กœ๊ทธ์ธํ•˜์—ฌ ์„œ๋น„์Šค๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ ํŠน์ • ๊ธฐ๋Šฅ์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.
๋กœ๊ทธ์ธ ๋“ฑ๋ก๋œ ์œ ์ € ๊ณ„์ •์œผ๋กœ ์‹œ์Šคํ…œ์— ์ ‘๊ทผํ•˜์—ฌ ์œ ์ € ์‹๋ณ„์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ณผ์ •์ž…๋‹ˆ๋‹ค.
๋””๊น…(Digging) ๋””๊น…์ด๋ž€ย ์›๋ž˜ ๋””์ œ์ด๊ฐ€ ์ž์‹ ์˜ ๊ณต์—ฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ฑ„์šฐ๊ธฐ ์œ„ํ•ด์„œ ์Œ์•…์„ ์ฐพ๋Š” ํ–‰์œ„๋ฅผย ์˜๋ฏธํ•˜๋‚˜, ํ˜„์žฌ๋Š” ์ž์‹ ์˜ ํŠน์ƒ‰์žˆ๋Š” ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ์งœ๋Š” ๊ฒƒ์œผ๋กœ ๊ทธ ์˜๋ฏธ๊ฐ€ ํ™•๋Œ€ ๋˜์–ด ์ผ๋ฐ˜์ธ๋“ค๋„ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์ž…๋‹ˆ๋‹ค.
ChatGPT ChatGPT๋ž€ OpenAI๊ฐ€ ๊ฐœ๋ฐœํ•œย ๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ(large language model, LLM)ย ์ฑ—๋ด‡์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ChatGPT๋Š” ๋Œ€ํ™” ํ˜•ํƒœ๋กœ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋ฉฐ ๋†€๋ผ์šธ ์ •๋„๋กœ ์ธ๊ฐ„๊ณผ ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐ˜์‘์„ ์ œ๊ณตํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ๊ฐœ์š”

ํ•ด๋‹น ๋ฌธ์„œ๋Š” ๋ฎค๋”•์˜ ์›น ํŽ˜์ด์ง€์˜ ๊ฐœ๋ฐœ๊ณผ ๊ด€๋ จ๋œ ์ฃผ์š” ์ •๋ณด๋ฅผ ๋‹ค๋ฃน๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ์ฃผ๋กœ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ๊ธฐ๋Šฅ์  ์š”๊ตฌ์‚ฌํ•ญ๊ณผ ๊ธฐ์ˆ ์  ์šฉ์–ด๋กœ ์ž‘์„ฑ๋œ ์„œ๋น„์Šค์˜ ์„ธ๋ถ€ ๊ธฐ๋Šฅ์— ๊ด€ํ•œ ๋‚ด์šฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

3.3. API ๋ช…์„ธ์„œ

3.3.1. API ๋ช…์„ธ์„œ: https://api.mudig.co.kr/api/swagger/

์Šคํฌ๋ฆฐ์ƒท 2023-12-17 215443 ์Šคํฌ๋ฆฐ์ƒท 2023-12-25 195931

3.4. URL ์„ค๊ณ„

api.mudig.co.kr

๊ธฐ๋Šฅ URL Method ๋‹ด๋‹น
USER
์ด๋ฉ”์ผ ์ธ์ฆ /user/otp POST ๊น€์—ฌ์ฃผ
๋‹‰๋„ค์ž„ ์ค‘๋ณต ๊ฒ€์‚ฌ /user/checkname POST
ํšŒ์›๊ฐ€์ž… /user/join POST
๋กœ๊ทธ์ธ /user/login POST
๋กœ๊ทธ์•„์›ƒ /user/logout POST
์†Œ์…œ ๋กœ๊ทธ์ธ /user/login/{provider} GET
์†Œ์…œ ๋กœ๊ทธ์ธ ์ฝœ๋ฐฑ /user/login/{provider}/callback POST
์†Œ์…œ ํšŒ์› ๊ฐ€์ž… /user/socialjoin/ POST
๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ /user/changepassword PUT
ํšŒ์› ํƒˆํ‡ด /user/withdrawal DELETE
ํ”„๋กœํ•„ ์กฐํšŒ /user/profile GET ์‹ฌ๋ฏผ์ •
ํƒ€ ์œ ์ € ํ”„๋กœํ•„ ์กฐํšŒ /user/profile/int:user_id GET
ํ”„๋กœํ•„ ์ˆ˜์ • /user/profile/edit PUT
ํŒ”๋กœ์šฐ /user/int:user_id/follow POST
์–ธํŒ”๋กœ์šฐ /user/int:user_id/unfollow DELETE
ํŒ”๋กœ์›Œ ๋ชฉ๋ก ์กฐํšŒ /user/int:user_id/followers GET
ํŒ”๋กœ์ž‰ ๋ชฉ๋ก ์กฐํšŒ /user/int:user_id/following GET
PLAYLIST
ํ”Œ๋ฆฌ ์กฐํšŒ /playlist GET ํ™ฉ๋ด‰์ˆ˜
ํ”Œ๋ฆฌ ์ƒ์„ฑ /playlist/create POST
ํ”Œ๋ฆฌ ์‚ญ์ œ /playlist/delete/int:playlist_id DELETE
ํ”Œ๋ฆฌ ์ˆ˜์ • /playlist/detail/int:playlist_id/edit PUT
ํ”Œ๋ฆฌ ์ƒ์„ธ๋ณด๊ธฐ /playlist/detail/int:playlist_id GET
๊ธฐ์กด ํ”Œ๋ฆฌ์— ๊ณก ์ถ”๊ฐ€ /playlist/add PUT
๋‚ด ํ”Œ๋ฆฌ ๋ณด๊ธฐ (์Œ์•…์ถ”๊ฐ€ ํ•  ๋•Œ) /playlist/myplaylist GET
๋ชจ๋“ ์Œ์•… (์Œ์•…์ถ”๊ฐ€ํ•  ๋•Œ) /playlist/music GET
ํ”Œ๋ฆฌ ๊ฒ€์ƒ‰ /playlist/search?query={string} GET ์‚ฌ์ˆ˜๋ด‰
ํ”Œ๋ฆฌ ์ข‹์•„์š” /playlist/like POST
ํ”Œ๋ฆฌ ๋Œ“๊ธ€ ์ž‘์„ฑ /playlist/comment/write POST
ํ”Œ๋ฆฌ ๋Œ€๋Œ“๊ธ€ ์ž‘์„ฑ /playlist/recomment/write POST
ํ”Œ๋ฆฌ ๋Œ“๊ธ€ ์ˆ˜์ • /playlist/comment/edit PUT
ํ”Œ๋ฆฌ ๋Œ“๊ธ€ ์‚ญ์ œ /playlist/comment/delete/int:comment_id DELETE
๋žœ๋ค ๋ฎค๋น„ /playlist/random-mv POST ๊ฐ•ํ˜„์šฐ
์ด๋ฒคํŠธ์„ฑ ํ”Œ๋ฆฌ ์ƒ์„ฑ /playlist/event POST

3.5. ํ”„๋กœ์ ํŠธ ์„ค๊ณ„ ๋ฐ ํ”„๋กœ์„ธ์Šค

3.5.1. Architecture

์Šคํฌ๋ฆฐ์ƒท 2023-12-25 171731

3.5.2. ํด๋” ํŠธ๋ฆฌ

๐Ÿ“ฆMudig_BE
 โ”ฃ ๐Ÿ“‚.github
 โ”ƒ โ”— ๐Ÿ“‚workflows
 โ”ƒ โ”ƒ โ”— ๐Ÿ“œmain.yml
 โ”ฃ ๐Ÿ“‚mudig
 โ”ƒ โ”ฃ ๐Ÿ“‚__pycache__
 โ”ƒ โ”ฃ ๐Ÿ“œasgi.py
 โ”ƒ โ”ฃ ๐Ÿ“œsettings.py
 โ”ƒ โ”ฃ ๐Ÿ“œurls.py
 โ”ƒ โ”ฃ ๐Ÿ“œwsgi.py
 โ”ƒ โ”— ๐Ÿ“œ__init__.py
 โ”ฃ ๐Ÿ“‚playlist
 โ”ƒ โ”ฃ ๐Ÿ“‚migrations
 โ”ƒ โ”ฃ ๐Ÿ“‚__pycache__
 โ”ƒ โ”ฃ ๐Ÿ“œadmin.py
 โ”ƒ โ”ฃ ๐Ÿ“œapps.py
 โ”ƒ โ”ฃ ๐Ÿ“œgpt.py
 โ”ƒ โ”ฃ ๐Ÿ“œkarlo.py
 โ”ƒ โ”ฃ ๐Ÿ“œmodels.py
 โ”ƒ โ”ฃ ๐Ÿ“œplaylist_utill.py
 โ”ƒ โ”ฃ ๐Ÿ“œprompt.py
 โ”ƒ โ”ฃ ๐Ÿ“œserializers.py
 โ”ƒ โ”ฃ ๐Ÿ“œtests.py
 โ”ƒ โ”ฃ ๐Ÿ“œuploads.py
 โ”ƒ โ”ฃ ๐Ÿ“œurls.py
 โ”ƒ โ”ฃ ๐Ÿ“œviews.py
 โ”ƒ โ”ฃ ๐Ÿ“œyoutube.py
 โ”ƒ โ”— ๐Ÿ“œ__init__.py
 โ”ฃ ๐Ÿ“‚user
 โ”ƒ โ”ฃ ๐Ÿ“‚migrations
 โ”ƒ โ”ฃ ๐Ÿ“‚templates
 โ”ƒ โ”ƒ โ”— ๐Ÿ“‚user
 โ”ƒ โ”ƒ โ”ƒ โ”— ๐Ÿ“œemail_template.html
 โ”ƒ โ”ฃ ๐Ÿ“‚__pycache__
 โ”ƒ โ”ฃ ๐Ÿ“œadmin.py
 โ”ƒ โ”ฃ ๐Ÿ“œapps.py
 โ”ƒ โ”ฃ ๐Ÿ“œmodels.py
 โ”ƒ โ”ฃ ๐Ÿ“œserializers.py
 โ”ƒ โ”ฃ ๐Ÿ“œtests.py
 โ”ƒ โ”ฃ ๐Ÿ“œurls.py
 โ”ƒ โ”ฃ ๐Ÿ“œutils.py
 โ”ƒ โ”ฃ ๐Ÿ“œviews.py
 โ”ƒ โ”— ๐Ÿ“œ__init__.py
 โ”ฃ ๐Ÿ“œ.gitignore
 โ”ฃ ๐Ÿ“œmanage.py
 โ”ฃ ๐Ÿ“œREADME.md
 โ”— ๐Ÿ“œrequirements.txt

3.6. ๊ฐœ๋ฐœ ์ผ์ •

3.6.1. ๊ฐœ๋ฐœ ์ผ์ •

๊ฐœ๋ฐœ ๊ธฐ๊ฐ„
  • 2023.11.03 ~ 2023.12.29
ํšŒ์˜๋ก

์Šคํฌ๋ฆฐ์ƒท 2023-12-17 220226

์ผ์ • ๊ด€๋ฆฌ

์Šคํฌ๋ฆฐ์ƒท 2023-12-25 143942 ์Šคํฌ๋ฆฐ์ƒท 2023-12-25 143950

3.7. Git Branch ์ „๋žต

Stable - Main (release) - Develop - ์ž‘์—…์ž๋ณ„ Branch

3.7.1. ๊ฐ ๋ธŒ๋žœ์น˜๋ณ„ ์„ค๋ช…

1. Stable : ์„œ๋ฒ„ ๋ฐฐํฌ ๋‹จ๊ณ„์—์„œ ์•ˆ์ •ํ™”๋œ ๋ฒ„์ „
2. Main : ์„œ๋ฒ„ ๋ฐฐํฌ ๋‹จ๊ณ„
3. Develop : ๊ฐ ์ž‘์—…์ž๋ณ„ ๋ธŒ๋žœ์น˜์—์„œ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ํ›„ ๋ณ‘ํ•ฉ ๋ฐ ๋””๋ฒ„๊น… ์ง„ํ–‰
4. ์ž‘์—…์ž๋ณ„ Branch : ๊ฐ์ž ๋งก์€ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ

3.7.2. ์ž‘์—… ํ๋ฆ„

  1. ์ž‘์—…์ž๋ณ„ Branch ์ƒ์„ฑ ํ›„ ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ ์ง„ํ–‰
  2. Develop Branch๋กœ Push
  3. Develop Branch ๋ณ‘ํ•ฉ ํ›„ ๋””๋ฒ„๊น… ์ง„ํ–‰
  4. Develop์—์„œ ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— Push
  5. ์„œ๋ฒ„ ๋ฐฐํฌ ์ง„ํ–‰

4. ๊ธฐ๋Šฅ

์ด๋ฉ”์ผ ํšŒ์›๊ฐ€์ž… ์นด์นด์˜ค ํšŒ์›๊ฐ€์ž… ๊ตฌ๊ธ€ ํšŒ์›๊ฐ€์ž…
์ด๋ฉ”์ผ ๋กœ๊ทธ์ธ ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ตฌ๊ธ€ ๋กœ๊ทธ์ธ
๋กœ๊ทธ์•„์›ƒ ํšŒ์›ํƒˆํ‡ด ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ
ํŒ”๋กœ์šฐ ์–ธํŒ”๋กœ์šฐ ํŒ”๋กœ์šฐ ํŒ”๋กœ์ž‰ ๋ชฉ๋ก ์•„๋” ํ”„๋กœํ•„
๋งˆ์ด ํŽ˜์ด์ง€ ํ”„๋กœํ•„ ์ˆ˜์ • ๋ฉ”์ธ ํŽ˜์ด์ง€
ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์‚ญ์ œ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ƒ์„ธ๋ณด๊ธฐ
ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ˆ˜์ • ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ข‹์•„์š” ์ด๋ฒคํŠธ ํ”Œ๋ฆฌ ์ƒ์„ฑ
ํ”Œ๋ฆฌ/๋ฎค์ง/์œ ์ € ๊ฒ€์ƒ‰ ๋Œ“๊ธ€ CRUD ๋Œ€๋Œ“๊ธ€ CRUD
๋žœ๋ค ๋ฎค๋น„ ๊ณก ์ถ”๊ฐ€ ์Šคํ”Œ๋ž˜์‰ฌ

5. ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉฐ

5.1. ๋ฐฐ์šด ์ 

5.1.1 OpenAPI Specification

OpenAPI Specification์ด๋ž€?

OpenAPI Specification์€ ์›น ์„œ๋น„์Šค API๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํ‘œ์ค€ํ™”๋œ ํ˜•์‹์„ ๋งํ•ฉ๋‹ˆ๋‹ค. ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋Š” API ์„ค๋ช…์„ ์ œ๊ณตํ•จ์œผ๋กœ์จ ํด๋ผ์ด์–ธํŠธ ๋ฐ ์„œ๋ฒ„ ๊ฐ„์˜ ํ†ต์‹ ์„ ์šฉ์ดํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

OpenAPI Specification ํŠน์ง•
  1. OpenAPI Specification์€ ์ฃผ๋กœ YAML ๋˜๋Š” JSON ํ˜•์‹์œผ๋กœ ์ž‘์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” API ์„ค๋ช…์„ ์‰ฝ๊ฒŒ ์ž‘์„ฑํ•˜๊ณ  ์ฝ์„ ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  2. OpenAPI Specification์€ API์˜ ์—”๋“œํฌ์ธํŠธ, ๋งค๊ฐœ๋ณ€์ˆ˜, ์‘๋‹ต ํ˜•์‹ ๋“ฑ์„ ๋ฌธ์„œํ™”ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ API๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋Š”์ง€ ์ดํ•ดํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  3. OpenAPI Specification์€ ์ฃผ๋กœ RESTful API๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” HTTP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•˜๋Š” ์›น ์„œ๋น„์Šค๋ฅผ ์œ„ํ•œ ํ‘œ์ค€์ ์ธ ๋””์ž์ธ ์›์น™์„ ๋”ฐ๋ฅด๋Š” API๋ฅผ ์„ค๊ณ„ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.
  4. OpenAPI Specification์„ ์‚ฌ์šฉํ•˜๋ฉด API๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ํ•„์š”ํ•œ ์„œ๋ฒ„ ๋ฐ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ API๋ฅผ ๋” ์‰ฝ๊ฒŒ ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ค๋‹ˆ๋‹ค.
  5. ๋‹ค์–‘ํ•œ ๋„๊ตฌ์™€ ํ”„๋ ˆ์ž„์›Œํฌ์—์„œ OpenAPI Specification์„ ํ™œ์šฉํ•˜์—ฌ API๋ฅผ ์ž๋™์œผ๋กœ ๋ฌธ์„œํ™”ํ•˜๊ณ  ํ…Œ์ŠคํŠธํ•˜๋Š” ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ €ํฌ ์„œ๋น„์Šค์˜ ๊ฒฝ์šฐ Swagger๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  6. OpenAPI Specification์€ API์˜ ๋ฒ„์ „์„ ๊ด€๋ฆฌํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. API๊ฐ€ ์—…๋ฐ์ดํŠธ๋˜๋ฉด ์ƒˆ๋กœ์šด ๋ฒ„์ „์˜ ๋ช…์„ธ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ์ด์ „ ๋ฐ ํ˜„์žฌ ๋ฒ„์ „ ๊ฐ„์˜ ์ฐจ์ด๋ฅผ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

OpenAPI Specification์€ API ์„ค๊ณ„, ๋ฌธ์„œํ™”, ๊ตฌํ˜„, ํ…Œ์ŠคํŠธ ๋ฐ ์œ ์ง€ ๋ณด์ˆ˜๋ฅผ ํšจ๊ณผ์ ์œผ๋กœ ์ง€์›ํ•˜๋Š” ํ‘œ์ค€ํ™”๋œ ๋ฐฉ๋ฒ•์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํŒ€ ๊ฐ„์˜ ํ˜‘์—…์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ณ  ๊ฐœ๋ฐœ์ž๊ฐ€ API๋ฅผ ๋น ๋ฅด๊ฒŒ ์ดํ•ดํ•˜๊ณ  ํšจ๊ณผ์ ์œผ๋กœ ํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ๋•๋Š” ์—ญํ• ์„ ํ•ฉ๋‹ˆ๋‹ค.

5.1.2 CI/CD

์ง€์†์ ์ธ ํ†ตํ•ฉ๊ณผ ์ง€์†์ ์ธ ๋ฐฐํฌ (CI/CD, Continuous Integration/Continuous Deployment)๋ž€

CI/CD (Continuous Integration/Continuous Delivery)๋ž€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๊ฐœ๋ฐœ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜์—ฌ ๋น ๋ฅธ ์ฃผ๊ธฐ๋กœ ๊ณ ๊ฐ์—๊ฒŒ ์„œ๋น„์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ๋งํ•ฉ๋‹ˆ๋‹ค. CI/CD์˜ ๊ธฐ๋ณธ ๊ฐœ๋…์€ ์ง€์†์ ์ธ ํ†ตํ•ฉ, ์ง€์†์ ์ธ ์„œ๋น„์Šค ์ œ๊ณต, ์ง€์†์ ์ธ ๋ฐฐํฌ์ž…๋‹ˆ๋‹ค. ํŠนํžˆ, CI/CD๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ํ†ตํ•ฉ ๋ฐ ํ…Œ์ŠคํŠธ ๋‹จ๊ณ„์—์„œ๋ถ€ํ„ฐ ์ œ๊ณต ๋ฐ ๋ฐฐํฌ์— ์ด๋ฅด๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ๋ผ์ดํ”„์‚ฌ์ดํด ์ „์ฒด์— ๊ฑธ์ณ ์ง€์†์ ์ธ ์ž๋™ํ™”์™€ ์ง€์†์ ์ธ ๋ชจ๋‹ˆํ„ฐ๋ง์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ง€์†์ ์ธ ํ†ตํ•ฉ (Continuous Integration, CI)

CI๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด, ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ๋ฅผ ์ž๋™ํ™” ํ•˜๋Š” ๊ณผ์ •์„ ๋งํ•˜๋ฉฐ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์ง€์†์ ์ธ ํ†ตํ•ฉ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ ๋‹จ์œ„๋ณ„๋กœ ๊ตฌํ˜„ํ•œ ๋ถ€๋ถ„์„ ๋ณ‘ํ•ฉํ•  ๋•Œ๋งˆ๋‹ค ์ž๋™ํ™”๋œ ๋นŒ๋“œ์™€ ํ…Œ์ŠคํŠธ ์‹คํ–‰๋˜๋ฉฐ, ๊ทธ ๊ฒฐ๊ณผ๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๋ถ€๋ถ„์—์„œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š”์ง€ ๋ฐฐํฌ ์ „์— ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

CI ์ˆœ์„œ

  1. ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ตฌํ˜„ํ•œ ์ฝ”๋“œ๋ฅผ ๊ธฐ์กด ์ฝ”๋“œ์™€ ๋ณ‘ํ•ฉ ( ์šฐ๋ฆฌ์˜ Mudig์˜ ๊ฒฝ์šฐ ๊ฐœ๋ฐœ์ž๋ณ„ Branch์—์„œ Develop Branch์—์„œ ๋ณ‘ํ•ฉ ์ง„ํ–‰, ๋กœ์ปฌ ํ…Œ์ŠคํŒ… ํ›„ Main์— ๋ณ‘ํ•ฉ์„ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.)
  2. ๋ณ‘ํ•ฉ๋œ ์ฝ”๋“œ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ๋™์ž‘ํ•˜๊ณ  ๋นŒ๋“œ๋˜๋Š”์ง€ ๊ฒ€์ฆ
  3. ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋‹ค์‹œ 1๋ฒˆ ๊ณผ์ • ์ง„ํ–‰ , ๋ฌธ์ œ๊ฐ€ ์—†๋‹ค๋ฉด ๋ฐฐํฌ

Github Action์„ ํ™œ์šฉํ•œ CI ๊ตฌํ˜„

๊ตฌํ˜„ ์ฝ”๋“œ

CI:
  runs-on: ubuntu-latest
  env:
    DJAGNO_SECRET: ${{ secrets.DJAGNO_SECRET }}
  strategy:
    max-parallel: 4
    matrix:
      python-version: ["3.10"]
  steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run Tests
      run: |
        python manage.py test
์ง€์†์ ์ธ ๋ฐฐํฌ (Continuous Deployment, CD)

CD๋ฅผ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งํ•˜์ž๋ฉด, ๋ฐฐํฌ ์ž๋™ํ™” ๊ณผ์ •์„ ๋งํ•˜๋ฉฐ ์ง€์†์ ์ธ ๋ฐฐํฌ๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ, CI๋ฅผ ํ†ตํ•ด์„œ ์ƒˆ๋กœ์šด ์†Œ์Šค์ฝ”๋“œ์˜ ๋นŒ๋“œ์™€ ํ…Œ์ŠคํŠธ ๋ณ‘ํ•ฉ๊นŒ์ง€ ์„ฑ๊ณต์ ์œผ๋กœ ์ง„ํ–‰๋ฌ์„ ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐํฌํ™˜๊ฒฝ๊นŒ์ง€ ๋ฆด๋ฆฌ์ฆˆ ํ•˜๋Š” ๊ฒƒ์„ ๋งํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

CD ์ˆœ์„œ

  1. CI๋ฅผ ํ†ตํ•ด ์ƒˆ๋กœ์šด ์†Œ์Šค์ฝ”๋“œ์˜ ๋นŒ๋“œ์™€ ํ…Œ์ŠคํŠธ ๋ณ‘ํ•ฉ๊นŒ์ง€ ์„ฑ๊ณต
  2. ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฐํฌํ™˜๊ฒฝ์— ๋ฆด๋ฆฌ์ฆˆ

Github Action์„ ํ™œ์šฉํ•œ CD ๊ตฌํ˜„

๊ตฌํ˜„ ์ฝ”๋“œ

deploy:
  needs: CI
  name: Deploy
  runs-on: ubuntu-latest

  if: success()
  steps:
    - name: executing remote ssh commands using password
      uses: appleboy/ssh-action@master # appleboy๋ฅผ ํ†ตํ•ด ์™ธ๋ถ€ ์„œ๋ฒ„์—์„œ ssh ์ ‘์† ํ›„ ์ปค๋งจ๋“œ ์‹คํ–‰
      with:
        host: ${{ secrets.AWS_HOST }} # AWS ํ˜ธ์ŠคํŠธ
        username: ${{ secrets.AWS_USERNAME }} # AWS USERNAME
        key: ${{ secrets.AWS_PEM_KEY }} # AWS PEM KEY
        port: ${{ secrets.AWS_PORT }} # AWS SSH PORT
        script_stop: true
        script: |
          whoami # ํ˜„์žฌ ๋‚ด๊ฐ€ ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž์˜ ์ •๋ณด๋ฅผ ์ถœ๋ ฅ ํ•ฉ๋‹ˆ๋‹ค.
          ls -al # ํ˜„์žฌ์˜ ๋””๋ ‰ํ† ๋ฆฌ์•ˆ์˜ ํŒŒ์ผ ๋ชฉ๋ก์„ ์ถœ๋ ฅํ•˜์—ฌ ๋ณด์—ฌ์ฃผ๋Š” ๋ช…๋ น์–ด ์ž…๋‹ˆ๋‹ค.
          cd Mudig_BE/ # ๋ฎค๋”•์ด ์„ค์น˜๋œ ํด๋”๋กœ ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค.
          /home/ubuntu/publish/pull_repository.sh # ์‚ฌ์ „์— ์ •์˜๋œ ์‰˜์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

5.1.3 RESTfull API

REST API๋ž€

REST์˜ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” API๋ฅผ ๋งํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ’ก REST๋ž€
1. HTTP URI๋ฅผ ํ†ตํ•ด ์ž์›์„ ๋ช…์‹œํ•˜๊ณ 
2. HTTP Method(Post,Get,Put,Delete)๋ฅผ ํ†ตํ•ด
3. ํ•ด๋‹น ์ž์›์— ๋Œ€ํ•œ *CRUD Operation์„ ์ ์šฉํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

Rest์˜ ๊ตฌ์„ฑ ์š”์†Œ

  1. ์ž์› : HTTP URI
  2. ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„ : HTTP Method
  3. ์ž์›์— ๋Œ€ํ•œ ํ–‰์œ„์˜ ๋‚ด์šฉ : HTTP Message Pay Load

CRUD Operation

์ปดํ“จํ„ฐ ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ๊ฐ€์ง€๋Š” ๊ธฐ๋ณธ์ ์ธ ๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ๊ธฐ๋Šฅ์„ ๋ฌถ์–ด์„œ ์ผ์ปซ๋Š” ๋ง์ž…๋‹ˆ๋‹ค.
REST API ์„ค๊ณ„
  1. URI๋Š” ๋™์‚ฌ๋ณด๋‹ค๋Š” ๋ช…์‚ฌ, ๋Œ€๋ฌธ์ž๋ณด๋‹ค๋Š” ์†Œ๋ฌธ์ž
  2. ๋งˆ์ง€๋ง‰์— ์Šฌ๋ž˜์‹œ๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  3. ์–ธ๋”๋ฐ” ๋Œ€์‹  ํ•˜์ดํฐ
  4. ํŒŒ์ผํ™•์žฅ์ž๋Š” ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
  5. ํ–‰์œ„๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š๋Š”๋‹ค.
์žฅ์ 

REST API ๋ฉ”์‹œ์ง€๊ฐ€ ์˜๋„ํ•˜๋Š” ๋ฐ”๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋‚˜ํƒ€๋‚ด๋ฏ€๋กœ ๊ทธ ์˜๋„๋ฅผ ์‰ฝ๊ฒŒ ํŒŒ์•…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ์˜ ์—ญํ• ์„ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

RESTful

REST์˜ ์›๋ฆฌ๋ฅผ ๋”ฐ๋ฅด๋Š” ์‹œ์Šคํ…œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. REST API์˜ ์„ค๊ณ„ ๊ทœ์น™์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง€ํ‚จ ์‹œ์Šคํ…œ์„ RESTful ํ•˜๋‹ค ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํŠน์ง•

  1. ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๊ตฌ์กฐ
  2. Stateless
  3. Cacheable (์บ์‹œ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ)
  4. ๊ณ„์ธตํ™”
  5. ์ธํ„ฐํŽ˜์ด์Šค์˜ ์ผ๊ด€์„ฑ

5.1.4 OAuth

OAuth(Open Authorization)๋ž€

OAuth(Open Authorization)์€ ์›น ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋ณด์•ˆ ํ”„๋กœํ† ์ฝœ๋กœ, ์ธํ„ฐ๋„ท ์‚ฌ์šฉ์ž์˜ ๋ฐ์ดํ„ฐ ๋ฐ ์„œ๋น„์Šค๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ์ œ3์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์ œ๊ณตํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์„œ๋น„์Šค๋‚˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์˜ ์ ‘๊ทผ์„ ํ—ˆ์šฉํ•˜๋Š” ์ธ์ฆ ๋ฐ ๊ถŒํ•œ ๋ถ€์—ฌ ํ”„๋ ˆ์ž„์›Œํฌ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

OAuth์˜ ๊ตฌ์„ฑ ์š”์†Œ

  1. Resource Owner : ๋ง ๊ทธ๋Œ€๋กœ ๋ฆฌ์†Œ์Šค ์†Œ์œ ์ž์ด๋ฉฐ, ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ์šฉ์ž ์ž…๋‹ˆ๋‹ค.
  2. Resource Server : ์‚ฌ์šฉ์ž์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ํด๋ผ์ด์–ธํŠธ์— ์ œ๊ณตํ•ด์ฃผ๋Š” ์„œ๋ฒ„๋กœ, ๊ตฌ๊ธ€์ด๋‚˜ ํŽ˜์ด์Šค๋ถ๊ณผ ๊ฐ™์€ ํ”Œ๋žซํผ์„ ์ƒ๊ฐํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  3. Client : ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•˜๋ ค๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž…๋‹ˆ๋‹ค
  4. Authorization Server : ํด๋ผ์ด์–ธํŠธ๊ฐ€ ๋ฆฌ์†Œ์Šค ์„œ๋ฒ„์— ์žˆ๋Š” ๋ฆฌ์†Œ์Šค์— ์ ‘๊ทผํ•  ๋•Œ ํ•„์š”ํ•œ Access Token์„ ์ œ๊ณตํ•˜๋Š” ์„œ๋ฒ„์ž…๋‹ˆ๋‹ค.

5.2. ๋Š๋‚€ ์ 

๊ฐ•ํ˜„์šฐ

์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ๊ธฐํš์˜ ์ค‘์š”์„ฑ์— ๋Œ€ํ•ด์„œ ํฌ๊ฒŒ ๊นจ๋‹ซ๊ฒŒ ๋œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐํš์˜ ์™„์„ฑ๋„๊ฐ€ ๊ฐœ๋ฐœ ์ง„ํ–‰ ์†๋„์— ๋งŽ์€ ๊ด€์—ฌ๋ฅผ ํ•œ๋‹ค๋Š” ๊ฑธ ๋Š๋‚€ ํ”„๋กœ์ ํŠธ ์˜€์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ, ๋””์ž์ด๋„ˆ ๋ถ„๋“ค๊ณผ ํ˜‘์—…ํ•  ์ˆ˜ ์žˆ์—ˆ๋˜ ์ข‹์€ ๊ธฐํšŒ์˜€์Šต๋‹ˆ๋‹ค. ๋งค์ฃผ ํšŒ์˜๋ฅผ ํ†ตํ•ด ์„œ๋กœ ํ•„์š”ํ•œ ๋ถ€๋ถ„์— ๋Œ€ํ•ด์„œ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๊ณ  ์˜ค๋ฅ˜๋ฅผ ๊ฐ™์ด ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ€๋Š” ์ฆ๊ฑฐ์šด ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ถ”ํ›„์— ๋‹ค๋ฅธ ๊ฐœ๋ฐœ์ž๋ถ„, ๋””์ž์ด๋„ˆ๋ถ„๋“ค๊ณผ ์˜์‚ฌ์†Œํ†ต์„ ํ•˜๋”๋ผ๋„ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฒฝํ—˜์‚ผ์•„ ์˜์‚ฌ์†Œํ†ต์„ ์ž˜ ์ด์–ด๋‚˜๊ฐˆ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋Š” ์ฒ˜์Œ์œผ๋กœ ๋„์ž…ํ•˜๋Š” ๊ธฐ์ˆ ๋“ค์ด ์—ฌ๋Ÿฌ๊ฐœ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Open Api Specification๋ฅผ ํ†ตํ•ด API ๋ฌธ์„œ ์ž๋™ํ™”๋ฅผ ๋„์ž…ํ•œ๋‹ค๋˜๊ฐ€ Github Action์„ ํ†ตํ•œ CI/CD ๊ตฌํ˜„ ๋“ฑ๋“ฑ ์ฒ˜์Œ ๋‹ค๋ฃจ๋Š” ๊ธฐ์ˆ ๋“ค์ด๋ผ ์กฐ๊ธˆ ๋งŽ์ด ์„œํˆด์—ˆ์ง€๋งŒ, Open Api Specification์„ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„๋“ค์ด ๋„ˆ๋ฌด ์ž˜์‚ฌ์šฉํ•ด์ฃผ์…”์„œ ์—„์ฒญ๋‚œ ๋ฟŒ๋“ฏํ•จ์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ๋”์šฑ ๋” ์„ฑ์žฅํ•˜๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ๋˜๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฑ์—”๋“œ ์ด๊ด„์ด๋ผ๋Š” ์—ญํ• ๋กœ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ด๋Œ์—ˆ์ง€๋งŒ ๋งŽ์ด ๋ถ€์กฑํ•œ ์ €๋ฅผ ๋„ˆ๋ฌด๋‚˜๋„ ์ž˜ ๋”ฐ๋ผ์ฃผ์…”์„œ ๊ฐ์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ €์™€ ํ•จ๊ป˜ ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•ด์ฃผ์‹  ์šฐ๋ฆฌ ๋ฎค๋”•ํŒ€ ๋ถ„๋“ค!! ํ”„๋ก ํŠธ, ๋ฐฑ์—”๋“œ, ๋””์ž์ด๋„ˆ๋ถ„๋“ค ๋„ˆ๋ฌด๋‚˜๋„ ๊ณ ์ƒ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๊น€์—ฌ์ฃผ

์ด๋ฒˆ Mudig ํ”„๋กœ์ ํŠธ๋ฅผ ํ†ตํ•ด ์›ํ™œํ•œ ์˜์‚ฌ์†Œํ†ต์˜ ์ค‘์š”์„ฑ๊ณผ ํŒ€์›Œํฌ์˜ ํž˜์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งค์ฃผ ํšŒ์˜๋ฅผ ํ†ตํ•œ ์†Œํ†ต์€ ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋Š”๋ฐ ๋ณ€์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์‹ ์†ํ•œ ํ•ด๊ฒฐ์„ ๊ฐ€๋Šฅ์ผ€ ํ•˜์˜€๊ณ , ์ด๋Š” ๊ธฐํš์˜ ์™„์„ฑ๋„๋ฅผ ๋†’์ด๋Š” ์ค‘์š”ํ•œ ๊ณผ์ •์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ์ƒํ™ฉ, ์ž‘์—… ์ผ์ •, ์˜ค๋ฅ˜ ๋“ฑ์„ ์†Œํ†ตํ•จ์œผ๋กœ์จ ๊ธฐํš์„ ๋ณด๋‹ค ์„ธ๋ฐ€ํ•˜๊ฒŒ ๊ณ„ํšํ•˜๊ณ  ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๋งก์€ ๊ธฐ๋Šฅ์€ ์ด์ „์— ์‹œ๋„ํ•ด๋ณด์ง€ ์•Š์•˜๋˜ ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์ธ, ์†Œ์…œ๋กœ๊ทธ์ธ(์นด์นด์˜ค, ๊ตฌ๊ธ€), ์ด๋ฉ”์ผ ์ธ์ฆ๋ฒˆํ˜ธ, ๋น„๋ฐ€๋ฒˆํ˜ธ ๋ณ€๊ฒฝ, ํšŒ์›ํƒˆํ‡ด ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๋กœ์ง์˜ ํ๋ฆ„์„ ์ •ํ™•ํžˆ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๊ธฐ๋Šฅ์—์„œ ๋””ํ…Œ์ผํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ด ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์•˜์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€, ๋‹‰๋„ค์ž„, ์†Œ๊ฐœ, ์žฅ๋ฅด ๋“ฑ์„ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅํ•  ๋•Œ ์ด๋ฏธ์ง€์˜ ์กด์žฌ ์—ฌ๋ถ€์™€ ์ž˜๋ชป๋œ ์ •๋ณด์— ๋Œ€ํ•œ ์ฒ˜๋ฆฌ ๋“ฑ ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„์„ ๊ณ ๋ คํ•˜์—ฌ ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋ก ํŠธ์—”๋“œ ํŒ€๊ณผ์˜ ์˜์‚ฌ์†Œํ†ต์„ ํ†ตํ•ด ํ”„๋ก ํŠธ์—”๋“œ์—์„œ ๋ณด์—ฌ์งˆ ์‘๋‹ต ๋ฉ”์‹œ์ง€์™€ ๋””ํ…Œ์ผํ•œ ๋ถ€๋ถ„๋„ ๊ณ ๋ คํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ํŒ€๊ณผ์˜ ํ˜‘์—…์„ ํ†ตํ•ด ์ฝ”๋“œ ์ˆ˜์ • ์‚ฌํ•ญ์„ ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•˜๊ณ  ๋ฐ˜์˜ํ•  ์ˆ˜ ์žˆ์—ˆ์œผ๋ฉฐ, ์ด๋Ÿฌํ•œ ๋น ๋ฅธ ํ”ผ๋“œ๋ฐฑ๊ณผ ํ˜‘์—…์€ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ํ–ฅ์ƒ์‹œํ‚ค๊ณ  ์™„์„ฑ๋„๋ฅผ ๋†’์ผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ๋งก๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ๊ฑฑ์ •์ด ์žˆ์—ˆ์ง€๋งŒ, ์–ด๋ ค์› ๋˜ ๋ถ€๋ถ„์—์„œ ์ž์‹ ์˜ ํŒŒํŠธ๊ฐ€ ์•„๋‹˜์—๋„ ๊ฐ™์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ๋Š” ํŒ€์›๋“ค์ด ์žˆ์—ˆ๊ธฐ์— ์ž์‹ ๊ฐ์„ ๊ฐ€์ง€๊ณ  ๋๊นŒ์ง€ ํ”„๋กœ์ ํŠธ๋ฅผ ๋งˆ๋ฌด๋ฆฌ ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ฐฑ์—”๋“œ ํŒ€์›๋“ค ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค !! ๋งˆ์ง€๋ง‰์œผ๋กœ ๋””์ž์ด๋„ˆ ํŒ€, ํ”„๋ก ํŠธ์—”๋“œ ํŒ€, ๋ฐฑ์—”๋“œ ํŒ€ Mudig ๊ตฌ์„ฑ์› ๋ชจ๋‘ ์ˆ˜๊ณ ํ•˜์…จ๊ณ  ํ”„๋กœ์ ํŠธ ํ•˜๋Š” ๋™์•ˆ ํ–‰๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค !!

์‚ฌ์ˆ˜๋ด‰

์ด๋ฒˆ ๋ฎค๋”• ํ”„๋กœ์ ํŠธ๋ฅผ ๋””์ž์ด๋„ˆ, ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„๋“ค๊ณผ ํ•จ๊ป˜ ์ง„ํ–‰ํ•˜๋ฉด์„œ ํ˜‘์—…์€ ์†Œํ†ต์ด ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ๋งค์ฃผ ๋‹ค ๊ฐ™์ด ๋ชจ์—ฌ์„œ ํšŒ์˜๋ฅผ ๊ฐ™์ด ์ง„ํ–‰ํ•ด๋„ ๊ธฐ๋Šฅ ํ•˜๋‚˜ํ•˜๋‚˜๋ฅผ ๋งŒ๋“ค์–ด๊ฐ€๋Š” ๊ณผ์ •์—์„œ๋Š” ๋น ๋ฅธ ์†Œํ†ต๊ณผ ํ”ผ๋“œ๋ฐฑ์ด ํ•„์š”ํ–ˆ๋Š”๋ฐ ์ฒ˜์Œ์—๋Š” ์ด ๋ถ€๋ถ„์ด ์‰ฝ์ง€ ์•Š์•˜์ง€๋งŒ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„ํ–‰๋ ์ˆ˜๋ก ์„œ๋กœ์˜ ํŒŒํŠธ์— ์ดํ•ด๋„๊ฐ€ ์ƒ๊ธฐ๋ฉด์„œ ์œ ์—ฐํ•˜๊ฒŒ ์ž‘์—…์„ ์ง„ํ–‰ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ž์„ธํ•œ ๊ธฐํš์˜ ์ค‘์š”์„ฑ์„ ์•Œ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์™„๋ฒฝํ•ด ๋ณด์˜€๋˜ ๊ธฐํš์ด ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๋ฉด์„œ ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜์ •๋˜๋Š” ๊ฑธ ๊ฒฝํ—˜ํ•˜๋ฉด์„œ ์ฒ˜์Œ๋ถ€ํ„ฐ ์™„๋ฒฝํ•˜์ง„ ์•Š์•„๋„ ๋””ํ…Œ์ผํ•œ ์š”์†Œ๋“ค์„ ์ž์„ธํ•˜๊ฒŒ ๊ธฐํšํ•˜๋Š” ๊ฒƒ์ด ์ดˆ๋ฐ˜์—๋Š” ์‹œ๊ฐ„์ด ์†Œ์š”๋˜๋”๋ผ๋„ ๊ธธ๊ฒŒ ๋ณด๋ฉด ํšจ์œจ์ ์ธ ์ง„ํ–‰ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.์ด๋ฒˆ ํ”„๋กœ์ ํŠธ์—์„œ ๊ฒ€์ƒ‰๊ณผ ๋Œ“๊ธ€๊ณผ ๋Œ€๋Œ“๊ธ€ CRUD, ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ข‹์•„์š” ๊ธฐ๋Šฅ์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋˜์—ˆ๋Š”๋ฐ ์ฒ˜์Œ์—๋Š” ์ง€๋‚œ ํ”„๋กœ์ ํŠธ ๊ฐœ๋ฐœ ์ฝ”๋“œ๋“ค๊ณผ ๋ณ„๋‹ค๋ฅผ ๊ฒŒ ์—†์„ ๊ฑฐ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๋ง‰์ƒ ์ž‘์—…์„ ์ง„ํ–‰ํ• ์ˆ˜๋ก ๊ฐ™์€ ๋ฉ”์†Œ๋“œ๋ฅผ ๋น„์Šทํ•œ ๊ธฐ๋Šฅ์— ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋””ํ…Œ์ผ์ด ๋งค์šฐ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์„ ์ƒˆ์‚ผ ๋Š๊ผˆ์Šต๋‹ˆ๋‹ค.๋””์ž์ด๋„ˆ, ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„๋“ค๊ณผ ํ˜‘์—…ํ•œ ํ”„๋กœ์ ํŠธ๋Š” ์ด๋ฒˆ์ด ์ฒ˜์Œ์ธ๋ฐ ๋„ˆ๋ฌด๋‚˜๋„ ๋›ฐ์–ด๋‚˜์‹  ํŒ€์›๋ถ„๋“ค์„ ๋งŒ๋‚˜์„œ ์ œ ๋Šฅ๋ ฅ ์ด์ƒ์˜ ๊ฒฐ๊ณผ๋ฌผ์„ ๋งŒ๋‚  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถ€์กฑํ•œ ์ œ ์‹ค๋ ฅ์—๋„ ๋ฉ‹์ง„ ํ”„๋กœ์ ํŠธ์˜ ๋งˆ์ง€๋ง‰๊นŒ์ง€ ์™„์ฃผํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋„์™€์ฃผ์‹  ๋ชจ๋‘ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์‹ฌ๋ฏผ์ •

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

์ œ๊ฐ€ ๋งก์€ ํฌ์ง€์…˜์€ ํ”„๋กœํ•„ CRUD, ํŒ”๋กœ์šฐ ๊ธฐ๋Šฅ, ์กฐํšŒ ๊ธฐ๋Šฅ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ ํฌ์ง€์…˜์„ ๋ถ„๋ฐฐํ•  ๋•Œ ์ „์— ํ•ด๋ดค๋˜ ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…์„ ํ•˜๋ ค๊ณ  ํ–ˆ์œผ๋‚˜, ํŒ€์›๋“ค์˜ ๊ถŒ์œ ์™€ ์ƒˆ๋กœ์šด ๊ฒƒ์— ๋„์ „ํ•˜๋Š” ๊ฒƒ์ด ์ข€ ๋” ํฅ๋ฏธ๋กญ๊ณ  ์„ฑ์žฅํ•˜๋Š”๋ฐ ๋„์›€์ด ๋  ๊ฒƒ ๊ฐ™์•„ ์œ„์™€ ๊ฐ™์€ ํฌ์ง€์…˜์„ ๋งก์•˜์Šต๋‹ˆ๋‹ค.

์–ด๋ ค์› ๋˜ ์ ์€ ํ”„๋กœํ•„ ์ˆ˜์ •๋ถ€๋ถ„์—์„œ ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ ๋ฐฉ์‹์„ ์žฅ๊ณ  s3์— ์ €์žฅํ•˜๋„๋ก ํ–ˆ๋Š”๋ฐ ์ด ๋ถ€๋ถ„์€ ํŒ€์›๋ถ„์˜ ๋„์›€์ด ์—†์—ˆ์œผ๋ฉด ์‚ฌ์šฉํ•˜์ง€ ๋ชปํ–ˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด์ค„๋•Œ๋„ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„๋“ค์˜ ์š”๊ตฌ์— ๋ถ€ํ•ฉํ•˜๋„๋ก ๋Š์ž„์—†๋Š” ์ˆ˜์ •์ž‘์—…์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Ÿฌํ•œ ์–ด๋ ค์šด ์ ์€ ๋งค ์ฃผ ํšŒ์˜๋ฅผ ํ†ตํ•œ ์˜๊ฒฌ์†Œํ†ต๊ณผ ํ•ฉ์˜์ ์„ ์ฐพ์•„๊ฐ€๋ฉด์„œ ์ ์ฐจ ๋งž์ถฐ๋‚˜๊ฐ€๋Š” ๊ณผ์ •์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ํž˜ ๋“ค๊ธฐ๋ณด๋‹ค๋Š” ์˜คํžˆ๋ ค ์ˆ˜์ • ํ›„ ์›ํ•˜๋Š” ๋ฐฉํ–ฅ๋Œ€๋กœ ์ฝ”๋“œ๊ฐ€ ๋™์ž‘ํ•˜๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ๋ฌผ์ด ๋ชจ์–‘์„ ๊ฐ–์ถฐ๋‚˜๊ฐ€๋Š” ๋ถ€๋ถ„์—์„œ ํฐ ํฌ์—ด๊ฐ๊ณผ ์ฆ๊ฑฐ์›€์„ ๋Š๋‚„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ง‰ํž ๋•Œ๋งˆ๋‹ค ํ•จ๊ป˜ ํ•ด๊ฒฐํ•ด์ฃผ๋ ค๋˜ ์šฐ๋ฆฌ ๋ฐฑ์—”๋“œ ํŒ€์›๋ถ„๋“ค๊ณผ ์ ๊ทน์ ์œผ๋กœ ์†Œํ†ต ํ•ด์ฃผ์‹  ํ”„๋ก ํŠธ์—”๋“œ, ๋””์ž์ด๋„ˆ๋ถ„๋“ค ์ •๋ง ์ˆ˜๊ณ ๋งŽ์œผ์…จ์Šต๋‹ˆ๋‹ค!

ํ™ฉ๋ด‰์ˆ˜

ํ•ญ์ƒ ํŒ€ ํ”„๋กœ์ ํŠธ๋ฅผ ํ•จ์œผ๋กœ์จ ๋Š๋ผ๋Š” ๊ฑฐ๋Š” ์˜์‚ฌ์†Œํ†ต์˜ ์ค‘์š”์„ฑ์ธ ๊ฑฐ ๊ฐ™๋‹ค. ์ฒ˜์Œ์œผ๋กœ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„๋“ค๊ณผ ๋””์ž์ด๋„ˆ๋ถ„๋“ค๊ณผ ํ˜‘์—…ํ•˜์—ฌ ์ง„ํ–‰ํ•˜์˜€๋Š”๋ฐ ์˜์‚ฌ์†Œํ†ต์ด ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€์ง€๋งŒ ์ƒ๊ฐ๋ณด๋‹ค ๋” ๋งŽ์€ ์˜์‚ฌ์†Œํ†ต์ด ํ•„์š”ํ–ˆ๊ณ , ๊ธฐํš์ž์˜ ์—ญํ•  ๋˜ํ•œ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ๊ธฐํš์ž๊ฐ€ ๋˜์–ด ํ•„์š” ์ˆœ์„œ์— ๋”ฐ๋ผ ์ง„ํ–‰ํ•œ ์ ์€ ๋งŒ์กฑํ•˜๊ณ  ์žˆ๋‹ค. ์ง„ํ–‰ํ•˜๋ฉด์„œ ๋งค์ฃผ ํšŒ์˜ ๋˜ํ•œ ๋งŒ์กฑ์Šค๋Ÿฌ์› ๋‹ค. ํšŒ์˜์™€ ์†Œํ†ต์„ ํ•จ์œผ๋กœ์จ ํ”„๋ก ํŠธ์—”๋“œ ๋ถ„๋“ค๊ณผ ๊ธฐ์ˆ ์ ์œผ๋กœ ํ•„์š”ํ•œ ๋ถ€๋ถ„์„ ์ „๋‹ฌํ•ด์ฃผ๋Š” ๊ณผ์ •์—์„œ ์ฆ๊ฑฐ์›€์„ ์–ป์—ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฑ์—”๋“œ์™€ ํ”„๋ก ํŠธ์—”๋“œ ์—…๋ฌด๋ฅผ ๋‚˜๋ˆ„๋ฉด์„œ ๊ฐ ํŒŒํŠธ๊ฐ€ ์ง๋ฉดํ•˜๋Š” ์–ด๋ ค์›€๊ณผ ์ฆ๊ฑฐ์›€์„ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. API์™€ ์—ฐ๋™ํ•˜๋ฉฐ ๋ฐฑ์—”๋“œ์˜ ์—ญํ• ๊ณผ ํ”„๋ก ํŠธ์—”๋“œ์˜ ๋™์ž‘ ์›๋ฆฌ๋ฅผ ๋” ์ž์„ธํžˆ ์ดํ•ดํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ ์šฐ๋ฆฌ ๋ฐฑ์—”๋“œ ํŒ€, ํ”„๋ก ํŠธ์—”๋“œํŒ€, ๋””์ž์ธํŒ€ ๋‹ค๋“ค ๋„ˆ๋ฌด ๊ณ ์ƒํ•˜์…จ์Šต๋‹ˆ๋‹ค.

6. ์™ธ๋ถ€ ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜

ChatGPT

ChatGPT๋ž€ OpenAI๊ฐ€ ๊ฐœ๋ฐœํ•œ GPT-3.5 ๊ธฐ๋ฐ˜์˜ ย ๋Œ€ํ˜• ์–ธ์–ด ๋ชจ๋ธ(large language model, LLM)ย ์ฑ—๋ด‡์„ ๋œปํ•ฉ๋‹ˆ๋‹ค. ChatGPT๋Š” ๋Œ€ํ™” ํ˜•ํƒœ๋กœ ์ƒํ˜ธ์ž‘์šฉ์„ ํ•˜๋ฉฐ ๋†€๋ผ์šธ ์ •๋„๋กœ ์ธ๊ฐ„๊ณผ ๋Œ€ํ™”ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐ˜์‘์„ ์ œ๊ณตํ•˜๋Š” ๋Šฅ๋ ฅ์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

API ์‚ฌ์šฉ์€ ์œ ๋ฃŒ์ด๋ฉฐ, ๋Œ€ํ™”์— ์‚ฌ์šฉ๋œ ํ† ํฐ(Tokens)์˜ ํฌ๊ธฐ(1,000ํ† ํฐ ๋‹น $0.002(์•ฝ 3์›))์— ๋”ฐ๋ผ ๊ณผ๊ธˆ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ์ œ ์ฝ”๋“œ

import openai

openai.api_key = '${API_KEY}'

# ๋ชจ๋ธ - GPT 3.5 Turbo ์„ ํƒ
model = "gpt-3.5-turbo"
# ์งˆ๋ฌธ ์ž‘์„ฑํ•˜๊ธฐ
query = "Django์— ๋Œ€ํ•ด์„œ ๊ณต๋ถ€๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋Š”๋ฐ, ๊ณ„ํš ์ข€ ์„ธ์›Œ์ค˜"

# ๋ฉ”์‹œ์ง€ ์„ค์ •ํ•˜๊ธฐ
messages = [
    {"role": "system", "content": "๋„ˆ๋Š” ๊ณต๋ถ€ ๊ณ„ํš์„ ์„ธ์›Œ์ฃผ๋Š” ์Šคํ„ฐ๋”” ํ”Œ๋ž˜๋„ˆ์•ผ"},
    {"role": "user", "content": query}
]
# ChatGPT API ํ˜ธ์ถœํ•˜๊ธฐ
response = openai.ChatCompletion.create(
    model=model,
    messages=messages
)
answer = response['choices'][0]['message']['content']

print(answer)

๊ฒฐ๊ณผ

Django์— ๋Œ€ํ•œ ๊ณต๋ถ€ ๊ณ„ํš์„ ์„ธ์›Œ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜๋Š” ์˜ˆ์‹œ์ž…๋‹ˆ๋‹ค.

1. Django ๊ฐœ์š” ๋ฐ ์„ค์น˜
- Django์˜ ๊ฐœ๋…๊ณผ ํŠน์ง•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.
- Django๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์„ ๊ตฌ์ถ•ํ•ฉ๋‹ˆ๋‹ค.

2. Django ๊ธฐ๋ณธ ๊ตฌ์กฐ์™€ ์›น ๊ฐœ๋ฐœ ๊ธฐ์ดˆ
- Django ํ”„๋กœ์ ํŠธ์™€ ์•ฑ์˜ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
- URL ํŒจํ„ด, ๋ทฐ, ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๋‹จํ•œ ์›น ํŽ˜์ด์ง€๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.

3. Django ๋ชจ๋ธ๊ณผ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค
- Django์˜ ๋ชจ๋ธ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค๊ณ„ํ•ฉ๋‹ˆ๋‹ค.
- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์„ ์ž‘์—…ํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

4. Django ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€
- Django์˜ ๋‚ด์žฅ๋œ ๊ด€๋ฆฌ์ž ํŽ˜์ด์ง€๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ๊ด€๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
- ์ปค์Šคํ…€ ๋ชจ๋ธ ๊ด€๋ฆฌ์ž ๋ฐ ์ธ์ฆ๊ณผ ๊ถŒํ•œ ์„ค์ •์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

5. Django ํผ๊ณผ ์‚ฌ์šฉ์ž ์ธ์ฆ
- Django ํผ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
- Django์˜ ์‚ฌ์šฉ์ž ์ธ์ฆ ๊ธฐ๋Šฅ์„ ์ด์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๋กœ๊ทธ์ธ, ํšŒ์›๊ฐ€์ž…, ๋กœ๊ทธ์•„์›ƒ ๋“ฑ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

6. Django ํ…œํ”Œ๋ฆฟ๊ณผ ์ •์  ํŒŒ์ผ
- Django ํ…œํ”Œ๋ฆฟ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋™์ ์ธ ์›น ํŽ˜์ด์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
- ์ •์  ํŒŒ์ผ(์ด๋ฏธ์ง€, CSS, JavaScript ๋“ฑ)์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

7. Django REST framework๋ฅผ ์ด์šฉํ•œ API ๊ฐœ๋ฐœ
- Django REST framework๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ RESTful API๋ฅผ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค.
- API์— ๋Œ€ํ•œ ์ธ์ฆ, ๊ถŒํ•œ ์„ค์ • ๋“ฑ์„ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

8. Django ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ํ™œ์šฉ
- ๋‹ค์–‘ํ•œ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์กฐ์ž‘ ๋ฐ ์ฟผ๋ฆฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
- ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์„ฑ๋Šฅ ์ตœ์ ํ™” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

9. Django ํ…Œ์ŠคํŠธ ๋ฐ ๋””๋ฒ„๊น…
- Django์˜ ํ…Œ์ŠคํŠธ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์œ ๋‹› ํ…Œ์ŠคํŠธ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.
- ๋””๋ฒ„๊น… ๋„๊ตฌ๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์•„ ์ˆ˜์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.

10. Django ๋ฐฐํฌ์™€ ์šด์˜
- Django ํ”„๋กœ์ ํŠธ๋ฅผ ์„œ๋น„์Šค ํ™˜๊ฒฝ์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ํ•™์Šตํ•ฉ๋‹ˆ๋‹ค.
- ์„œ๋ฒ„ ์„ค์ •, ๋ณด์•ˆ ๊ฐ•ํ™”, ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ ์ตœ์ ํ™” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๋ ‡๊ฒŒ ๊ณ„ํš์„ ์„ธ์›Œ๋ณด์‹œ๊ณ , ๊ฐ ๋‹จ๊ณ„๋งˆ๋‹ค ํ•„์š”ํ•œ ์ฐธ๊ณ  ์ž๋ฃŒ๋‚˜ ์ฑ…์„ ๊ตฌํ•ด์„œ ๊ณต๋ถ€ํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋„์›€์ด ๋˜์—ˆ๊ธธ ๋ฐ”๋ž๋‹ˆ๋‹ค!

Karlo

Karlo API๋Š” ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ๋ฌธ์žฅ๊ณผ ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“œ๋Š” ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ƒ์„ฑํ˜• ์ธ๊ณต์ง€๋Šฅ(Artificial Intelligence, AI) Karlo๋Š” 3์–ต ์žฅ ๊ทœ๋ชจ์˜ ์ด๋ฏธ์ง€-ํ…์ŠคํŠธ ํ•™์Šต์„ ํ†ตํ•ด ์‚ฌ์šฉ์ž๊ฐ€ ๋ฌ˜์‚ฌํ•œ ๋‚ด์šฉ์„ ์ดํ•ดํ•˜๊ณ , ํ”ฝ์…€ ๋‹จ์œ„๋กœ ์™„์ „ํžˆ ์ƒˆ๋กœ์šด ์ด๋ฏธ์ง€๋ฅผ ๋น ๋ฅด๊ฒŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์›ํ•˜๋Š” ์ฝ˜์…‰ํŠธ์— ๋งž์ถฐ ์ฐฝ์ž‘ ํ™œ๋™์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์‚ฌ๋ฌผ, ๋ฐฐ๊ฒฝ, ์กฐ๋ช…, ๊ตฌ๋„, ๋‹ค์–‘ํ•œ ํ™”ํ’์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์ด์šฉ ์ œํ•œ

์‹œ๊ฐ„ ์ œํ•œ
๋ถ„๋‹น ๊ฒฐ๊ณผ ์ƒ์„ฑ ์ˆ˜ ๊ธฐ์ค€ 30๊ฑด
์ผ๊ฐ„ ๊ฒฐ๊ณผ ์ƒ์„ฑ ์ˆ˜ ๊ธฐ์ค€ 3,000๊ฑด
์›”๊ฐ„ ๊ฒฐ๊ณผ ์ƒ์„ฑ ์ˆ˜ ๊ธฐ์ค€ 600,000๊ฑด

์˜ˆ์ œ ์ฝ”๋“œ

# REST API ํ˜ธ์ถœ, ์ด๋ฏธ์ง€ ํŒŒ์ผ ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ
import requests
import json
import urllib
from PIL import Image

# [๋‚ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜] > [์•ฑ ํ‚ค] ์—์„œ ํ™•์ธํ•œ REST API ํ‚ค ๊ฐ’ ์ž…๋ ฅ
REST_API_KEY = '${REST_API_KEY}'

# ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•˜๊ธฐ ์š”์ฒญ
def t2i(prompt, negative_prompt):
    r = requests.post(
        'https://api.kakaobrain.com/v2/inference/karlo/t2i',
        json = {
            'prompt': prompt,
            'negative_prompt': negative_prompt
        },
        headers = {
            'Authorization': f'KakaoAK {REST_API_KEY}',
            'Content-Type': 'application/json'
        }
    )
    # ์‘๋‹ต JSON ํ˜•์‹์œผ๋กœ ๋ณ€ํ™˜
    response = json.loads(r.content)
    return response

# ํ”„๋กฌํ”„ํŠธ์— ์‚ฌ์šฉํ•  ์ œ์‹œ์–ด
prompt = "A cat with white fur"
negative_prompt = "sleeping cat, dog, human, ugly face, cropped"

# ์ด๋ฏธ์ง€ ์ƒ์„ฑํ•˜๊ธฐ REST API ํ˜ธ์ถœ
response = t2i(prompt, negative_prompt)

# ์‘๋‹ต์˜ ์ฒซ ๋ฒˆ์งธ ์ด๋ฏธ์ง€ ์ƒ์„ฑ ๊ฒฐ๊ณผ ์ถœ๋ ฅํ•˜๊ธฐ
result = Image.open(urllib.request.urlopen(response.get("images")[0].get("image")))
result.show()

๊ฒฐ๊ณผ

sample.png

Youtube Data API

YouTube Data API๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด YouTube ์›น์‚ฌ์ดํŠธ์—์„œ ์ผ๋ฐ˜์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ธฐ๋Šฅ์„ ์ž์‹ ์˜ ์›น์‚ฌ์ดํŠธ ๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ํ†ตํ•ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋ชฉ๋ก์€ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์œ ํ˜•์˜ ๋ฆฌ์†Œ์Šค๋ฅผ ์‹๋ณ„ํ•ฉ๋‹ˆ๋‹ค. API๋Š” ์ด๋Ÿฌํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๋Œ€๋ถ€๋ถ„ ์‚ฝ์ž…, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œํ•˜๋Š” ๋ฉ”์„œ๋“œ๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

API Reference ย |ย  YouTube Data API ย |ย  Google for Developers

API ํ˜ธ์ถœ

  1. ๋ชจ๋“  ์š”์ฒญ์€ API ํ‚ค (keyย ๋งค๊ฐœ๋ณ€์ˆ˜ ํฌํ•จ)๋ฅผ ์ง€์ •ํ•˜๊ฑฐ๋‚˜ OAuth 2.0 ํ† ํฐ์„ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. API ํ‚ค๋Š” ํ”„๋กœ์ ํŠธ์˜ย Developer Console์— ์žˆ๋Š”ย API ์•ก์„ธ์Šคย ์ฐฝ์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  2. ๋ชจ๋“  ์‚ฝ์ž…, ์—…๋ฐ์ดํŠธ, ์‚ญ์ œ ์š”์ฒญ์— ๋Œ€ํ•ดย ๋ฐ˜๋“œ์‹œย ์Šน์ธ ํ† ํฐ์„ ์ „์†กํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ธ์ฆ๋œ ์‚ฌ์šฉ์ž์˜ ๋น„๊ณต๊ฐœ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ชจ๋“  ์š”์ฒญ์— ๋Œ€ํ•ด ์ธ์ฆ ํ† ํฐ์„ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    ๋˜ํ•œ ๋ฆฌ์†Œ์Šค๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•œ ์ผ๋ถ€ API ๋ฉ”์„œ๋“œ๋Š” ์ธ์ฆ์ด ํ•„์š”ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ์š”์ฒญ์ด ์ธ์ฆ๋  ๋•Œ ์ถ”๊ฐ€ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์‚ฌ์šฉ์ž๊ฐ€ ์—…๋กœ๋“œํ•œ ๋™์˜์ƒ์„ ๊ฒ€์ƒ‰ํ•˜๋Š” ์š”์ฒญ์—๋Š” ํŠน์ • ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญ์„ ์ธ์ฆํ•  ๊ฒฝ์šฐ ๋น„๊ณต๊ฐœ ๋™์˜์ƒ๋„ ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  3. API๋Š” OAuth 2.0 ์ธ์ฆ ํ”„๋กœํ† ์ฝœ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. OAuth 2.0 ํ† ํฐ์€ ๋‹ค์Œ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋กœ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

7. ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ

2023๋…„ 12์›” 31์ผ๋ถ€ํ„ฐ 2024๋…„ 1์›” 4์ผ๊นŒ์ง€ ์ด 5์ผ ๊ฐ„ ์•ฝ 40๋ช…์˜ ์œ ์ €๋ถ„๋“ค๋กœ ๋ถ€ํ„ฐ ๋ฎค๋”•์ด ๋ณด์•ˆํ•ด์•ผํ•  ์ ๊ณผ ๊ฐœ์„ ํ•ด์•ผํ•  ์  ๋“ฑ์— ๋Œ€ํ•ด์„œ ์˜๊ฒฌ์„ ๋ฐ›์•„๋ณด์•˜์Šต๋‹ˆ๋‹ค.

์ ๊ทน์ ์œผ๋กœ ํ…Œ์ŠคํŠธ์— ์ž„ํ•ด์ฃผ์‹œ๊ณ  ์ €ํฌ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ฐœ์ „ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ข‹์€ ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์‹  ๋ชจ๋“ ๋ถ„๋“ค์—๊ฒŒ ๊ฐ์‚ฌ์ธ์‚ฌ๋ฅผ ๋“œ๋ฆฝ๋‹ˆ๋‹ค!

์Šคํฌ๋ฆฐ์ƒท 2024-01-14 130852

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

ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์–‘ํ•œ ์‹œ๊ฐ์—์„œ ๋ฐ”๋ผ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค„ ๋ฟ๋งŒ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์ ์ธ ๋ถ€๋ถ„์„ ๊ฐœ์„ ํ•˜๋Š” ๋ฐ ์žˆ์–ด ์ข‹์€ ํšจ๊ณผ๋ฅผ ๋ถˆ๋Ÿฌ์˜ฌ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ˆ˜์ง‘์„ ์œ„ํ•œ ํ”„๋กœ์„ธ์Šค

1. ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ ์ฑ„๋„ ๋งŒ๋“ค๊ธฐ

์ €ํฌ๋Š” ์‚ฌ์šฉ์ž๋ถ„๋“ค์˜ ์˜๊ฒฌ์„ ์‰ฝ๊ฒŒ ์ˆ˜์ง‘ํ•  ์ˆ˜ ์žˆ๋„๋ก Google Forms์„ ์ด์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ์ƒท 2024-01-14 130539

2. ํ”ผ๋“œ๋ฐฑ ๋ถ„๋ฅ˜ํ•˜๊ธฐ

์ €ํฌ๋Š” ์•„๋ž˜ ์ด์œ ๋ฅผ ๊ทผ๊ฑฐ๋กœ, ํ‘œ์ค€ํ™”๋œ ๋ถ„๋ฅ˜ ํ”„๋กœ์„ธ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1. ์‚ฌ์šฉ์ž ๋ฌธ์ œ์— ๋Œ€ํ•œ ์‘๋‹ต ์‹œ๊ฐ„ ๋‹จ์ถ•
2. ๋ฌธ์ œ์— ๋Œ€ํ•ด ํ‘œ์ค€ํ™”๋œ ์šฐ์„ ์ˆœ์œ„ ์ ์šฉ
3. ํ•œ์ •๋œ ์ž์›์„ ๊ฐ€์žฅ ํ•„์š”ํ•˜๊ณ  ์˜ํ–ฅ์ด ํฐ ๋ณ€๊ฒฝ ์ž‘์—…์— ํˆฌ์ž…
4. ์š”์ฒญ๋œ ์ž‘์—…์ด ๋ฏธ์ฒ˜๋ฆฌ ์ƒํƒœ๋กœ ๊ณ„์† ๋‚จ์•„ ์žˆ๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€

ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ๋ฐ›์€ ๋ฌธ์ œ๋ฅผ ์•„๋ž˜ 3๊ฐ€์ง€ ์งˆ๋ฌธ์— ๋‹ตํ•˜๊ธฐ ์œ„ํ•ด ๊ตฌ์ฒด์ ์ธ ์š”๊ตฌ์‚ฌํ•ญ์„ ์ •์˜ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1. ์ด ๋ฌธ์ œ๊ฐ€ ์œ ํšจํ•œ๊ฐ€?
2. ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?
3. ์ด ๋ฌธ์ œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ๊ฐ€?

์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์„ ํ†ตํ•ด ์กฐ์น˜ ๊ฐ€๋Šฅํ•œ ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ๊ณผ ์ถ”๊ฐ€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๊ตฌ๋ถ„ํ•˜๋Š”๋ฐ ํฐ ๋„์›€์ด ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์œ ํšจํ•œ๊ฐ€?

์ข‹์€ ์˜๋„๋ฅผ ๊ฐ€์ง€๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…จ์ง€๋งŒ, ์šฐ๋ฆฌ์˜ ํ”„๋กœ์ ํŠธ์™€ ๊ด€๋ จ์ด ์—†๊ฑฐ๋‚˜ ์‚ฌ์šฉ์ž๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์ด๋ฏธ ํ•ด๊ฒฐ๋œ ๊ฒฝ์šฐ๊ฐ€ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์šฉ์ž ํ”ผ๋“œ๋ฐฑ์œผ๋กœ ์ ‘์ˆ˜๋œ ๋ฌธ์ œ๋ฅผ ํ‰๊ฐ€ํ•  ๋•Œ '์‹ ๋ขฐํ•˜๋˜ ํ™•์ธ'ํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•˜๋Š”๊ฒŒ ์ข‹๊ฒ ๋‹ค ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋Š”๊ฐ€?

ํ”ผ๋“œ๋ฐฑ์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค๋ฉด ํ”ผ๋“œ๋ฐฑ์ด ์กฐ์น˜ ๊ฐ€๋Šฅํ•œ์ง€ ์ •ํ•˜๋Š” ๊ฒƒ์ด ๋‹ค์Œ ์ˆœ์„œ์˜€์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ์„ธ๊ฐ€์ง€๋ฅผ ๊ทผ๊ฑฐ๋กœ ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.

1. ์ค‘๋ณต๋˜์ง€ ์•Š์€ ์ง€
2. ์žฌํ˜„์ด ๊ฐ€๋Šฅํ•œ ์ง€
3. ๋ฒ”์œ„๊ฐ€ ์ •ํ•ด์ ธ์žˆ๋Š” ์ง€

๋ฒ”์œ„๊ฐ€ ๋„ˆ๋ฌด ํฌ๊ฑฐ๋‚˜ ๋ง‰์—ฐํ•œ ํ”ผ๋“œ๋ฐฑ์ผ ๊ฒฝ์šฐ ์กฐ์น˜๋ฅผ ์ทจํ•  ์ˆ˜ ์žˆ๋Š” ํ”ผ๋“œ๋ฐฑ์ด ์•„๋‹ˆ๋ผ ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋ฌธ์ œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ๊ฐ€?

๋งˆ์ง€๋ง‰์œผ๋กœ๋Š” ํ”ผ๋“œ๋ฐฑ์˜ ์กฐ์น˜ ์šฐ์„ ์ˆœ์œ„๋ฅผ ์ •ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๊ฐ€ ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€, ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ํ•ด๊ฒฐํ•ด์•ผ ํ•˜๋Š”์ง€๋ฅผ ๊ทผ๊ฑฐ๋กœ ํŒ๋‹จํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ €ํฌ์˜ ๊ฒฝ์šฐ 5๋‹จ๊ณ„๋กœ ๋ฌธ์ œ๋ฅผ ๊ตฌ๋ถ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

์Šคํฌ๋ฆฐ์ƒท 2024-01-14 130943

3. ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜ํ•˜๊ธฐ

  1. ๊ฒ€์ƒ‰ ๊ฒฐ๊ณผ - ์Œ์•… ์ฐพ๊ธฐ ์ถ”๊ฐ€
  • ํ”Œ๋ฆฌ/์œ ์ € ๊ฒ€์ƒ‰ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์Œ์•… ๊ฒ€์ƒ‰๋„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ์‚ฌ์šฉ์ž๋“ค์€ ํŠน์ • ์Œ์•…์„ ๊ฒ€์ƒ‰ํ•˜์—ฌ ์ž์‹ ์˜ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ์— ํ•ด๋‹น ์Œ์•…์„ ์‰ฝ๊ฒŒ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋กœ์จ ๋” ๋‹ค์–‘ํ•œ ์Œ์•… ๊ฒฝํ—˜๊ณผ ์ž์‹ ๋งŒ์˜ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ์ฆ๊ฑฐ์šด ๊ฒฝํ—˜์„ ๋Š๋‚„ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
  1. ์Œ์•… ์ƒ์„ฑ ๊ฒฐ๊ณผ 7~10๊ฐœ ๋žœ๋ค์œผ๋กœ ๋ณ€๊ฒฝ , ๋ฎค๋น„ ์ œ๋ชฉ 15์ž ์ด๋‚ด๋กœ, ์„ค๋ช…์€ 3์ค„ ์ด๋‚ด๋กœ
  • ๊ธฐ์กด 5๊ฐœ๋กœ ๊ณ ์ •๋˜์–ด ์žˆ๋˜ ์Œ์•…์˜ ์ˆ˜๋ฅผ ์ตœ๋Œ€ 10๊ฐœ๋กœ ๋Š˜๋ฆฌ๊ณ  7~ 10๊ฐœ ์‚ฌ์ด๋กœ ๋žœ๋ค ๊ฐฏ์ˆ˜๋ฅผ ๋ถ€์—ฌํ•จ์œผ๋กœ์จ ๋”ฑ๋”ฑํ•œ ๋Š๋‚Œ์„ ๋ฒ—์–ด๋‚˜ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ƒ์„ฑ ๊ฒฝํ—˜์„ ๋” ๋‹ค์ฑ„๋กญ๊ณ  ์ƒ๋™๊ฐ ์žˆ๊ฒŒ ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  1. ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
  • ์œ ์ €๋“ค์ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์žŠ์–ด๋ฒ„๋ ธ์„ ๋•Œ ๋Œ€๋น„ํ•˜์—ฌ, ๋น„๋ฐ€๋ฒˆํ˜ธ ์ฐพ๊ธฐ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค. ์ด์ œ ์œ ์ €๋“ค์€ ์ž์‹ ์˜ ๊ณ„์ •์— ์—ฐ๊ฒฐ๋œ ์ด๋ฉ”์ผ ์ฃผ์†Œ๋ฅผ ํ†ตํ•ด ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ๋ณต๊ตฌํ•˜๊ณ  ์žฌ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์œ ์ €๋“ค์ด ๋ถˆํŽธํ•จ ์—†์ด ๊ณ„์ •์— ์ ‘์†ํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ณ€๊ฒฝํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  1. ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ธ๋„ค์ผ ์ด๋ฏธ์ง€ ๋ณ€๊ฒฝ ์ถ”๊ฐ€
  • ์œ ์ €๋“ค์˜ ์ธํ„ฐ๋ ‰ํ‹ฐ๋ธŒํ•œ ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ ํ”Œ๋ ˆ์ด๋ฆฌ์ŠคํŠธ ์ธ๋„ค์ผ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

About

Music Digging Service Back-End Repositiory

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published