
개발팀(Dev)
운영팀(Ops)

혼란의 벽(wall of confusion)으로 인한 핑퐁(ping pong) 발생
→ 서비스 지연 발생
개발자의 로컬 환경과
실제 서비스가 돌아가는 프로덕션 환경의 불일치가 원인
이러한 문제를 해결하기 위해 등장한 개념이
데브옵스(DevOps)와 컨테이너(Container)
Docker와 같은 컨테이너 기술을 활용하면
개발 환경을 그대로 패키징하여 서버로 옮길 수 있음 (환경의 표준화)
CI/CD
지속적 통합과 지속적 배포 파이프라인을 구축하면
수동적 배포에 대한 실수를 줄이고 코드의 문제를 자동으로 검증
→ 사용자에게 전달되는 시간을 획기적으로 단축
배치(batch)
일의 집단 또는 한 묶음을 의미
배칭 문제
소프트웨어를 만들고 배포할 때, 너무 많은 양의 변경 사항을
한꺼번에 (Big Batch) 다음 단계로 넘기기 때문에 발생하는 모든 비효율과 위험
디버깅 불가
100만 줄의 코드 더미 속에서 버그 하나를 찾는 것은 불가능에 가까움
빅뱅 리스크(big bang risk)
협업 파괴
조직 내의 silo 현상 발생
batch size를 최소화하여 수시로 배포하고,
즉각적인 피드백을 받는 small batch 전략으로 해결이 가능
(Development + Operation)
협업(Collaboration)
개발과 운영이 한 팀처럼 생각하고 행동함
지속성(Continuous)
한 번 배포하고 끝이 아니라, 계속해서 개선하고 배포함
가치 전달(Value Delivery)
목적은 코딩이 아니라, 사용자에게 가치를 전달하는 것

소스 코드를 검증하는 단계
속도와 정확성을 목표로 코드를 지속적으로 통합
정적 검사(static analysis)
실행 전 오타나 타입 오류, 혹은 팀의 약속과 다른 코딩 스타일이 있는지
린트(Lint)와 타입 체크를 통해 수 초 내에 잡아냄
실행 환경 없이도 가능하기 때문에 가장 빠른 피드백을 줌
단위 테스트
Jest 같은 도구를 활용해 각 모듈이 독립적으로 잘 돌아가는지 확인하는 과정
외부 의존성 없이 비즈니스 로직의 정확성을 소스 레벨에서 보장하며,
소스 레벨의 보안 검사도 동시에 이루어짐
통합 검사
해당 과정을 전부 통과해야 CI Gate가 열리고,
도커 이미지(Artifact)가 만들어짐
아티팩트 전달 및 배포
"이 패키지를 안전하게 사용자에게 보낼 수 있는가?" 에 집중
안정성과 신뢰성을 목표로 결과물을 사람들에게 전달
컨테이너 보안 검사
E2E 테스트
Smoke Test

Continuous Deployment: 지속적 제공
배포 버튼만 누르면 바로 실제 서비스가 가능한 상태로 대기시키는 것
비즈니스적인 관점에 따라 배포 시점을 조절하고 싶을 때 사용
마지막 결정은 사람에 의해 내려짐
Continuous Delivery: 지속적 배포


Instant Verification: 코드를 짜는 즉시 테스트 실행
Final Safety Net: 실전 배포 전 최종 안전장치
Staging Deployment: 스테이징 환경 자동 배포
E2E Testing
DevSecOps
보안 검사까지 왼쪽으로 당기는 개념으로, Shift Left의 일종임
1:10:100 원칙
개발 단계에서 발견한 버그를 수정하는 데에 1원,
통합 단계에서는 10원,
실제 운영 환경에서 발견하면 100원 이상의 비용이 필요함

소스 코드의 가장 작은 단위인 함수나 메서드가
의도한대로 정확히 작동하는지 확인
각각의 부품을 확인하는 것
외부 데이터베이스나 네트워크 연결 같은 외부 요인 완전 배제하고
코드 자체의 로직만 검사
실행 속도가 빠르고 오류 발생 시 어느 부분이 문제인지 바로 찾을 수 있음
범위가 좁고 비용이 낮으며, 빌드 초기 단계에서 수행됨
"할인율 계산 함수에 만 원을 넣었을 때 9천원이라는 값이 제대로 출력되는가?"
애플리케이션과 데이터베이스 또는, 외부 API 간의 연결이 원활한지 확인
서로 다른 모듈들이 결합되었을 때,
데이터가 올바르게 흐르고 상호작용 하는지 검증
컴포넌트 간 연결을 통한 중간 정도의 범위, 실행 속도와 비용이 발생하며, 빌드 후 배포 전에 수행됨
"회원가입을 눌렀을 때, 입력한 정보가 데이터베이스에 정확히 저장되는가?"
실제 사용자 관점에서, 시스템의 처음부터 끝까지 전체 흐름을 시뮬레이션
실제 브라우저를 띄워서 마우스를 클릭하고, 텍스트를 입력하는 등
전체적인 UX, 즉 사용자 경험을 검증
실제 서비스 환경과 가장 유사한 환경에서 테스트하기 때문에 신뢰도가 높음
시스템 전체를 테스트하기 때문에 범위가 매우 넓고,
실행 속도가 느리고 비용이 크며, 스테이징 환경 배포 후 수행됨
사용자가 웹 사이트에 접속해서 상품을 검색하고, 장바구니에 담는 등의 UX
새로운 빌드가 배포된 직후, 소프트웨어의 핵심적인 기능들이
최소한으로 작동하는지 빠르게 확인하는 조기 경보 시스템
테스트를 통과하지 못할 시, 개발팀에 즉시 수정 요청
핵심 기능만을 테스트하여 범위가 좁고, 속도가 빠르며, 비용이 낮음
배포 직후 환경 점검 시 수행됨
서버를 배포한 후 사용자가 로그인 페이지에 접속할 수 있는지

개발 환경 (Dev)
스테이징 환경 (Staging)
운영 환경 (Production)
단위 테스트 (Unit Test)
통합 테스트 (Integration Test)
E2E 테스트 (End-to-End Test)
스모크 테스트 (Smoke Test)

비싸고 느린 테스트일수록 운영에 가까운 환경에서 적게 실행하고,
빠르고 저렴한 테스트일수록 개발 환경에서 최대한 많이 실행하는 것
Smoke Test는 배포 후 생존 확인(Health Verification)의 성격이 강해
피라미드 밖 개념으로도 간주