[์šฐ์‚ฌ๊ธฐ] Github Actions DEV ๋ฐฐํฌ์šฉ workflow ์ž‘์„ฑ

2026. 1. 21. 22:04ยท์šฐ์‚ฌ๊ธฐ ๊ฐœ๋ฐœ์ผ์ง€ ๐Ÿฐ

 

 

 

DEV ๋ฐฐํฌ์šฉ workflow ์ž‘์„ฑ

PR ํ…Œ์ŠคํŠธ์šฉ์— ์ด์–ด์„œ, feature ๋ธŒ๋žœ์น˜๋“ค์ด dev ๋ธŒ๋žœ์น˜์— merge๋˜์–ด push๋  ๋•Œ ๋™์ž‘ ํ•  workflow๋ฅผ ์ˆ˜์ •ํ•ด๋ณด์•˜๋‹ค.

Github Actions๋ฅผ ํ†ตํ•ด CI/CD ํ•ด๋ณธ ๊ฒŒ ์ฒ˜์Œ์ด๋ผ ํ—ท๊ฐˆ๋ฆฌ๊ณ  ์ดํ•ด ์•ˆ ๋˜๋Š” ๋‚ด์šฉ์ด ๋งŽ์•„์„œ, ๋‚ด์šฉ ๊ธฐ๋กํ•˜๋ฉด์„œ ์ •๋ฆฌํ•ด๋ณด์•˜๋‹ค.

 

 

Spring Boot ๋นŒ๋“œ

      - name: Build with Gradle (DEV) - Skip Tests
        run: ./gradlew clean build -x test --no-daemon
        env:
          SPRING_PROFILES_ACTIVE: dev

 

Gradle์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•œ๋‹ค. -x test ๋ช…๋ น์–ด๋กœ ํ…Œ์ŠคํŠธ๋Š” ์ œ์™ธ์‹œ์ผฐ๋‹ค. (ํ…Œ์ŠคํŠธ๋Š” Pull Request ํ•  ๋•Œ ์ง„ํ–‰)

๋นŒ๋“œ๊ฐ€ ์„ฑ๊ณตํ•˜๋ฉด build/libs/ ํด๋” ์•ˆ์— ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ JAR ํŒŒ์ผ์ด ์ƒ์„ฑ๋œ๋‹ค.

 

 

 

Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ - App

      - name: Set up Docker Buildx
        uses: docker/setup-buildx-action@v3

      - name: Build App Docker image (DEV)
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./Dockerfile
          push: false
          tags: |
            ${{ env.APP_IMAGE_NAME }}:${{ github.sha }}
            ${{ env.APP_IMAGE_NAME }}:latest-dev
          build-args: |
            SPRING_PROFILES_ACTIVE=dev
          cache-from: type=gha
          cache-to: type=gha,mode=max
          load: true

 

์Šคํ”„๋ง ๋ถ€ํŠธ ํ”„๋กœ์ ํŠธ ๋‚ด ./Dockerfile์„ ์ฝ์–ด์„œ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค.

 

cache-from: type=gha 

โžก๏ธ ๋นŒ๋“œ๋ฅผ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์—, GitHub Actions ์ „์šฉ ์บ์‹œ ์ €์žฅ์†Œ(type=gha)์—์„œ ์ด์ „์— ๋นŒ๋“œํ–ˆ๋˜ ๊ธฐ๋ก์„ ์ฐพ์•„๋ณด๋Š” ์„ค์ •

 

cache-to: type=gha,mode=max

โžก๏ธ ์ด๋ฒˆ์— ๋นŒ๋“œํ•œ ๊ฒฐ๊ณผ๋ฌผ์„ ๋‹ค์Œ๋ฒˆ ๋นŒ๋“œ ๋•Œ ์“ธ ์ˆ˜ ์žˆ๋„๋ก GitHub Actions ์บ์‹œ ์ €์žฅ์†Œ์— ์ €์žฅํ•˜๋Š” ์„ค์ •

โžก๏ธ max ๊ฐ’์„ ์‚ฌ์šฉํ•ด์•ผ, ๋นŒ๋“œ ์ค‘๊ฐ„์ค‘๊ฐ„์— ์ƒ์„ฑ๋œ ๋ชจ๋“  ์ค‘๊ฐ„ ๋‹จ๊ณ„(Intermediate Layers)๊นŒ์ง€ ์ €์žฅ๋˜๊ณ , Gradle ์˜์กด์„ฑ ๋‹ค์šด๋กœ๋“œ ๋‚ด์—ญ ๊ฐ™์€ ์ค‘๊ฐ„ ๊ณผ์ •๊นŒ์ง€ ์บ์‹œ๋˜์–ด, ๋‹ค์Œ ๋นŒ๋“œ ๋•Œ ๋‹ค์šด๋กœ๋“œ๋ฅผ ๋˜ ์•ˆ ํ•˜๊ณ  ๋„˜์–ด๊ฐˆ ์ˆ˜ ์žˆ๋‹ค.

 

# ./Dockerfile
FROM eclipse-temurin:21-jre-alpine

WORKDIR /app

COPY build/libs/*.jar app.jar

ENV TZ=Asia/Seoul
ENTRYPOINT ["java", "-jar", "app.jar"]

 

Dockerfile์— ๋นŒ๋“œ ๊ด€๋ จ ๋ช…๋ น์–ด๋Š” ์—†๊ณ , 

Springboot ๋นŒ๋“œ ๋‹จ๊ณ„์—์„œ ๋งŒ๋“ค์–ด๋†จ๋˜ JAR ํŒŒ์ผ์„ ๋ณต์‚ฌํ•ด์„œ ์‹คํ–‰์„ ๋‹ด๋‹นํ•˜๊ฒŒ ๋œ๋‹ค.

 

 

Docker ์ด๋ฏธ์ง€ ๋นŒ๋“œ - Nginx

 

      - name: Build Nginx Docker image (DEV)
        uses: docker/build-push-action@v5
        with:
          context: .
          file: ./nginx/Dockerfile
          push: false
          tags: |
            ${{ env.NGINX_IMAGE_NAME }}:${{ github.sha }}
            ${{ env.NGINX_IMAGE_NAME }}:latest-dev
          build-args: |
            ENVIRONMENT=dev
          cache-from: type=gha
          cache-to: type=gha,mode=max
          load: true

 

ํ”„๋กœ์ ํŠธ ๋‚ด ./nginx/Dockerfile ์„ ์ฝ์–ด์„œ ์ด๋ฏธ์ง€๋ฅผ ๋งŒ๋“ ๋‹ค. 

๋‚˜๋จธ์ง€๋Š” APP๋นŒ๋“œ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์ด๋‹ค.

 

 

 

AWS Lightsail ๋ฐฐํฌ ์ค€๋น„ ๋ฐ ์ด๋ฏธ์ง€ ํ‘ธ์‹œ

      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      - name: Install Lightsail Plugin
        run: |
          curl "https://s3.us-west-2.amazonaws.com/lightsailctl/latest/linux-amd64/lightsailctl" -o "/usr/local/bin/lightsailctl"
          sudo chmod +x /usr/local/bin/lightsailctl

      - name: Push App image to Lightsail
        run: |
          aws lightsail push-container-image \
            --service-name ${{ env.SERVICE_NAME }} \
            --label app-${{ github.sha }} \
            --image ${{ env.APP_IMAGE_NAME }}:${{ github.sha }} \
            --region ${{ env.AWS_REGION }}
            
       - name: Get pushed image names
        id: image-names
        run: |
          APP_IMAGE=$(aws lightsail get-container-images --service-name ${{ env.SERVICE_NAME }} --region ${{ env.AWS_REGION }} | jq -r '.containerImages[] | select(.image | contains("app-${{ github.sha }}")) | .image' | head -n 1)
          
          NGINX_IMAGE=$(aws lightsail get-container-images --service-name ${{ env.SERVICE_NAME }} --region ${{ env.AWS_REGION }} | jq -r '.containerImages[] | select(.image | contains("nginx-${{ github.sha }}")) | .image' | head -n 1)
          
          if [[ -z "$APP_IMAGE" ]]; then
            echo "Error: Could not find APP_IMAGE matching ${{ github.sha }}"
            exit 1
          fi

          echo "app_image=$APP_IMAGE" >> $GITHUB_OUTPUT
          echo "nginx_image=$NGINX_IMAGE" >> $GITHUB_OUTPUT
          
          echo "Found App Image: $APP_IMAGE"
          echo "Found Nginx Image: $NGINX_IMAGE"

 

GitHub Secrets์— ์ €์žฅ๋œ AWS ํ‚ค๋กœ ๋กœ๊ทธ์ธ์„ ํ•ด์ฃผ๊ณ , Lightsail ์ปจํ…Œ์ด๋„ˆ ์„œ๋น„์Šค ์ด์šฉํ•˜๊ธฐ ์œ„ํ•œ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ์„ค์น˜ํ•ด์ค€๋‹ค.

์œ„ ๋‹จ๊ณ„์—์„œ ๋นŒ๋“œํ•œ Docker ์ด๋ฏธ์ง€๋ฅผ AWS Lightsail์˜ ์ž์ฒด ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ๋กœ ์—…๋กœ๋“œํ•œ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋ฐฉ๊ธˆ AWS Lightsail ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์˜ฌ๋ ค์ง„ ์ด๋ฏธ์ง€๋ฅผ ์ฐพ๋Š”๋‹ค. 

aws lightsail push-container-image ๋ช…๋ น์–ด๋กœ ์ด๋ฏธ์ง€๋ฅผ ์˜ฌ๋ฆฌ๋ฉด, Lightsail ์ „์šฉ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ ์ฃผ์†Œ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊ปด์„œ ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์‹œ Get ํ•ด์˜ค๋Š” ๊ณผ์ •์ด ํ•„์š”ํ•˜๋‹ค. ์ฐพ์€ ์ด๋ฏธ์ง€๋Š” ๋ฐฐํฌ json ํŒŒ์ผ์— ์‚ฌ์šฉ๋œ๋‹ค.

 

 

 

๋ฐฐํฌ ์„ค์ • json ์ƒ์„ฑ

 

์—„์ฒญ ์• ๋จน๊ณ  ์ œ์ผ ๋งŽ์ด ์ˆ˜์ •ํ•œ step์ด๋‹ค.. ๐Ÿคฏ

 

 

jq๋กœ JSON ๋‹ค๋ฃจ๊ธฐ

์ฒ˜์Œ์—๋Š” cat ๋ช…๋ น์–ด๋ฅผ ์ด์šฉํ•˜์—ฌ ํ…์ŠคํŠธ๋ฅผ ํŒŒ์ผ๋กœ ์ €์žฅํ•˜๋Š” ๋‹จ์ˆœํ•œ ๋ฐฉ์‹์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, 

์•„๋ž˜์ฒ˜๋Ÿผ ๋ฌธ๋ฒ•์— ์˜ค๋ฅ˜๊ฐ€ ์žˆ์–ด๋„ json ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง€๊ณ  ๋ฐฐํฌ ๋˜๋Š” ๊ณผ์ •์—์„œ์•ผ ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค.

 

 

์ด๋Ÿฌํ•œ ์ƒํ™ฉ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด์„œ jq๋ฅผ ์‚ฌ์šฉํ•ด๋ณด์•˜๋‹ค.

      - name: Create deployment configuration
        run: |
          jq -n \
            --arg db_url "${{ secrets.DEV_DB_URL }}" \
            --arg db_user "${{ secrets.DEV_DB_USERNAME }}" \
            --arg db_pass "${{ secrets.DEV_DB_PASSWORD }}" \
            --arg redis_pass "${{ secrets.DEV_REDIS_PASSWORD }}" \
            # .. ์ƒ๋žต 
            '{
              containers: {
                app: {
                  image: $app_image,
                  environment: {
                    SPRING_PROFILES_ACTIVE: "dev",
                    DEV_DB_URL: $db_url,
					# .. ์ƒ๋žต 
                  },
                
                # .. ์ƒ๋žต 

              }
            }' > deployment.json
          
          echo "=== Deployment Configuration ==="
          cat deployment.json

 

 

jq ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฌธ๋ฒ•์ ์ธ ์˜ค๋ฅ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํŒŒ์ผ์„ ๋งŒ๋“ค๊ธฐ ์ „์— ์—๋Ÿฌ๋ฅผ ๋ฑ‰๋Š”๋‹ค. ์ฆ‰, ์ž˜๋ชป๋œ JSON ํŒŒ์ผ์ด ์ƒ์„ฑ๋˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜ ์žˆ๋‹ค.

๋˜ํ•œ, --arg๋กœ ๋ฐ›์€ ๊ฐ’์„ ์ž๋™์œผ๋กœ JSON ๋ฌธ์ž์—ด ๊ทœ๊ฒฉ์— ๋งž๊ฒŒ ๋ณ€ํ™˜ํ•ด์ฃผ๋ฏ€๋กœ ํ™˜๊ฒฝ ๋ณ€์ˆ˜๋ฅผ ๋‹ค๋ฃจ๊ธฐ์— ์ ํ•ฉํ•˜๋‹ค.

 

 

 

Lightsail ์ปจํ…Œ์ด๋„ˆ์— ๋ฐฐํฌ

      - name: Deploy to Lightsail
        run: |
          aws lightsail create-container-service-deployment \
            --service-name ${{ env.SERVICE_NAME }} \
            --region ${{ env.AWS_REGION }} \
            --cli-input-json file://deployment.json

 

์œ„์—์„œ ๋งŒ๋“ค์–ด์ง„ deployment.json์„ Lightsail์— ์ „์†กํ•˜์—ฌ ๋ฐฐํฌํ•˜๋Š” ๋‹จ๊ณ„์ด๋‹ค.

 

 

 

redis ์ปจํ…Œ์ด๋„ˆ ์—ฐ๊ฒฐํ•˜๊ธฐ

 

 

๋ฐฐํฌ๋Š” ํ–ˆ์ง€๋งŒ Health check ์‹คํŒจ โ˜ ๏ธ.

App ์ปจํ…Œ์ด๋„ˆ ๋กœ๊ทธ๋ฅผ ์‚ดํŽด๋ณด๋‹ˆ RedisConnectionException์ด ๋ฐœ์ƒํ•˜๊ณ  ์žˆ์—ˆ๋‹ค.

AWS lightsail์— ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋„ ์ง€์›์„ ํ•˜๊ณ  ์žˆ์–ด์„œ DB ์—ฐ๊ฒฐ์€ ์†์‰ฝ๊ฒŒ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, Redis ์—ฐ๊ฒฐํ•˜๋Š” ๊ฑด ์ •๋ง ๋„ˆ๋ฌด! ํž˜๋“ค์—ˆ๋‹ค.

 

 

์ œ๋ฏธ๋‚˜์ด์—๊ฒŒ ๋„์›€์„ ์–ป์€ ๊ฒฐ๊ณผ, 

AWS Lightsail์—์„œ๋Š” ์ปจํ…Œ์ด๋„ˆ๋ผ๋ฆฌ localhost๋กœ ํ†ต์‹ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— host ๊ฐ’์„ localhost๋กœ ์„ค์ •ํ•ด์•ผ ํ•œ๋‹ค.

App ์ปจํ…Œ์ด๋„ˆ ์ž…์žฅ์—์„œ๋Š” redis๋ผ๋Š” ์ด๋ฆ„์˜ ๋ณ„๋„ ์„œ๋ฒ„๊ฐ€ ์•„๋‹ˆ๋ผ, ์ž๊ธฐ ์ž์‹ ์˜ localhost์— ๋– ์žˆ๋Š” ์„œ๋น„์Šค๋กœ ์ธ์‹ํ•œ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๋˜ํ•œ, Redis๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ IPv4 ์ฃผ์†Œ์ธ 127.0.0.1๋งŒ ๋ฆฌ์Šค๋‹ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— IPv6 ์ฃผ์†Œ๋กœ ์‹ ํ˜ธ๋ฅผ ๋ณด๋‚ด๋Š” App ์ปจํ…Œ์ด๋„ˆ๊ฐ€ ์ ‘๊ทผํ•˜์ง€ ๋ชป ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋ž˜์„œ --bind 0.0.0.0์„ ์„ค์ •ํ•˜์—ฌ ๋ชจ๋“  ๊ณณ์—์„œ ์ ‘์†์ด ํ—ˆ์šฉ๋˜๋„๋ก ํ•ด์•ผํ•œ๋‹ค.

Redis ํฌํŠธ(6379)๋Š” publicEndpoint๋กœ ์„ค์ •ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ์™ธ๋ถ€์—์„œ๋Š” ์ ‘๊ทผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฉฐ, ๊ฐ™์€ Lightsail ์ปจํ…Œ์ด๋„ˆ ์„œ๋น„์Šค ๋‚ด๋ถ€์—์„œ๋งŒ ์ ‘์†์ด ๊ฐ€๋Šฅํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ ์ด์Šˆ๋Š” ์—†๋‹ค.

 

 

# deployment.json

redis: {
	image: "redis:7-alpine",
	command: ["redis-server", "--requirepass", $redis_pass],
	ports: {
		"6379": "TCP"
		}
}

 

 

 

local , test ํ™˜๊ฒฝ์—์„œ๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ ์—†์ด redis์— ์ ‘์†ํ•˜๋‹ค ๋ณด๋‹ˆ ์—ฐ๊ฒฐ์ด ์ž˜ ๋์—ˆ๋Š”๋ฐ

dev์—๋Š” ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ ‘์†์ด ํ•„์š”ํ•˜์—ฌ redis conifg ์„ค์ •๋„ ์ˆ˜์ •ํ•ด์คฌ๋‹ค.

 

@Configuration
class RedisConfig(
    @Value("\${spring.data.redis.host}") private val host: String,
    @Value("\${spring.data.redis.port}") private val port: Int,
    @Value("\${spring.data.redis.password}") private val password: String,
) {
    @Bean
    fun redisConnectionFactory(): RedisConnectionFactory {
        val config = RedisStandaloneConfiguration(host, port)
        config.setPassword(password)

        return LettuceConnectionFactory(config)
    }

    @Bean
    fun stringRedisTemplate(connectionFactory: RedisConnectionFactory): StringRedisTemplate =
        StringRedisTemplate(connectionFactory)
}

 

 

 

 

 

redis ์—ฐ๊ฒฐ์— ์„ฑ๊ณตํ•ด์„œ Health check๋„ ํ†ต๊ณผ๋๋‹ค.

 

 

 

 

์˜ค๋Š˜๋„ ์‚ฝ์งˆ ๋์— ๋ฐฐํฌ ์„ฑ๊ณต .. โœŒ๐Ÿป

์ข€๋” ์ธํ”„๋ผ ์ง€์‹์„ ์Œ“์•„์„œ ๋†“์นœ ๋ถ€๋ถ„์„ ๊ฐœ์„ ํ•ด ๋‚˜๊ฐ€์•ผ๊ฒ ๋‹ค.

 

์ €์ž‘์žํ‘œ์‹œ ๋น„์˜๋ฆฌ ๋ณ€๊ฒฝ๊ธˆ์ง€ (์ƒˆ์ฐฝ์—ด๋ฆผ)

'์šฐ์‚ฌ๊ธฐ ๊ฐœ๋ฐœ์ผ์ง€ ๐Ÿฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[์šฐ์‚ฌ๊ธฐ] AWS Lightsail ๋ฐฐํฌ ์‹œ, GitHub Actions๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž…ํ•˜๊ธฐ  (0) 2026.01.26
[์šฐ์‚ฌ๊ธฐ] Github Actions PR ํ…Œ์ŠคํŠธ์šฉ workflow ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ , ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ  (0) 2026.01.20
[์šฐ์‚ฌ๊ธฐ] OAuth 2.0 Playground๋กœ ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ธฐ  (0) 2026.01.15
'์šฐ์‚ฌ๊ธฐ ๊ฐœ๋ฐœ์ผ์ง€ ๐Ÿฐ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [์šฐ์‚ฌ๊ธฐ] AWS Lightsail ๋ฐฐํฌ ์‹œ, GitHub Actions๋กœ ํ™˜๊ฒฝ๋ณ€์ˆ˜ ์ฃผ์ž…ํ•˜๊ธฐ
  • [์šฐ์‚ฌ๊ธฐ] Github Actions PR ํ…Œ์ŠคํŠธ์šฉ workflow ๋ฐ ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์ž‘์„ฑ , ํ…Œ์ŠคํŠธ ํ™˜๊ฒฝ ๊ตฌ์„ฑ
  • [์šฐ์‚ฌ๊ธฐ] OAuth 2.0 Playground๋กœ ๊ตฌ๊ธ€ ์†Œ์…œ ๋กœ๊ทธ์ธ ํ…Œ์ŠคํŠธ ํ•ด๋ณด๊ธฐ
ํ•ด๋‹ˆ ๐ŸŒฑ
ํ•ด๋‹ˆ ๐ŸŒฑ
๊ธฐ๋ก์ด ์ž์‚ฐ์ด๋‹ค ( •ฬ€แด—•ฬ )ูˆโœ๏ธ
  • ํ•ด๋‹ˆ ๐ŸŒฑ
    haeni.dev
    ํ•ด๋‹ˆ ๐ŸŒฑ
  • ๋งํฌ

    • github
    • velog
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (25)
      • ์šฐ์‚ฌ๊ธฐ ๊ฐœ๋ฐœ์ผ์ง€ ๐Ÿฐ (4)
      • Today I Learned ๐Ÿง (19)
      • ๋ถ„๋…ธ์˜ ํƒ€์ดํ•‘ ๋กœ๊ทธ ๐Ÿ”ฅ (2)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    springboot
    ๊ฐœ๋ฐœ์ž
    AWS
    ์ฝ”๋”ฉํ…Œ์ŠคํŠธ
    ci/cd
    til
    IT
    ๋ฐฑ์—”๋“œ
    ์ฝ”ํ…Œ
    ๊ฐœ๋ฐœ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.5
ํ•ด๋‹ˆ ๐ŸŒฑ
[์šฐ์‚ฌ๊ธฐ] Github Actions DEV ๋ฐฐํฌ์šฉ workflow ์ž‘์„ฑ
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”