AI κΈ°λ° μΉ QA μλν νλ«νΌ
AutoQAλ μ¬μ©μκ° ν μ€νΈ λμ URLκ³Ό μμ°μ΄ μꡬμ¬νμ μ λ ₯νλ©΄, μΉ νμ΄μ§λ₯Ό μλ λΆμνκ³ AIκ° QA μλ리μ€λ₯Ό μμ±ν λ€ Playwright κΈ°λ° E2E ν μ€νΈ μ€ν κ²°κ³Όλ₯Ό μ€μκ°μΌλ‘ μ 곡νλ μλΉμ€μ λλ€. λΆμ, μλλ¦¬μ€ μμ±, μ€ν, κ²°κ³Ό 리ν¬νΈκΉμ§ μ΄μ΄μ§λ QA νμ΄νλΌμΈμ λΉλκΈ° μ컀μ μ€μκ° WebSocket μ΄λ²€νΈλ‘ μ°κ²°ν©λλ€.
| νλͺ© | λ΄μ© |
|---|---|
| νλ«νΌ | μΉ κΈ°λ° AI QA μλν SaaS |
| κ°λ° κΈ°κ° | 2026.04.06 ~ 2026.06.02 |
| κ°λ° μΈμ | 6μΈ |
| λꡬ | κΆμ₯ λ²μ | μ©λ |
|---|---|---|
| Docker Desktop | 4.x μ΄μ | λ‘컬 μΈνλΌ λ° μ 체 μ€ν μ€ν |
| Java | 17 | Backend κ°λ³ μ€ν |
| Node.js | 20 LTS | Frontend, Playwright Worker κ°λ³ μ€ν |
| Python | 3.12 | AI μλ² κ°λ³ μ€ν |
| AWS CLI | 2.x μ΄μ | μ΄μ AWS 리μμ€ μ κ·Ό λ° λ°°ν¬ |
| Terraform | 1.7 μ΄μ | AWS μΈνλΌ νλ‘λΉμ λ |
μμΈν λ‘컬 μ€ν μ μ°¨λ docs/local-run.mdλ₯Ό μ°Έκ³ νμΈμ.
μ 체 μ€νμ Docker Composeλ‘ μ€νν©λλ€.
cd infra
cp .env.example .env
docker compose -f docker-compose.full.yml up -d --buildκ°λ° μ€ μ ν리μΌμ΄μ μ κ°λ³λ‘ μ€ννλ €λ©΄ μΈνλΌλ§ λ¨Όμ κΈ°λν©λλ€.
cd infra
docker compose up -d postgres redis localstack minioμ΄ν νμν μλΉμ€λ₯Ό κ°κ° μ€νν©λλ€.
# Backend
cd backend
./gradlew bootRun
# Frontend
cd frontend
npm install
npm run dev
# Playwright Worker
cd playwright
cp .env.example .env
npm install
npx playwright install chromium
npm start
# AI Server
cd ai
python -m venv .venv
source .venv/bin/activate # Windows: .venv\Scripts\activate
pip install -r requirements.txt
uvicorn app.main:app --reload --port 8000| κ΅¬λΆ | μ£Όμ | λΉκ³ |
|---|---|---|
| Frontend | http://localhost:3000 | Docker Compose κΈ°μ€ |
| Frontend Dev Server | http://localhost:5173 | npm run dev κΈ°μ€ |
| Backend API | http://localhost:8080 | REST API |
| Swagger UI | http://localhost:8080/api/swagger-ui | λ‘컬 κΈ°λ³Έ νμ±ν |
| Backend Health | http://localhost:8080/actuator/health | Actuator health check |
| AI Server | http://localhost:8000 | FastAPI |
| LocalStack | http://localhost:4566 | λ‘컬 AWS λ체 |
| MinIO Console | http://localhost:9001 | minioadmin / minioadmin1234 |
| PostgreSQL | localhost:5432 | DB autoqa, user autoqa |
| Redis | localhost:6379 | κΈ°λ³Έ λΉλ°λ²νΈ redis1234 |
| κ΅¬λΆ | μ£Όμ | λΉκ³ |
|---|---|---|
| μλΉμ€ λλ©μΈ | https://www.autoqa.site | λ©μΈ μ¬μ©μ μλΉμ€ |
| SSAFY λλ©μΈ | https://k14a101.p.ssafy.io | λμΌ μλΉμ€ μ κ·Ό λλ©μΈ |
| Backend API | https://www.autoqa.site/api | Nginx reverse proxy |
| WebSocket | wss://www.autoqa.site/ws | μ€μκ° QA μ§ν μ΄λ²€νΈ |
| Jenkins | https://k14a101.p.ssafy.io:8443 | κ΄λ¦¬μ μ κ·Όμ© |
| Redis Commander | https://k14a101.p.ssafy.io:8081 | κ΄λ¦¬μ μ κ·Όμ© |
| Container Logs | https://k14a101.p.ssafy.io:8082 | Dozzle κΈ°λ° λ‘κ·Έ λ·°μ΄ |
μ΄μ νκ²½μμ Swagger UIλ 보μ μ μ± μ λ°λΌ λΉνμ±νλ μ μμ΅λλ€. EC2 λ°°ν¬ μ μ°¨λ infra/SETUP-GUIDE.mdλ₯Ό μ°Έκ³ νμΈμ.
νκ²½ λ³μλ μμ νμΌμ 볡μ¬ν λ€ μ€μ κ°μ μ±μ μ¬μ©ν©λλ€. μ€μ .env, terraform.tfvars, AWS Access Key, DB λΉλ°λ²νΈ, JWT Secret, λ©μΌ μ± λΉλ°λ²νΈ, Redis λΉλ°λ²νΈλ μ μ₯μμ 컀λ°νμ§ μμ΅λλ€.
| νμΌ | μ©λ |
|---|---|
infra/.env.example |
λ‘컬 Docker Compose κ³΅ν΅ νκ²½ λ³μ |
backend/.env.example |
Backend μ΄μ νκ²½ λ³μ μ°Έκ³ ν νλ¦Ώ |
playwright/.env.example |
Playwright Worker λ‘컬/μ΄μ νκ²½ λ³μ |
ai/.env.example |
AI μλ² λͺ¨λΈ, Redis, SQS, S3 νκ²½ λ³μ |
infra/ec2-setup/.env.example |
λ©μΈ EC2 Docker Compose μ΄μ νκ²½ λ³μ |
infra/terraform/main/terraform.tfvars.example |
Terraform λ³μ ν νλ¦Ώ |
μ΄μ λ°°ν¬ μμλ Terraform μΆλ ₯κ°μ EC2 νκ²½ λ³μλ‘ λ°μν©λλ€.
cd infra/terraform/main
terraform init
terraform plan
terraform apply
terraform outputμ£Όμ Terraform μΆλ ₯κ°μ RDS endpoint, SQS queue URL, S3 artifacts bucket, ECR repository URL, ECS service name, CloudWatch dashboard URL, EC2/Jenkinsμ© IAM access keyμ λλ€.
- λ©μΈ EC2λ Nginx, Frontend, Backend, Redis, Jenkins, Redis Commander, Dozzleμ Docker Composeλ‘ μ€νν©λλ€.
- Terraformμ VPC, public/private/db subnet, RDS PostgreSQL, SQS, S3, ECR, ECS Fargate Playwright Worker, ECS GPU AI Worker, IAM, CloudWatch, SNSλ₯Ό κ΄λ¦¬ν©λλ€.
- Redisλ ElastiCache λμ λ©μΈ EC2 Docker Redisλ₯Ό μ¬μ©ν©λλ€. Backendλ Compose networkλ‘ μ κ·Όνκ³ , ECS Workerλ EC2 κ³΅μΈ IPμ Redis λΉλ°λ²νΈλ₯Ό ν΅ν΄ μ κ·Όν©λλ€.
- Playwright Workerμ AI Workerλ SQS λ©μμ§ μ 무μ λ°λΌ 0κ°μμ νμν μλ§νΌ νμ₯λλ ꡬ쑰μ λλ€.
- ν μ€νΈ μ°μΆλ¬Ό, λΆμ κ²°κ³Ό, μλλ¦¬μ€ suite, μ€ν κ²°κ³Όλ S3 artifacts bucketμ μ μ₯ν©λλ€.
| μμ | κΈ°μ |
|---|---|
| Frontend | React 18, TypeScript, Vite, Tailwind CSS, Zustand, React Router, Axios, STOMP/SockJS, Three.js |
| Backend | Java 17, Spring Boot, Spring Security, JWT, Spring Data JPA, WebSocket, Redis, PostgreSQL, springdoc-openapi |
| Playwright Worker | Node.js, Express, Playwright, AWS SDK for JavaScript, ioredis |
| AI Server / Worker | Python 3.12, FastAPI, Uvicorn, Pydantic, vLLM, Transformers, LoRA κΈ°λ° LLM μΆλ‘ |
| Database / Cache | PostgreSQL, Redis |
| Storage / Queue | S3, SQS, SNS, MinIO, LocalStack |
| Infrastructure | Docker, Docker Compose, Nginx, Terraform, AWS VPC, RDS, ECR, ECS Fargate, ECS on EC2 GPU, IAM, CloudWatch |
| CI/CD / μ΄μ | Jenkins, CloudWatch Logs, CloudWatch Dashboard, Dozzle, Redis Commander |
| Load Test | k6 |
backend/
βββ src/
β βββ main/
β β βββ java/com/autoqa/backend/
β β β βββ BackendApplication.java
β β β βββ common/ κ³΅ν΅ μλ΅, μ€μ , Swagger, μμΈ μ²λ¦¬
β β β βββ domain/ μΈμ¦, μ¬μ©μ, νλ‘μ νΈ, QA, κ²°κ³Ό λλ©μΈ
β β β βββ infrastructure/ Redis, AWS, μΈλΆ μ°λ μΈνλΌ μ½λ
β β βββ resources/ profileλ³ μ€μ , ν
νλ¦Ώ, κ²μ¦ 리μμ€
β βββ test/ ν
μ€νΈ μ½λ
βββ scripts/ λ°±μλ 보쑰 μ€ν¬λ¦½νΈ
βββ gradle/ Gradle Wrapper 리μμ€
βββ build.gradle
βββ settings.gradle
βββ Dockerfile
βββ Jenkinsfile
βββ gradlew
βββ gradlew.bat
- Spring Boot κΈ°λ° API μλ²μ λλ€.
- μΈμ¦/μΈκ°, μ¬μ©μ κ΄λ¦¬, QA νμ΄νλΌμΈ API, SQS λ°ν/κ²°κ³Ό μλΉ, Redis μν κ΄λ¦¬, WebSocket μ΄λ²€νΈ μ€κ³λ₯Ό λ΄λΉν©λλ€.
- PostgreSQLμ μ¬μ©μ, 리ν¬νΈ, νμ΄μ§, μλ리μ€, μ€ν κ²°κ³Όλ₯Ό μ μ₯ν©λλ€.
frontend/
βββ public/ μ μ 리μμ€
βββ src/
β βββ api/ REST API, WebSocket client
β βββ components/ κ³΅ν΅ UI λ° λ μ΄μμ μ»΄ν¬λνΈ
β βββ lib/ κ³΅ν΅ μ νΈλ¦¬ν°
β βββ pages/ λΌμ°νΈ λ¨μ νλ©΄
β βββ store/ Zustand μν κ΄λ¦¬
β βββ styles/ μ€νμΌ λ¦¬μμ€
β βββ types/ κ³΅ν΅ νμ
μ μ
β βββ App.tsx
β βββ index.css
β βββ main.tsx
βββ index.html
βββ nginx.conf
βββ package.json
βββ vite.config.ts
βββ tsconfig.json
βββ tailwind.config.js
βββ Dockerfile
βββ Jenkinsfile
- React, TypeScript, Vite κΈ°λ° SPAμ λλ€.
- URL μ λ ₯, λΆμ μ§ν, μλλ¦¬μ€ κ²ν , QA μ€ν νν©, κ²°κ³Ό 리ν¬νΈ, νμ€ν 리 νλ©΄μ μ 곡ν©λλ€.
- WebSocket μ΄λ²€νΈλ₯Ό ꡬλ ν΄ QA νμ΄νλΌμΈ μνλ₯Ό μ€μκ°μΌλ‘ λ°μν©λλ€.
ai/
βββ app/
β βββ main.py FastAPI μνΈλ¦¬ν¬μΈνΈ
β βββ model_service.py λͺ¨λΈ λ‘λ© λ° μΆλ‘ μλΉμ€
β βββ schemas.py μμ²/μλ΅ μ€ν€λ§
β βββ worker.py SQS κΈ°λ° AI Worker
β βββ services/ AI λλ©μΈ μλΉμ€
βββ docs/ AI μλ² λ¬Έμ
βββ inference/ λ³λ μΆλ‘ μλ² λ° λ°°ν¬ λ³΄μ‘° νμΌ
β βββ server.py
β βββ worker.py
β βββ proxy.py
β βββ startup-script.sh
βββ models/ λ‘컬 λͺ¨λΈ/μ΄λν° μ μ₯ μμΉ
βββ scripts/ μ€ν 보쑰 μ€ν¬λ¦½νΈ
βββ requirements.txt
βββ Dockerfile
- FastAPI κΈ°λ° AI μλ²μ SQS κΈ°λ° AI Workerλ₯Ό ν¬ν¨ν©λλ€.
- λΆμ μ°μΆλ¬Όμ μ λ ₯μΌλ‘ λ°μ QA μλ리μ€λ₯Ό μμ±νκ³ , κ²°κ³Όλ₯Ό S3μ SQS result queueλ‘ μ λ¬ν©λλ€.
- μ΄μ νκ²½μμλ ECS GPU Workerμ λͺ¨λΈ μΊμ κ²½λ‘λ₯Ό μ¬μ©ν©λλ€.
playwright/
βββ config/ Worker μ€μ
βββ outputs/ λ‘컬 μ€ν μ°μΆλ¬Ό
βββ public/ μ μ νμΈμ© 리μμ€
βββ src/
β βββ core/ Playwright λΆμ/μ€ν ν΅μ¬ λ‘μ§
β βββ http/ HTTP μλ² λ° health check
β βββ infra/ AWS, Redis λ± μΈλΆ μΈνλΌ μ°λ
β βββ scripts/ μ 리/μ΄μ 보쑰 μ€ν¬λ¦½νΈ
β βββ worker/ SQS polling Worker
β βββ index.js Worker μνΈλ¦¬ν¬μΈνΈ
βββ package.json
βββ Dockerfile
βββ Jenkinsfile
βββ web.md
βββ WIKI.md
- Node.jsμ Playwright κΈ°λ° μ컀μ λλ€.
- SQS queueλ₯Ό long pollingνμ¬ νμ΄μ§ λΆμ μμ κ³Ό QA μ€ν μμ μ μ²λ¦¬ν©λλ€.
- μ€ν¬λ¦°μ·, DOM JSON, 리ν¬νΈ, μμ λ± μ€ν μ°μΆλ¬Όμ S3/MinIOμ μ μ₯νκ³ μ§ν μ΄λ²€νΈλ₯Ό Redisλ‘ λ°νν©λλ€.
infra/
βββ docker-compose.yml λ‘컬 μΈνλΌ(PostgreSQL, Redis, LocalStack, MinIO)
βββ docker-compose.full.yml λ‘컬 μ 체 μ€ν μ€ν
βββ ec2-setup/ λ©μΈ EC2 μ΄μ μ€μ
β βββ docker-compose.yml μ΄μ 컨ν
μ΄λ ꡬμ±
β βββ nginx.conf HTTPS reverse proxy
β βββ jenkins.Dockerfile Jenkins 컀μ€ν
μ΄λ―Έμ§
β βββ casc.yaml Jenkins Configuration as Code
β βββ setup.sh EC2 μ΄κΈ° μ€μ
β βββ cloudwatch-agent.json CloudWatch Agent μ€μ
βββ localstack/ λ‘컬 AWS 리μμ€ μ΄κΈ°ν
βββ scripts/ μΈνλΌ μ΄μ μ€ν¬λ¦½νΈ
βββ terraform/
β βββ README.md
β βββ main/
β βββ vpc.tf
β βββ security_groups.tf
β βββ rds.tf
β βββ sqs.tf
β βββ s3.tf
β βββ ecr.tf
β βββ ecs.tf
β βββ ai_ecs_gpu.tf
β βββ iam.tf
β βββ cloudwatch.tf
β βββ variables.tf
β βββ outputs.tf
β βββ terraform.tfvars.example
βββ SETUP-GUIDE.md
- λ‘컬 κ°λ°μ© Docker Composeμ μ΄μ EC2 μ€μ , Terraform μΈνλΌ μ½λλ₯Ό ν¬ν¨ν©λλ€.
infra/docker-compose.ymlμ PostgreSQL, Redis, LocalStack, MinIOλ§ μ€νν©λλ€.infra/docker-compose.full.ymlμ μΈνλΌμ μ ν리μΌμ΄μ μ 체 μ€νμ ν¨κ» μ€νν©λλ€.infra/terraform/mainμ AWS 리μμ€λ₯Ό μμ±νκ³ κ΄λ¦¬ν©λλ€.
loadtest/
βββ 01-smoke.js κΈ°λ³Έ API smoke test
βββ 02-start-flow.js QA μμ νλ‘μ° λΆν ν
μ€νΈ
βββ 03-scenarios-read.js μλλ¦¬μ€ μ‘°ν λΆν ν
μ€νΈ
βββ 04-websocket.js WebSocket μ°κ²° ν
μ€νΈ
βββ 05-nplus1.js N+1 μ‘°ν μ±λ₯ νμΈ
βββ lib/
β βββ auth.js k6 μΈμ¦ ν¬νΌ
βββ results/ ν
μ€νΈ κ²°κ³Ό μ μ₯ μμΉ
βββ db-seed.sh ν
μ€νΈ λ°μ΄ν° μλ©
βββ db-seed-reportjson.sh 리ν¬νΈ JSON μλ©
βββ setup-test-data.sh Redis/DB ν
μ€νΈ λ°μ΄ν° μ€λΉ
βββ README.md
- k6 κΈ°λ° λΆν ν μ€νΈ μλ리μ€λ₯Ό μ 곡ν©λλ€.
- smoke test, QA μμ νλ‘μ°, μ‘°ν λΆν, WebSocket, N+1 νμΈ μλ리μ€λ₯Ό ν¬ν¨ν©λλ€.
- μμΈν μ¬μ©λ²μ loadtest/README.mdλ₯Ό μ°Έκ³ νμΈμ.
| μ°μΆλ¬Ό | μμΉ |
|---|---|
| ERD | ![]() |
| Swagger API Docs | λ‘컬 Swagger: http://localhost:8080/api/swagger-ui ![]() |
| μμ ν¬νΈν΄λ¦¬μ€ | μμ ν¬νΈν΄λ¦¬μ€ |
| κΈ°λ₯λͺ μΈμ | κΈ°λ₯λͺ μΈμ |
| API λͺ μΈμ | APIλͺ μΈμ |
| λ¬Έμ | λ΄μ© |
|---|---|
| docs/local-run.md | λ‘컬 κ°λ° νκ²½ κ΅¬μ± λ° μ€ν λ°©λ² |
| infra/SETUP-GUIDE.md | μ΄μ μΈνλΌ κ΅¬μΆ λ° EC2 λ°°ν¬ κ°μ΄λ |
| docs/backend/api-overview.md | REST API μλν¬μΈνΈ κ°μ |
| docs/frontend/realtime-events.md | Redis Pub/Sub λ° WebSocket μ΄λ²€νΈ λͺ μΈ |
| docs/backend/qa-pipeline-state-api.md | QA νμ΄νλΌμΈ νμ¬ μν μ‘°ν API |
| docs/playwright/qa-pipeline-sqs-contract.md | SQS κΈ°λ° Playwright λΆμ/μ€ν κ³μ½ |
| docs/playwright/qa-ai-scenario-generation-contract.md | AI μλλ¦¬μ€ μμ± κ³μ½ |
| docs/playwright/playwright-sqs-request-examples.md | Playwright Worker SQS μμ²/κ²μ¦ μμ |
| docs/infra/cloudwatch-server-debug-dashboard.md | CloudWatch λμ보λμ Logs Insights 쿼리 |
| docs/playwright/qa-suite-report-schema.md | QA Suite Report JSON μ€ν€λ§ (λμ보λ μ λ ₯ ν¬λ§·) |
| docs/demo-scenario.md | λ°λͺ¨ μμ° μλλ¦¬μ€ |











