12월 21, 2025
41 분 읽기

주니어 DevOps 엔지니어 면접 질문: 완벽 가이드

interview
career-advice
job-search
entry-level
주니어 DevOps 엔지니어 면접 질문: 완벽 가이드
MB

Milad Bonakdar

작성자

주니어 DevOps 엔지니어를 위한 Linux, Git, CI/CD, Docker, 클라우드 기본 사항 및 IaC를 다루는 포괄적인 면접 질문으로 필수 DevOps 기본 사항을 마스터하세요.


소개

DevOps 엔지니어링은 개발과 운영을 연결하며 자동화, 협업 및 지속적인 개선에 중점을 둡니다. 주니어 DevOps 엔지니어로서 Linux, 버전 관리, CI/CD 파이프라인, 컨테이너화 및 클라우드 플랫폼에 대한 기본적인 지식이 필요합니다.

이 가이드에서는 주니어 DevOps 엔지니어를 위한 필수 면접 질문을 주제별로 정리하여 효과적으로 준비할 수 있도록 돕습니다. 각 질문에는 자세한 답변, 실제 예제 및 실습 코드 스니펫이 포함되어 있습니다.


Linux 기본 사항

1. DevOps 엔지니어로서 매일 사용하는 일반적인 Linux 명령어를 설명하십시오.

답변: DevOps 작업에 필수적인 Linux 명령어:

# 파일 작업
ls -la                    # 파일 목록을 자세히 표시
cd /var/log              # 디렉토리 변경
cat /etc/hosts           # 파일 내용 표시
tail -f /var/log/app.log # 로그 파일을 실시간으로 추적
grep "error" app.log     # 패턴 검색

# 프로세스 관리
ps aux | grep nginx      # 프로세스 목록 표시
top                      # 시스템 자원 모니터링
kill -9 1234            # 프로세스 강제 종료
systemctl status nginx   # 서비스 상태 확인
systemctl restart nginx  # 서비스 재시작

# 파일 권한
chmod 755 script.sh      # 파일 권한 변경
chown user:group file    # 소유자 변경
ls -l                    # 권한 보기

# 디스크 사용량
df -h                    # 디스크 공간 사용량
du -sh /var/log          # 디렉토리 크기
free -h                  # 메모리 사용량

# 네트워크
netstat -tulpn           # 리스닝 포트 표시
curl https://api.com     # HTTP 요청 보내기
ping google.com          # 연결 테스트
ssh user@server          # 원격 로그인

희소성: 매우 흔함 난이도: 쉬움


2. Linux에서 서비스가 시작되지 않을 때 어떻게 문제를 해결합니까?

답변: 체계적인 문제 해결 접근 방식:

# 1. 서비스 상태 확인
systemctl status nginx
# 오류 메시지 확인

# 2. 로그 확인
journalctl -u nginx -n 50
# 또는
tail -f /var/log/nginx/error.log

# 3. 구성 구문 확인
nginx -t

# 4. 포트가 이미 사용 중인지 확인
netstat -tulpn | grep :80
# 또는
lsof -i :80

# 5. 파일 권한 확인
ls -l /etc/nginx/nginx.conf
ls -ld /var/log/nginx

# 6. 디스크 공간 확인
df -h

# 7. 자세한 내용을 보려면 수동으로 시작해보기
nginx -g 'daemon off;'

# 8. SELinux/AppArmor 확인 (활성화된 경우)
getenforce
ausearch -m avc -ts recent

일반적인 문제:

  • 구성 구문 오류
  • 포트가 이미 사용 중
  • 권한 거부
  • 누락된 종속성
  • 디스크 공간 부족

희소성: 매우 흔함 난이도: 중간


Git을 사용한 버전 관리

3. 기본적인 Git 워크플로우와 일반적인 명령어를 설명하십시오.

답변: DevOps 작업에 대한 Git 워크플로우:

# 저장소 초기화
git init
git clone https://github.com/user/repo.git

# 상태 확인
git status
git log --oneline

# 기본 워크플로우
git add .                    # 변경 사항 스테이징
git commit -m "Add feature"  # 변경 사항 커밋
git push origin main         # 원격 저장소로 푸시

# 브랜치
git branch feature-x         # 브랜치 생성
git checkout feature-x       # 브랜치 전환
git checkout -b feature-y    # 브랜치 생성 및 전환

# 병합
git checkout main
git merge feature-x

# 최신 변경 사항 가져오기
git pull origin main

# 변경 사항 취소
git reset --hard HEAD        # 로컬 변경 사항 삭제
git revert abc123           # 특정 커밋 되돌리기

# 변경 사항 임시 저장
git stash                    # 변경 사항 임시 저장
git stash pop               # 임시 저장된 변경 사항 복원

# 차이점 보기
git diff                     # 스테이징되지 않은 변경 사항
git diff --staged           # 스테이징된 변경 사항

모범 사례:

  • 명확한 커밋 메시지 작성
  • 자주 커밋하고 정기적으로 푸시
  • 기능 브랜치 사용
  • 푸시하기 전에 풀
  • 커밋하기 전에 변경 사항 검토

희소성: 매우 흔함 난이도: 쉬움


4. Git에서 병합 충돌을 어떻게 해결합니까?

답변: 단계별 충돌 해결:

# 1. 병합 시도
git merge feature-branch
# Auto-merging file.txt
# CONFLICT (content): Merge conflict in file.txt

# 2. 충돌된 파일 확인
git status
# Unmerged paths:
#   both modified:   file.txt

# 3. 충돌된 파일 열기
cat file.txt
# <<<<<<< HEAD
# 현재 브랜치 내용
# =======
# 들어오는 브랜치 내용
# >>>>>>> feature-branch

# 4. 파일 편집하여 충돌 해결
# 충돌 마커 제거하고 원하는 변경 사항 유지

# 5. 해결된 파일 스테이징
git add file.txt

# 6. 병합 완료
git commit -m "Resolve merge conflict"

# 대안: 병합 중단
git merge --abort

충돌 마커:

  • <<<<<<< HEAD - 현재 브랜치
  • ======= - 구분 기호
  • >>>>>>> branch-name - 들어오는 변경 사항

희소성: 흔함 난이도: 쉬움-중간


CI/CD 기본 사항

5. CI/CD란 무엇이며 왜 중요한가요?

답변: CI/CD는 Continuous Integration(지속적 통합) 및 Continuous Deployment/Delivery(지속적 배포/전달)를 의미합니다.

Continuous Integration (CI):

  • 모든 커밋에 대해 자동으로 코드 빌드 및 테스트
  • 버그를 조기에 발견
  • 코드가 제대로 통합되도록 보장

Continuous Deployment (CD):

  • 테스트 통과 후 자동으로 프로덕션 환경에 배포
  • 빠른 릴리스 주기
  • 수동 오류 감소
Loading diagram...

장점:

  • 빠른 피드백 루프
  • 통합 문제 감소
  • 자동화된 테스트
  • 일관된 배포
  • 빠른 시장 출시 시간

희소성: 매우 흔함 난이도: 쉬움


6. GitHub Actions를 사용하여 기본적인 CI/CD 파이프라인을 설명하십시오.

답변: GitHub Actions 워크플로우 예제:

# .github/workflows/ci-cd.yml
name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    
    steps:
    - name: Checkout code
      uses: actions/checkout@v3
    
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: '18'
    
    - name: Install dependencies
      run: npm ci
    
    - name: Run tests
      run: npm test
    
    - name: Build application
      run: npm run build
    
    - name: Run linter
      run: npm run lint

  deploy:
    needs: build-and-test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    
    steps:
    - name: Deploy to production
      run: |
        echo "Deploying to production..."
        # 배포 명령어 추가

주요 개념:

  • 트리거: 파이프라인 실행 시점 (푸시, PR, 스케줄)
  • 작업: 병렬로 실행될 수 있는 독립적인 작업
  • 단계: 작업 내의 개별 명령어
  • 아티팩트: 작업 간에 전달되는 파일

희소성: 매우 흔함 난이도: 중간


Docker & 컨테이너화

7. Docker란 무엇이며 컨테이너를 사용하는 이유는 무엇입니까?

답변: Docker는 컨테이너에서 애플리케이션을 개발, 배송 및 실행하기 위한 플랫폼입니다.

컨테이너 vs VM:

  • 컨테이너는 호스트 OS 커널을 공유 (경량)
  • VM은 전체 OS를 포함 (무거움)
  • 컨테이너는 몇 초 안에 시작
  • 더 나은 자원 활용

장점:

  • 일관성: 어디에서나 동일한 환경
  • 격리: 앱이 간섭하지 않음
  • 이식성: 어디서든 실행 가능
  • 효율성: 가볍고 빠름
# Dockerfile 예제
FROM node:18-alpine

WORKDIR /app

COPY package*.json ./
RUN npm ci --only=production

COPY . .

EXPOSE 3000

CMD ["node", "server.js"]

희소성: 매우 흔함 난이도: 쉬움


8. 일반적인 Docker 명령어를 설명하십시오.

답변: 필수 Docker 명령어:

# 이미지
docker pull nginx:latest          # 이미지 다운로드
docker images                     # 이미지 목록 표시
docker rmi nginx:latest          # 이미지 제거
docker build -t myapp:1.0 .      # 이미지 빌드

# 컨테이너
docker run -d -p 80:80 nginx     # 컨테이너 실행
docker ps                         # 실행 중인 컨테이너 목록 표시
docker ps -a                      # 모든 컨테이너 목록 표시
docker stop container_id          # 컨테이너 중지
docker start container_id         # 컨테이너 시작
docker restart container_id       # 컨테이너 재시작
docker rm container_id            # 컨테이너 제거

# 로그 및 디버깅
docker logs container_id          # 로그 보기
docker logs -f container_id       # 로그 추적
docker exec -it container_id bash # 컨테이너 진입
docker inspect container_id       # 상세 정보

# 정리
docker system prune              # 사용하지 않는 데이터 제거
docker volume prune              # 사용하지 않는 볼륨 제거

# Docker Compose
docker-compose up -d             # 서비스 시작
docker-compose down              # 서비스 중지
docker-compose logs -f           # 로그 보기

희소성: 매우 흔함 난이도: 쉬움


9. 웹 애플리케이션과 데이터베이스를 위한 docker-compose.yml을 작성하십시오.

답변: 다중 컨테이너 애플리케이션 예제:

version: '3.8'

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DB_HOST=db
      - DB_PORT=5432
      - DB_NAME=myapp
    depends_on:
      - db
    volumes:
      - ./logs:/app/logs
    restart: unless-stopped

  db:
    image: postgres:15-alpine
    environment:
      - POSTGRES_DB=myapp
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=secret
    volumes:
      - postgres_data:/var/lib/postgresql/data
    ports:
      - "5432:5432"
    restart: unless-stopped

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"
    restart: unless-stopped

volumes:
  postgres_data:

주요 개념:

  • services: 컨테이너 정의
  • depends_on: 서비스 종속성
  • volumes: 영구 데이터 저장소
  • environment: 환경 변수
  • ports: 포트 매핑
  • restart: 재시작 정책

희소성: 흔함 난이도: 중간


클라우드 기본 사항

10. IaaS, PaaS 및 SaaS의 차이점을 설명하십시오.

답변: 클라우드 서비스 모델:

IaaS (Infrastructure as a Service):

  • 제공: 가상 머신, 스토리지, 네트워크
  • 관리: OS, 런타임, 애플리케이션
  • 예: AWS EC2, Azure VMs, Google Compute Engine
  • 사용 사례: 인프라에 대한 완전한 제어

PaaS (Platform as a Service):

  • 제공: 런타임 환경, 데이터베이스, 미들웨어
  • 관리: 애플리케이션 및 데이터
  • 예: AWS Elastic Beanstalk, Heroku, Google App Engine
  • 사용 사례: 인프라가 아닌 코드에 집중

SaaS (Software as a Service):

  • 제공: 완전한 애플리케이션
  • 관리: 사용자 데이터 및 설정
  • 예: Gmail, Salesforce, Office 365
  • 사용 사례: 즉시 사용 가능한 애플리케이션
Loading diagram...

희소성: 흔함 난이도: 쉬움


11. DevOps 엔지니어가 알아야 할 기본적인 AWS 서비스는 무엇입니까?

답변: 필수 AWS 서비스:

컴퓨팅:

  • EC2: 가상 서버
  • Lambda: 서버리스 함수
  • ECS/EKS: 컨테이너 오케스트레이션

스토리지:

  • S3: 객체 스토리지
  • EBS: EC2용 블록 스토리지
  • EFS: 공유 파일 스토리지

네트워킹:

  • VPC: 가상 사설 클라우드
  • Route 53: DNS 서비스
  • CloudFront: CDN
  • ELB: 로드 밸런싱

데이터베이스:

  • RDS: 관리형 관계형 데이터베이스
  • DynamoDB: NoSQL 데이터베이스

DevOps 도구:

  • CodePipeline: CI/CD 서비스
  • CodeBuild: 빌드 서비스
  • CloudWatch: 모니터링 및 로깅
  • IAM: 액세스 관리

예제: AWS CLI로 EC2 인스턴스 시작:

aws ec2 run-instances \
  --image-id ami-0abcdef1234567890 \
  --instance-type t2.micro \
  --key-name my-key-pair \
  --security-group-ids sg-0123456789abcdef0 \
  --subnet-id subnet-0123456789abcdef0 \
  --tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=WebServer}]'

희소성: 매우 흔함 난이도: 중간


Infrastructure as Code

12. Infrastructure as Code (IaC)란 무엇이며 왜 중요한가요?

답변: IaC는 수동 프로세스 대신 코드를 통해 인프라를 관리하는 것입니다.

장점:

  • 버전 관리: 인프라 변경 사항 추적
  • 재현성: 동일한 환경 생성
  • 자동화: 수동 오류 감소
  • 문서화: 코드가 문서 역할
  • 일관성: 어디에서나 동일한 구성

인기 있는 IaC 도구:

  • Terraform: 멀티 클라우드 프로비저닝
  • Ansible: 구성 관리
  • CloudFormation: AWS 전용
  • Pulumi: 코드 기반 IaC

Terraform 예제:

# main.tf
provider "aws" {
  region = "us-east-1"
}

resource "aws_instance" "web" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "WebServer"
    Environment = "Production"
  }
}

resource "aws_security_group" "web_sg" {
  name        = "web-sg"
  description = "Allow HTTP traffic"

  ingress {
    from_port   = 80
    to_port     = 80
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }
}

희소성: 매우 흔함 난이도: 중간


13. 기본적인 Terraform 워크플로우를 설명하십시오.

답변: Terraform 워크플로우 단계:

# 1. Terraform 초기화
terraform init
# 공급자 및 모듈 다운로드

# 2. 코드 포맷
terraform fmt
# .tf 파일 포맷

# 3. 구성 유효성 검사
terraform validate
# 구문 확인

# 4. 변경 사항 계획
terraform plan
# 생성/수정/삭제될 내용 표시

# 5. 변경 사항 적용
terraform apply
# 인프라 생성/업데이트
# 확인 프롬프트 표시

# 6. 상태 보기
terraform show
# 현재 상태 표시

# 7. 인프라 삭제
terraform destroy
# 모든 리소스 제거

Terraform 파일 구조:

project/
├── main.tf          # 기본 구성
├── variables.tf     # 입력 변수
├── outputs.tf       # 출력 값
├── terraform.tfvars # 변수 값
└── .terraform/      # 공급자 플러그인

변수 예제:

# variables.tf
variable "instance_type" {
  description = "EC2 인스턴스 유형"
  type        = string
  default     = "t2.micro"
}

variable "environment" {
  description = "환경 이름"
  type        = string
}

# terraform.tfvars
environment = "production"
instance_type = "t2.small"

희소성: 흔함 난이도: 중간


모니터링 & 로깅

14. 웹 애플리케이션에 대해 어떤 메트릭을 모니터링하시겠습니까?

답변: 주요 모니터링 메트릭:

애플리케이션 메트릭:

  • 응답 시간 / 지연 시간
  • 요청 속도 (초당 요청 수)
  • 오류율 (4xx, 5xx 오류)
  • 처리량

시스템 메트릭:

  • CPU 사용량
  • 메모리 사용량
  • 디스크 I/O
  • 네트워크 I/O

인프라 메트릭:

  • 컨테이너/파드 상태
  • 서비스 가용성
  • 로드 밸런서 상태

Prometheus 쿼리 예제:

# 평균 응답 시간
rate(http_request_duration_seconds_sum[5m])
/ rate(http_request_duration_seconds_count[5m])

# 오류율
sum(rate(http_requests_total{status=~"5.."}[5m]))
/ sum(rate(http_requests_total[5m]))

# CPU 사용량
100 - (avg by (instance) (irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

경고 임계값:

  • 응답 시간 > 500ms
  • 오류율 > 1%
  • CPU 사용량 > 80%
  • 메모리 사용량 > 85%
  • 디스크 사용량 > 90%

희소성: 흔함 난이도: 중간


15. 여러 서버에서 로그를 어떻게 중앙 집중화합니까?

답변: 중앙 집중식 로깅 아키텍처:

Loading diagram...

일반적인 스택 (ELK):

  • Elasticsearch: 로그 저장 및 인덱싱
  • Logstash/Fluentd: 로그 수집 및 처리
  • Kibana: 로그 시각화 및 검색

Filebeat 구성 예제:

# filebeat.yml
filebeat.inputs:
- type: log
  enabled: true
  paths:
    - /var/log/app/*.log
  fields:
    app: myapp
    environment: production

output.elasticsearch:
  hosts: ["elasticsearch:9200"]
  index: "app-logs-%{+yyyy.MM.dd}"

processors:
  - add_host_metadata: ~
  - add_cloud_metadata: ~

모범 사례:

  • 구조화된 로깅 사용 (JSON)
  • 상관 관계 ID 포함
  • 보존 정책 설정
  • 전략적으로 인덱싱
  • 로그 볼륨 모니터링

희소성: 흔함 난이도: 중간


Kubernetes 기본 사항

16. Kubernetes란 무엇이며 기본 구성 요소는 무엇입니까?

답변: Kubernetes는 컨테이너화된 애플리케이션의 배포, 스케일링 및 관리를 자동화하는 컨테이너 오케스트레이션 플랫폼입니다.

기본 구성 요소:

제어 평면:

  • API 서버: 모든 명령의 진입점
  • etcd: 클러스터 데이터용 키-값 저장소
  • 스케줄러: 노드에 파드 할당
  • 컨트롤러 관리자: 원하는 상태 유지

워커 노드:

  • kubelet: 노드에서 파드 관리
  • kube-proxy: 네트워크 라우팅
  • 컨테이너 런타임: 컨테이너 실행 (Docker, containerd)
Loading diagram...

기본 Kubernetes 객체:

1. 파드:

apiVersion: v1
kind: Pod
metadata:
  name: nginx-pod
  labels:
    app: nginx
spec:
  containers:
  - name: nginx
    image: nginx:latest
    ports:
    - containerPort: 80

2. 배포:

apiVersion: apps/v1
kind: Deployment
metadata:
  name: nginx-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: nginx
  template:
    metadata:
      labels:
        app: nginx
    spec:
      containers:
      - name: nginx
        image: nginx:1.21
        ports:
        - containerPort: 80

3. 서비스:

apiVersion: v1
kind: Service
metadata:
  name: nginx-service
spec:
  selector:
    app: nginx
  ports:
  - protocol: TCP
    port: 80
    targetPort: 80
  type: LoadBalancer

일반적인 kubectl 명령어:

# 리소스 가져오기
kubectl get pods
kubectl get deployments
kubectl get services

# 리소스 설명
kubectl describe pod nginx-pod

# 파일에서 생성
kubectl apply -f deployment.yaml

# 리소스 삭제
kubectl delete pod nginx-pod

# 로그 보기
kubectl logs nginx-pod

# 파드에서 명령어 실행
kubectl exec -it nginx-pod -- /bin/bash

# 포트 포워딩
kubectl port-forward pod/nginx-pod 8080:80

희소성: 매우 흔함 난이도: 쉬움


구성 관리

17. Ansible 기본 사항을 설명하고 간단한 플레이북을 작성하십시오.

답변: Ansible은 SSH를 사용하여 서버를 구성하는 에이전트리스 구성 관리 도구입니다.

주요 개념:

  • 인벤토리: 관리할 서버 목록
  • 플레이북: 작업을 정의하는 YAML 파일
  • 모듈: 재사용 가능한 작업 단위
  • 역할: 구성된 작업 모음

인벤토리 파일:

# inventory.ini
[webservers]
web1.example.com
web2.example.com

[databases]
db1.example.com

[all: vars]
ansible_user=ubuntu
ansible_ssh_private_key_file=~/.ssh/id_rsa

간단한 플레이북:

# playbook.yml
---
- name: 웹 서버 설정
  hosts: webservers
  become: yes
  
  vars:
    app_port: 8080
    app_user: webapp
  
  tasks:
    - name: apt 캐시 업데이트
      apt:
        update_cache: yes
        cache_valid_time: 3600
    
    - name: 필수 패키지 설치
      apt:
        name:
          - nginx
          - python3
          - git
        state: present
    
    - name: 애플리케이션 사용자 생성
      user:
        name: "{{ app_user }}"
        shell: /bin/bash
        create_home: yes
    
    - name: nginx 구성 복사
      template:
        src: templates/nginx.conf.j2
        dest: /etc/nginx/sites-available/default
      notify: nginx 재시작
    
    - name: nginx가 실행 중인지 확인
      service:
        name: nginx
        state: started
        enabled: yes
    
    - name: 애플리케이션 배포
      git:
        repo: https://github.com/example/app.git
        dest: /var/www/app
        version: main
      become_user: "{{ app_user }}"
  
  handlers:
    - name: nginx 재시작
      service:
        name: nginx
        state: restarted

템플릿 예제:

# templates/nginx.conf.j2
server {
    listen {{ app_port }};
    server_name {{ ansible_hostname }};
    
    location / {
        proxy_pass http://localhost:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
    }
}

플레이북 실행:

# 구문 확인
ansible-playbook playbook.yml --syntax-check

# 드라이 런 (체크 모드)
ansible-playbook playbook.yml --check

# 플레이북 실행
ansible-playbook -i inventory.ini playbook.yml

# 특정 태그로 실행
ansible-playbook playbook.yml --tags "deploy"

# 특정 호스트로 제한
ansible-playbook playbook.yml --limit webservers

Ansible 역할 구조:

roles/
└── webserver/
    ├── tasks/
    │   └── main.yml
    ├── handlers/
    │   └── main.yml
    ├── templates/
    │   └── nginx.conf.j2
    ├── files/
    ├── vars/
    │   └── main.yml
    └── defaults/
        └── main.yml

역할 사용:

---
- name: 인프라 설정
  hosts: all
  become: yes
  
  roles:
    - common
    - webserver
    - monitoring

애드혹 명령어:

# 모든 호스트에 핑 보내기
ansible all -i inventory.ini -m ping

# 모든 호스트에서 명령어 실행
ansible all -i inventory.ini -a "uptime"

# 패키지 설치
ansible webservers -i inventory.ini -m apt -a "name=nginx state=present" --become

# 파일 복사
ansible all -i inventory.ini -m copy -a "src=/local/file dest=/remote/file"

# 서비스 재시작
ansible webservers -i inventory.ini -m service -a "name=nginx state=restarted" --become

희소성: 흔함 난이도: 중간


스크립팅 & 자동화

18. 일반적인 DevOps 작업을 자동화하는 bash 스크립트를 작성하십시오.

답변: Bash 스크립팅은 DevOps에서 자동화에 필수적입니다.

예제 1: 백업 스크립트

#!/bin/bash

# 로테이션이 있는 데이터베이스 백업 스크립트
set -e  # 오류 발생 시 종료
set -u  # 정의되지 않은 변수 사용 시 종료

# 구성
DB_NAME="myapp"
DB_USER="backup_user"
BACKUP_DIR="/var/backups/mysql"
RETENTION_DAYS=7
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql.gz"
LOG_FILE="/var/log/mysql_backup.log"

# 메시지 로깅 함수
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}

# 알림 전송 함수
send_notification() {
    local status=$1
    local message=$2
    
    # Slack으로 전송
    curl -X POST -H 'Content-type: application/json' \
        --data "{\"text\":\"Backup ${status}: ${message}\"}" \
        "$SLACK_WEBHOOK_URL"
}

# 백업 디렉토리가 없으면 생성
mkdir -p "$BACKUP_DIR"

# 백업 시작
log "데이터베이스 백업 시작: $DB_NAME"

# 백업 수행
if mysqldump -u "$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" | gzip > "$BACKUP_FILE"; then
    log "백업 성공적으로 완료: $BACKUP_FILE"
    
    # 파일 크기 가져오기
    SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
    log "백업 크기: $SIZE"
    
    # 오래된 백업 제거
    log "$RETENTION_DAYS일 이전의 백업 제거"
    find "$BACKUP_DIR" -name "${DB_NAME}_*.sql.gz" -mtime +$RETENTION_DAYS -delete
    
    # S3에 업로드 (선택 사항)
    if command -v aws &> /dev/null; then
        log "S3에 백업 업로드"
        aws s3 cp "$BACKUP_FILE" "s3://my-backups/mysql/" --storage-class GLACIER
    fi
    
    send_notification "SUCCESS" "데이터베이스 $DB_NAME 백업 성공 ($SIZE)"
else
    log "오류: 백업 실패"
    send_notification "FAILED" "데이터베이스 $DB_NAME 백업 실패"
    exit 1
fi

log "백업 프로세스 완료"

예제 2: 상태 확인 스크립트

#!/bin/bash

# 서비스 상태 확인 스크립트
SERVICES=("nginx" "mysql" "redis")
ENDPOINTS=("http://localhost:80" "http://localhost:8080/health")
ALERT_EMAIL="[email protected]"

check_service() {
    local service=$1
    
    if systemctl is-active --quiet "$service"; then
        echo "✓ $service 실행 중"
        return 0
    else
        echo "✗ $service 실행 중 아님"
        return 1
    fi
}

check_endpoint() {
    local url=$1
    local response=$(curl -s -o /dev/null -w "%{http_code}" "$url")
    
    if [ "$response" -eq 200 ]; then
        echo "✓ $url 정상 (HTTP $response)"
        return 0
    else
        echo "✗ $url 비정상 (HTTP $response)"
        return 1
    fi
}

check_disk_space() {
    local threshold=80
    local usage=$(df -h / | awk 'NR==2 {print $5}' | sed 's/%//')
    
    if [ "$usage" -lt "$threshold" ]; then
        echo "✓ 디스크 사용량: ${usage}%"
        return 0
    else
        echo "✗ 디스크 사용량 위험: ${usage}%"
        return 1
    fi
}

# 메인 상태 확인
echo "=== 시스템 상태 확인 ==="
echo "날짜: $(date)"
echo

failed_checks=0

# 서비스 확인
echo "서비스 확인 중..."
for service in "${SERVICES[@]}"; do
    if ! check_service "$service"; then
        ((failed_checks++))
    fi
done
echo

# 엔드포인트 확인
echo "엔드포인트 확인 중..."
for endpoint in "${ENDPOINTS[@]}"; do
    if ! check_endpoint "$endpoint"; then
        ((failed_checks++))
    fi
done
echo

# 디스크 공간 확인
echo "디스크 공간 확인 중..."
if !
Newsletter subscription

실제로 효과가 있는 주간 커리어 팁

최신 인사이트를 받은 편지함으로 직접 받아보세요

Decorative doodle

지원을 멈추세요. 채용되기 시작하세요.

전 세계 구직자들이 신뢰하는 AI 기반 최적화로 이력서를 면접 자석으로 변환하세요.

무료로 시작하기

이 게시물 공유

50% 더 빠르게 채용되세요

전문적이고 AI로 강화된 이력서를 사용하는 구직자는 표준 10주에 비해 평균 5주 만에 일자리를 얻습니다. 기다리지 말고 면접을 시작하세요.