한 줄 요약
현재까지의 개발 프로세스에 문제점을 느끼고 해결 방안으로 TDD를 도입하기로 결정했습니다. 테스트를 자동화하기 위해 github action workflows를 추가했으며, 런타임 환경이 추가됨에 따라서 환경변수를 정의하는 .env 파일을 분리했습니다.
- TDD 도입
- Github action workflows 추가
- OS: ubuntu-22.04
- DB: mysql 8.0.35 (default)
- Engine: Node.js 20.11.0
- Test: Jest ^29.5.0
- 환경변수(.env) 분리
- .env.prod: 프로덕션 환경
- .env.local: 로컬 개발 환경
- secrets.ENV_TEST: github action 테스트 환경
개발 프로세스 문제점
1. 지금 API 테스트 가능한가요?
프론트와 협업을 진행하면서 API 테스트가 가능한지 매번 질문이 들어왔습니다. 물론 백엔드에서 Nest.js에 대한 러닝커브로 인해 진도가 많이 느린 상황이었지만, 일부 API는 구현이 완료되어도 자신의 코드에 신뢰를 할 수 없어서 항상 "가능은 한데.."라며 애매하게 답변할 뿐이었습니다.
현재 어느정도 개발되었는지 명확하게 개발 상황을 공유하기 위해서, 그리고 내가 작성한 코드가 제대로 동작하는지 확인하기 위해서 테스트가 필요하다고 생각했습니다.
2. Postman?
처음에는 Nest.js와 데이터베이스에 대한 학습이 부족하다보니 Jest와 같은 테스트 프레임워크까지 학습하여 사용하기에는 버거운 상황이었고 작성한 코드가 제대로 동작하는지 확인하기 위해서는 오직 Postman으로 요청을 보내면서 확인할 수 밖에 없었습니다. 하지만 Postman으로 테스트하는 것은 사람이 직접 API를 요청하고 눈으로 확인해야하기 떄문에 매우 비효율적이고, 디버깅과 단위 테스트를 하기에는 부적합했습니다.
Jest와 같은 테스트 프레임워크에 대한 필요성을 알고있었음에도 시간이 부족해서 일단 빠르게 진행하자고 생각했었지만 코드에 대한 신뢰도가 떨어지고, 코드를 변경할 때마다 변경 지점에 대한 테스트를 직접 하나씩 실행하다보니 오히려 코드 퀄리티는 낮아지면서 시간도 오래걸리는 상황이 발생했습니다.
따라서 프론트 쪽에 양해를 구하고 약간의 러닝커브를 감수하더라도 TDD 방식의 개발 프로세스를 도입하기로 결정했습니다.
TDD
TDD(Test-Driven Development)란 요구사항을 검증하는 자동화된 테스트 케이스를 먼저 작성하고, 그 테스트 케이스를 통과하기 위한 코드를 작성하는 개발 프로세스입니다.
TDD 방식에는 여러가지 장점이 있지만, 우리 프로젝트에서 기대하는 TDD의 효과는 다음과 같습니다.
- 코드에 대한 신뢰도 향상
- 테스트 자동화를 통한 시간 단축
- 요구사항을 명시하여 프론트와 원활한 소통
테스트 코드
테스트는 세 분류로 나눌 수 있습니다.
참고자료
테스트 코드를 왜 그리고 어떻게 작성해야 할까?
현재 우리 프로젝트에는 복잡한 비즈니스 로직이 없어 단위 테스트 보다는 프론트와의 협업을 위한 e2e 테스트가 필요한 상황이었습니다. e2e 테스트는 DB가 갖추어진 상태로 API에 대한 요청을 보내야하므로 테스트를 자동화하기 위해서는 로컬 환경에서 각자 테스트하는 것보다는 github action을 사용하는 것이 자동화하기에 유리할 것이라는 의견이 있었습니다.
Github action
Github action은 CI/CD를 포함한 여러가지 작업을 자동화하는 워크플로를 정의하여 레포지토리에서 바로 실행할 수 있게하는 서비스입니다. .github/workflows 폴더에 yml 파일을 작성하면 자동으로 인식하여 해당 워크플로를 Github에서 제공하는 가상 인스턴스인 Runner에서 실행됩니다.
github action에서 사용되는 핵심 개념으로는 다음과 같습니다.
자세한 내용은 아래 GitHub Actions 설명서를 참고하시면 될 것 같습니다.
❗️ ubuntu-22.04 버전은 mysql 8.0.35가 자동으로 설치됩니다. 따라서 워크플로에 mysql을 도커로 따로 설치하는 불상사가 일어나지 않기를 바랍니다. 어떻게 알았냐구요? 저도 알고싶지 않았습니다...
작성한 워크플로는 다음과 같습니다.
name: Run Tests on Dev Branch
on:
push:
branches:
- dev
pull_request:
branches:
- dev # main <- dev
- feat/* # dev <- feat/*
jobs:
test:
runs-on: ubuntu-22.04
env:
DB_DATABASE: testdb
DB_USER: root
DB_PASSWORD: root
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up MySQL
run: |
sudo /etc/init.d/mysql start
mysql -e 'CREATE DATABASE ${{ env.DB_DATABASE }};' -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }}
mysql -e "CREATE USER 'testuser'@'%' IDENTIFIED WITH caching_sha2_password BY 'testpass';" -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }}
mysql -e "GRANT ALL PRIVILEGES ON *.* TO 'testuser'@'%' WITH GRANT OPTION;" -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }}
mysql -e 'FLUSH PRIVILEGES;' -u${{ env.DB_USER }} -p${{ env.DB_PASSWORD }}
- name: Set up Node.js
uses: actions/setup-node@v4
with:
node-version-file: .nvmrc
cache: npm
- name: Install dependencies
run: npm ci
- name: Add properties
run: echo "${{ secrets.ENV_TEST }}" > ./.env.local
- name: Install nest cli
run: npm install -g @nestjs/cli
- name: Run unit tests
run: npm run test
- name: Run e2e tests
run: npm run test:e2e
참고자료
GitHub Actions 설명서
카카오엔터프라이즈 기술블로그 Tech&(테크앤)
카카오웹툰은 GitHub Actions를 어떻게 사용하고 있을까?
Github Action 사용법 정리
Github Marketplace
How to make MySQL work in your GitHub Actions
'회고록 > Project' 카테고리의 다른 글
[42GG] 데이터 플로우 다이어그램 작성 (0) | 2024.07.26 |
---|---|
[42GG] 효율적인 TestFixture 관리 (0) | 2024.07.22 |
[42GG] UpdateDto와 TestFixture (0) | 2024.07.18 |
[42GG] JPA UPDATE 로직 (영속성 컨텍스트, @DynamicUpdate, 벌크 연산) (0) | 2024.07.17 |
[42Blind] Service 계층 통합 테스트 (0) | 2024.02.25 |