๐Ÿšจ3๋ถ„๋งŒ์— Next.js ์„œ๋น„์Šค ์žฅ์•  ๋Œ€์‘ ๋Œ€์‘ํ•˜๊ธฐ: GitHub Actions + AWS ECS + CodeDeploy ๋กค๋ฐฑ ์‹œ์Šคํ…œ

antยท2025๋…„ 4์›” 3์ผ
7

monorepo-operations

๋ชฉ๋ก ๋ณด๊ธฐ
3/3
post-thumbnail

0. ํ”„๋กค๋กœ๊ทธ

์ด๋ฒˆ๊ธ€์—์„œ๋Š” ์ง€๋‚œ๋ฒˆ๊นŒ์ง€ ๊ตฌ์ถ•ํ•œ ECS ํ™˜๊ฒฝ์—์„œ, ์˜ค๋ฅ˜ ๋ฐœ์ƒ ์‹œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์•ˆ์ •์ ์œผ๋กœ ๋กค๋ฐฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋‹ค๋ค„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.
ํŠนํžˆ GitHub Actions, AWS CodeDeploy๋ฅผ ํ™œ์šฉํ•˜์—ฌ ์ž๋™ํ™”๋œ ๋ฐฐํฌ ๋ฐ ๋กค๋ฐฑ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๋ช…๋“œ๋ฆด ์˜ˆ์ •์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ ์„ค๋ช…

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

๊ทธ๋Ÿฌ๋‚˜ ์•ฝ 2์‹œ๊ฐ„ ํ›„, ํ•œ ๊ณ ๊ฐ์œผ๋กœ๋ถ€ํ„ฐ "ํŠน์ • ๊ธฐ๋Šฅ ์‚ฌ์šฉ ์‹œ ํŽ˜์ด์ง€๊ฐ€ ๋‹ค์šด๋œ๋‹ค"๋Š” ์‹ ๊ณ ๊ฐ€ ์ ‘์ˆ˜๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
ํ•ด๋‹น ๊ธฐ๋Šฅ์€ ๋‹น์ผ ์ƒˆ๋กญ๊ฒŒ ๋ฐฐํฌ๋œ ๊ฒƒ์œผ๋กœ, ์ƒํ™ฉ์˜ ์‹ฌ๊ฐ์„ฑ์„ ๋”ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

๋ฐฐํฌํ–ˆ๋˜ ๋ธŒ๋žœ์น˜๋ฅผ ์žฌํ™•์ธํ•˜๊ณ  ๋นŒ๋“œ๋ถ€ํ„ฐ ๋ฐฐํฌ๊นŒ์ง€ ์ง„ํ–‰ํ•˜๋Š” ๋ฐ ์ด 30๋ถ„์ด ์†Œ์š”๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

๋น„๋ก ๋‹น์žฅ์˜ ์œ„๊ธฐ๋Š” ํ•ด์†Œ๋˜์—ˆ์œผ๋‚˜, ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ์žฌ๋ฐœ๋  ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ณด๋‹ค ์‹ ์†ํ•˜๊ณ  ํšจ์œจ์ ์œผ๋กœ ๋Œ€์‘ํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ์˜ ํ•„์š”์„ฑ์„ ์ ˆ์‹คํžˆ ๋А๋ผ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
์ด์— ๋”ฐ๋ผ, ๋กค๋ฐฑ ์‹œ์Šคํ…œ์˜ ๊ฐœ์„ ์„ ๊ฒฐ์‹ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

1. ํ˜„์žฌ ๋ฌธ์ œ ์„ค์ •

  1. ํ•„์š”ํ•œ ๋ฐฐํฌ ๋ฒ„์ „ ์„ ์ • ๋ฐ ๊ฒฐ์ •

    1. ํ•„์š”ํ•œ ๋ฒ„์ „์„ ๋…ธ์…˜์— ์ž‘์„ฑ๋œ ๋ฐฐํฌํŠธ๋ ˆ์ปค๋ฅผ ํ†ตํ•ด ์ฐพ๋Š”๋‹ค.
    2. ํ•ด๋‹น merge pr๋ฅผ ์ฐพ๋Š”๋‹ค.
    3. ์ฝ”๋“œ๋ฅผ ์ฝ๊ณ  ํ•„์š”ํ•œ ๋‚ด์šฉ์ธ์ง€ ๊ฒ€ํ†  ํ•œ๋‹ค.

    โ€ป ํŠนํžˆ 2๋ฒˆ๊ณผ 3๋ฒˆ ๋‹จ๊ณ„์—์„œ๋Š” ์†Œ์š” ์‹œ๊ฐ„์ด ๋งŽ๊ณ , ์‹ค์ˆ˜๊ฐ€ ๋ฐœ์ƒํ•  ๊ฐ€๋Šฅ์„ฑ๋„ ์žˆ์Œ์„ ์œ ๋…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  2. ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ

    1. ๋นŒ๋“œ (์•ฝ 6๋ถ„ ์†Œ์š”):
      ์ด๋ฏธ ECR์— ๋“ฑ๋ก๋œ ์ด๋ฏธ์ง€๊ฐ€ ์กด์žฌํ•จ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ƒํ™ฉ์— ๋”ฐ๋ผ ์žฌํ™œ์šฉํ•˜์ง€ ์•Š๊ณ  ์ƒˆ๋กญ๊ฒŒ ๋นŒ๋“œ๋ฅผ ์ง„ํ–‰ ํ•ฉ๋‹ˆ๋‹ค.
    2. ๋ฐฐํฌ (์•ฝ 3๋ถ„ ์†Œ์š”):
      ๋นŒ๋“œ ์™„๋ฃŒ ํ›„ ๋ฐฐํฌ ์ ˆ์ฐจ๋ฅผ ์ง„ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

2. ๊ฐœ์„  ๋ชฉํ‘œ

esc ์— code deploy ๊ฐ€ ์—ฐ๋™ ๋˜์–ด ์žˆ์œผ๋ฉด task definition์„ ์ƒˆ๋กœ ๋งŒ๋“ค์–ด ์˜ฌ๋ฆฌ๋ฉด ํ•ด๋‹น ํ…Œ์Šคํฌ๋ฅผ ์ƒˆ๋กœ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค.
์ด๋ฅผ ์ด์šฉํ•˜์—ฌ ๋กค๋ฐฑ์„ ๊ตฌํ˜„ ํ•ฉ๋‹ˆ๋‹ค.

  1. ํšจ์œจ์ ์ธ ๋ฒ„์ „ ์„ ์ • ๋ฐ ๋กค๋ฐฑ ์ ˆ์ฐจ

    • ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์ฒด๊ณ„ํ™”ํ•˜์—ฌ ํ•„์š”ํ•œ ๋ฐฐํฌ ๋ฒ„์ „์„ ์‰ฝ๊ณ  ๋น ๋ฅด๊ฒŒ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ ํ•ฉ๋‹ˆ๋‹ค.
    • ์ฝ”๋“œ ๊ฒ€ํ† , ๋นŒ๋“œ, ๋ฐฐํฌ ์ „ ๊ณผ์ •์—์„œ ๋ถˆํ•„์š”ํ•œ ์‹œ๊ฐ„ ๋‚ญ๋น„๋ฅผ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ž๋™ํ™”๋œ ๊ฒ€์ฆ ์ ˆ์ฐจ๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฐฐํฌ ์‹œ๊ฐ„ ๋‹จ์ถ•

    • ECR ์ด๋ฏธ์ง€๋ฅผ ์žฌํ™œ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ™˜๊ฒฝ์„ ๋งˆ๋ จํ•˜์—ฌ, ๋นŒ๋“œ ์‹œ๊ฐ„์„ ๊ฐ€๋Šฅํ•œ ํ•œ ๋‹จ์ถ•ํ•ฉ๋‹ˆ๋‹ค.
    • ๋ถˆํ•„์š”ํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ์ œ๊ฑฐํ•˜์—ฌ ๋ฐฐํฌ์— ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์„ ์ค„์ž…๋‹ˆ๋‹ค.
  3. ๋ฌธ์ œ ๋ฐœ์ƒ ์‹œ ๋น ๋ฅธ ๋Œ€์ฒ˜

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

3 ๊ฐœ์„  ๋ฐฉ๋ฒ•

  1. ํšจ์œจ์ ์ธ ๋ฒ„์ „ ์„ ์ • ๋ฐ ๋กค๋ฐฑ ์ ˆ์ฐจ

    1. ๋ฒ„์ „ ๊ด€๋ฆฌ ์‹œ์Šคํ…œ ๊ฐœ์„ 

      • ๋ฐฐํฌ ํ•˜๊ธฐ ์ „์— ๋…ธ์…˜์— ๋ฐฐํฌ ํŠธ๋ ˆ์ปค์— ๋‚ด์šฉ๊ณผ ๋ฒ„์ „์„ ์ ์–ด ๋‚ด์šฉ์„ ๋ฐ”๋กœ ํ™•์ธ ํ•˜๋„๋ก ํ•˜๊ธฐ

      • ๋ฐฐํฌ ์‹œ package.json์— ์žˆ๋Š” versoin์„ ์‚ฌ์šฉํ•ด ecr์— ํ•ด๋‹น ๋ฒ„์ „๊ณผ latest๋ฅผ ๋‘˜๋‹ค push ํ•œ๋‹ค.

      •   - name: 'VERSION ์ถ”์ถœ ๋ฐ ๊ฒ€์ฆ'
            id: set-version
            run: |
            # package.json์—์„œ version ์ถ”์ถœ
            VERSION=$(jq -r '.version' apps/web1/package.json)
            VERSION="v${VERSION}"
        
            # ๋ฒ„์ „ ๊ฐ’์ด ์˜ฌ๋ฐ”๋ฅธ์ง€ ๊ฒ€์ฆ
            if [[ ! $VERSION =~ ^v[0-9a-zA-Z._-]+$ ]]; then
            echo "์œ ํšจํ•˜์ง€ ์•Š์€ ๋ฒ„์ „ ํ˜•์‹์ž…๋‹ˆ๋‹ค: $VERSION"
            exit 1
            fi
        
            echo "VERSION=$VERSION" >> $GITHUB_ENV
            echo "ํ™•์ •๋œ ๋ฒ„์ „: $VERSION"
        
          - name: '๋„์ปค ์ด๋ฏธ์ง€ ๋นŒ๋“œ & ECR ํ‘ธ์‰ฌ '
            id: build-image
            run: |
            DOCKER_BUILDKIT=1 docker build  \
            docker build 
            docker tag ${{ secrets.AWS_ECR_REPOSITORY_NEXT }}:latest ${{ secrets.AWS_ECR_REPOSITORY_NEXT }}:${{ env.VERSION }}
            docker push ${{ secrets.AWS_ECR_REPOSITORY_NEXT }}:${{ env.VERSION }}
            docker push ${{ secrets.AWS_ECR_REPOSITORY_NEXT }}:latest
    2. ๋ฒ„์ „ ์กฐํšŒ ์ž๋™ํ™”

      • git action์˜ workflow์„ ํ†ตํ•ด์„œ ์‚ฌ์šฉํ•˜๊ณ ์ž ํ•˜๋Š” vesion์„ ์ž…๋ ฅ ๋ฐ›์Šต๋‹ˆ๋‹ค.
      •  workflow_dispatch:
           inputs:
             version:
               description: '๋ฒ„์ „ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š” ex) v1.0.0'
               required: true
               default: 'latest'
      • ํŠน์ • ๋ฒ„์ „์˜ image๊ฐ€ ecr์— ์žˆ๋Š” ์ง€ ํ™•์ธ ํ•ฉ๋‹ˆ๋‹ค.
      •  - name: 'ECR image tag ํ™•์ธ'
           run: |
           aws ecr describe-images \
           --repository-name web1 \
           --image-ids imageTag=${{ env.VERSION }} \
           >/dev/null 2>&1 && echo "Image found" || { echo "Image not found"; exit 1; }
    3. ๋กค๋ฐฑ ์ ˆ์ฐจ ์ตœ์ ํ™”

      • task-definition ๋‚ด ์ด๋ฏธ์ง€ ํƒœ๊ทธ๋ฅผ ์ง€์ •๋œ ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธ ํ•ฉ๋‹ˆ๋‹ค.
      •  - name: 'task-definition ์—…๋ฐ์ดํŠธ'
           run: |
           sed -i -e 's|\(web1\)"|\1:${{ env.VERSION }}"|g' \
           -e 's|\(web1\)"|\1:${{ env.VERSION }}"|g' \
           ./deploy/ops/web1/task-definition.json
      • ecs deploy๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐฐํฌ๋ฅผ ์ˆ˜ํ–‰ ํ•ฉ๋‹ˆ๋‹ค.
      •  - name: '[ROLLBACK] ECS ๋กค๋ฐฑ ๋ฐฐํฌ'
           run: |
           aws ecs deploy \
           --task-definition ./deploy/ops/web1/task-definition.json \
           ~~ ๋‚˜๋จธ์ง€ arg

4. ์ˆ˜ํ–‰ ๊ฒฐ๊ณผ

๋ฌธ์„œํ™”๋œ ๊ธ€์„ ํ™•์ธํ•˜์—ฌ ๋ฐฐํฌ ํ•˜๋ฏ€๋กœ ์ฝ”๋“œ๋ฅผ ๋ณด๊ณ  ๋‚ด์šฉ์„ ํ™•์ธ ์•ˆ ํ•ด๋„ ๋˜๋ฉฐ
์ด๋ฏธ ecr์— ๋“ฑ๋ก๋œ ์ด๋ฏธ์ง€๋ฅผ ์žฌ์‚ฌ์šฉํ•จ์œผ๋กœ ๋นŒ๋“œ ์‹œ๊ฐ„์„ ์ค„์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๋ฐฐํฌ ์‹œ๊ฐ„(3๋ถ„)๋งŒ ์žˆ์œผ๋ฉด ์•ˆ์ •์ ์ธ ๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ฌ์ง€์–ด ํŠน์ • ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์˜์กดํ•˜์ง€ ์•Š๊ณ  ๋ˆ„๊ตฌ๋“  ๋กค๋ฐฑ์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ด์ œ ๋‹ค์‹œ ๋งˆ์Œ ๋†“๊ณ  ํ…Œ์Šคํฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Ÿฌ ๊ฐˆ ์ˆ˜ ์žˆ๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.(์ •๋ง?)

5. ์•„์‰ฌ์šด ๋ถ€๋ถ„

์ €ํฌ ์„œ๋น„์Šค ์ฝ”๋“œ๋Š” ๋ชจ๋…ธ๋ ˆํฌ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์–ด tag๋ฅผ ํ™œ์šฉํ•œ ๋ฒ„์ „๊ด€๋ฆฌ ์ž๋™ํ™”๊ฐ€ ์–ด๋ ค์šด ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค. ์ด๋กœ ์ธํ•ด ๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์—ฌ์ „ํžˆ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ ์ด ์•„์‰ฝ์Šต๋‹ˆ๋‹ค.

ํ˜น์‹œ ์ด ๊ธ€์„ ์ฝ๋Š” ๋…์ž๋ถ„๋“ค ์ค‘์— ํ•ด๋‹น ๋ฌธ์ œ๋ฅผ ๊ฒช์œผ์‹œ๊ฑฐ๋‚˜ ํ•ด๊ฒฐ์ฑ…์„ ์•„์‹œ๋Š” ๋ถ„์€ ๋Œ“๊ธ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

6. ๋А๋‚€์ 

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

9๊ฐœ์˜ ๋Œ“๊ธ€

comment-user-thumbnail
2025๋…„ 4์›” 6์ผ

๋ฌธ์ œ ์„ค๋ช…์„ ์ฝ์œผ๋ฉด์„œ ๋งˆ์น˜ ๊ทธ ์ˆœ๊ฐ„์— ์žˆ๋Š”๋“ฏํ•œ ๋А๋‚Œ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค๐Ÿ˜‚
๋‹จ์ˆœํžˆ ๋ฌธ์ œ ํ•ด๊ฒฐ ํ›„ ๋!์ด ์•„๋‹ˆ๋ผ ํ•ด๊ฒฐ ๊ณผ์ •์—์„œ ๋А๊ผˆ๋˜ ๋ถˆํŽธํ•จ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐœ์„  ๋ชฉํ‘œ๋ถ€ํ„ฐ ๋ฐฉ๋ฒ•์„ ์ •๋ฆฌํ•˜๊ณ  ๊ฒฐ๊ณผ๊นŒ์ง€ ๋„์ถœํ•ด๋‚ธ ๋ถ€๋ถ„์ด ์ธ์ƒ๊นŠ์—ˆ์Šต๋‹ˆ๋‹ค :) ์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2025๋…„ 4์›” 9์ผ

์ €๋„ ์˜ˆ์ „์— QA์—์„œ ๋ฏธ์ฒ˜ ์žก์ง€๋ชปํ•œ ๋ฒ„๊ทธ๊ฐ€ ํ”„๋Ÿฌ๋•์…˜์—์„œ ๋ฐœ๊ฒฌ๋ผ์„œ ๊ธ‰ํ•˜๊ฒŒ ๋กค๋ฐฑํ•˜๋‹ค ์‹์€๋•€๋‚ฌ๋˜ ๊ฒฝํ—˜์ด ์žˆ๋Š”๋ฐ ํ™•์‹คํžˆ ์ด๋ ‡๊ฒŒ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ์žก์•„๋†“์œผ๋ฉด ๋‚˜์ค‘์— ์œ ์šฉํ•˜๊ฒ ๋„ค์š” ์ข‹์€ ๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค ๐Ÿ‘

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2025๋…„ 4์›” 28์ผ

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

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2025๋…„ 4์›” 30์ผ

๋ฌธ์ œ ์ƒํ™ฉ์„ ์ƒ์ƒํ•˜๊ฒŒ ์„ค๋ช…ํ•ด์ฃผ์‹  ํ”„๋กค๋กœ๊ทธ๊ฐ€ ํŠนํžˆ ์ธ์ƒ์ ์ด์—ˆ์–ด์š”. "ํ‰ํ™”๋กœ์šด ๋ฐฐํฌ๋‚ " ์žฌ๋ฐŒ์—ˆ์Šต๋‹ˆ๋‹ค ใ…Žใ…Žใ…Žใ…Ž
๋ฒ„์ „ ๊ด€๋ฆฌ๋ฅผ ์—ฌ์ „ํžˆ ์ˆ˜๋™์œผ๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค๋Š”๊ฒƒ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒํ•˜๋ฉด ํŽธํ•˜๊ฒŒ ๋˜๋Œ๋ฆด์ˆ˜ ์žˆ์„์ง€์—๋Œ€ํ•œ ๊ณ ๋ฏผ์€ ์ €๋„ ํ•จ๊ป˜ ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค ๋‚˜์ค‘์— ๊ด€๋ จ ๋‚ด์šฉ์œผ๋กœ ๊ฐ™์ด ๋Œ€ํ™”๋‚˜๋ˆ„๋ฉด ์ข‹๊ฒ ์Šต๋‹ˆ๋‹ค. ์ž˜ ์ฝ์—ˆ์Šต๋‹ˆ๋‹ค :)

1๊ฐœ์˜ ๋‹ต๊ธ€
comment-user-thumbnail
2025๋…„ 4์›” 30์ผ

์œ„๊ธฐ ์ƒํ™ฉ์„ ๊ณ„๊ธฐ๋กœ ์‹ค์ œ ์šด์˜ ํ™˜๊ฒฝ์— ๋งž๋Š” ์ž๋™ํ™”๋œ ๋กค๋ฐฑ ์‹œ์Šคํ…œ์„ ๊ตฌ์ถ•ํ•˜์‹  ๊ณผ์ •์ด ์ธ์ƒ ๊นŠ์—ˆ์Šต๋‹ˆ๋‹ค ใ…Žใ…Ž ๋ˆ„๊ตฌ๋‚˜ 3๋ถ„ ๋งŒ์— ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋งŒ๋“  ์‹ค์šฉ์ ์ธ ์ ‘๊ทผ์ด ์ •๋ง ๋ฉ‹์ง€๋„ค์šฉ !!! ๋‚˜์ค‘์— ์ด๋ ‡๊ฒŒ ๋กค๋ฐฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ๋ฅผ ์žก์•„๋†“์„ ์ˆ˜ ์žˆ๋„๋ก ์œ ์šฉํ•˜๊ฒŒ ๊ตฌํ˜„ํ•ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค bb

๋‹ต๊ธ€ ๋‹ฌ๊ธฐ