목차


배운 점

  1. 혼자서 개발하는 것과 팀으로 개발하는 것의 차이
  2. 잘못된 설계를 재설계하는 방법 및 설계의 중요성
  3. 시스템 구축의 어려움
  4. docker 서비스간 의존성 해소 방법
  5. 문제 발생의 주 원인은 휴먼에러다.

진행 내용


진행 과정

팀 해체

결국 해체하기는 했지만, 다른 사람과 협업할 때 그 사람들과 소통하는 방법이나 이를 위해 통합 환경을 구축하는 방법에 대해서 배울 수 있었다. 또한 혼자서 개발을 진행했다면 구체적이고 실현 가능한 목표 설정에는 도달하는데는 지금보다 더 오랜 시간이 걸렸을 것이라 생각한다.


Chat 모듈 구현

Client/Room 로직 재설계 및 구현

image

여러 연결을 서로 가져야 하는 m to n 관계에서 중간 객체를 추가하여 관리하는 방법을 배웠다. 이를 통해 client와 room의 역할을 명확히 구분하고, 각 객체의 역할을 명확히 할 수 있었다. 결과적으로 client와 room의 수명을 분리하여 관리할 수 있게 되는 등 코드의 전반적인 유연성과 가독성이 향상되었다.

디버깅 및 테스트

시스템적으로 사람이 실수할 수 있는 부분을 최소화하기 위한 노력이 많이 필요하고, 이것이 가장 많은 시간을 소요하는 부분이었다. 컴퓨터가 이해하는 코드를 짜는 것은 쉽지만, 사람이 이해하는 코드를 짜는 것은 어렵다.


API 모듈 구현

API 로직 분리 및 테스트 구현

image

handler와 service를 분리하는 이유에 대해 이해할 수 있었다. 이를 구분함으로써 handler는 요청을 받아서 응답을 보내는 역할만 하게 되었고, logic은 handler에게 요청을 받아서 데이터를 처리하는 역할만 하게 되었다. 이를 통해 각각의 테스트 코드를 작성하고 신뢰성을 확보하기 용이하고, 유연한 코드 작성을 통해 코드의 확장성을 높일 수 있었다.

CI 환경 구축

docker-compose

# docker-compose.yml
version: '3'
services:
  postgresql:
    image: postgres:latest
    environment:
      - POSTGRES_DB=postgres
      - POSTGRES_PASSWORD=rootpassword
    ports:
      - "5432:5432"
    volumes:
      - postgresql_data:/var/lib/postgresql/data

  db_init:
    build: ./db_init
    environment:
      - POSTGRES_PASSWORD=rootpassword
    depends_on:
      - postgresql

  redis:
    image: redis:latest
    command: redis-server --requirepass redisPassword
    ports:
      - "6379:6379"
  
  chatroom_list:
    image: redis:latest
    command: redis-server --requirepass redisPassword
    ports:
      - "6380:6380"

  mongodb:
    image: mongo:latest
    ports:
      - "27017:27017"
    volumes:
      - mongodb_data:/data/db
  
  main_server:
    build: ./myapp
    ports:
      - "8080:8080"
    depends_on:
      - postgresql
      - redis
      - mongodb
    environment:
      - REDIS_ADDR=redis:6379
      - REDIS_PASSWORD=redisPassword
      - DB_URL=postgres://postgres:rootpassword@postgresql:5432/postgres?sslmode=disable
      - MONGO_URL=mongodb://mongodb:27017  

  test:
    build: 
      context: ./myapp
      dockerfile: Dockerfile.test
    depends_on:
      - main_server
      - postgresql
      - redis
      - mongodb
      - db_init
    environment:
      - REDIS_ADDR=redis:6379
      - REDIS_PASSWORD=redisPassword
      - DB_URL=postgres://postgres:rootpassword@postgresql:5432/postgres?sslmode=disable
      - MONGO_URL=mongodb://mongodb:27017


volumes:
  postgresql_data:
  mongodb_data:

빌드를 할 경우에, 단순 빌드 뿐 아니라 내부 테스트를 진행하고 오류의 여부에 대해 시스템적으로 확인할 수 있게 됐다. 이를 통해 테스트를 까먹는 경우를 방지하고, 테스트 환경을 구축할 필요가 없어진다. 이를 통해 테스트를 자주 진행할 수 있게 되었고, 테스트를 통해 코드의 신뢰성을 확보할 수 있게 되었다.

github actions

# .github/workflows/ci.yml
name: CI

on:
  pull_request:
    branches: [ main, develop ]

jobs:
  test:
    runs-on: ubuntu-latest

    steps:
    - uses: actions/checkout@v2

    - name: Set up Go
      uses: actions/setup-go@v2
      with:
        go-version: 1.22

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

    - name: Build and Test with docker-compose
      run: |
        docker-compose run --rm test
        docker-compose logs test > test.log
        echo "exit_code=$?" >> $GITHUB_ENV
        docker-compose down

    - name: Upload test log
      uses: actions/upload-artifact@v2
      with:
        name: test-log
        path: test.log

    - name: Exit with code
      run: exit $

여러 모듈을 독립적으로 개발한 뒤 통합하는 과정에서 테스트를 자동화 하는 시스템을 구축했다. 또한 docker 내에서 여러 서비스 간의 의존성을 해결하는 방법을 배웠다.


2024-04-10
카테고리로 돌아가기 ↩