프로젝트 소개 - f-lab-edu/home-delivery GitHub Wiki

소개

배달의민족, 요기요와 같은 배달플랫폼 기반 서비스를 개발하는 것이 목표인 프로젝트 입니다.
애플리케이션의 UI는 카카오 오븐으로 대체하여 프론트엔드 부분은 생략하고 벡엔드에 초점을 맞춰 백엔드 개발에 주력 하였습니다.

프로젝트 주요 관심사

기능 구현에만 집중하지 않기

  • 개발은 혼자만 진행하는 것이 아니며, 기능구현에만 치중하다보면 무의식적으로 코드를 작성하는 경우가 존재합니다.

  • 그래서 다른 개발자가 내 코드를 보았다고 가정할 때, 어떻게 코드를 작성하는 것이 남이 보았을때 의미를 이해하기 쉬운 코드이며 유지보수에 용이한 코드일까 생각하며 남이 보기좋게 만든 코드를 작성하는 자세를 키워나가고자 합니다.

  • 이를 위해 저희는 PR시 코드 리뷰를 통한 피드백을 통해 기능 구현을 진행하였습니다.

트레이드 오프를 고려한 기술적용

  • 기술들은 대부분 여러가지 장점을 생각하고 적용합니다, 하지만 기술 적용으로 인해 따라오는 단점이 존재합니다.
  • 그래서 기술을 무작정 사용하는 것이 아니라, 이유와 근거로 트레이드 오프를 고려하였는데

본 프로젝트에서는

- Scale-up vs Scale-out
- scale-out 에 따른 세션 정합성 이슈
- 캐싱 전략 및 스토리지 사용 
- 주문 기록을 위한 Nosql vs RDBMS
- Nginx vs Apache
- CI/CD 를 위한 github actions vs Jenkins
- 조회 속도 개선을 위한 인덱싱 사용
- 환경에 독립적인 테스트를 위한 TestContainer 사용

등의 이슈에 관해 이론을 학습 후 명확한 이유와 근거를 가지고 토론을 통해 트레이드 오프를 고려하여 적합한 기술을 사용하였습니다.

서버의 확장성을 고려한 설계

  • 로드밸런싱을 통해 인프라를 확장한다면 서버 한 대에 집중 되는 트래픽을 분산시킬 수 있습니다.
  • 만약 실제 서비스가 운영되어 사용자가 증가함에 따라 모든 트래픽을 서버 한대에 집중된다면 장애시 서비스가 모두 멈춰버리는 상태가 발생합니다.
  • 그래서 본 프로젝트에서는 실제 서비스가 운영된다는 가정하여 사용자가 증가에 따라 발생할 수 있는 트래픽 문제를 고려하여 Nginx 로드밸런서를 사용해 scale-out을 통한 인프라 설계를 진행했습니다.

성능 최적화

  • 기능이 올바르게 작동한다면 대용량 트래픽 속에서도 빠르고 안정적인 서비스를 만드는게 중요합니다.
  • 저희 Home-Delivery프로젝트 서비스에서는 점심, 저녁 피크타임에 트래픽이 몰리는 상황이 발생합니다.
    이를 위해 본 프로젝트에서는
- scale-out 과 Nginx 를 통해 트래픽을 분산하여 확장성과 가용성을 확보하려고 노력하였습니다.
- MySQL 실행 계획을 분석하고 인덱스를 활용하여 속도를 개선 하였습니다.
- 서버 부하를 줄이기 위해 캐시를 적극 활용 하였습니다.
- DISK I/O 를 줄이기 위하여 DB 서버와의 통신을 최소화 하였습니다.
- 비동기를 활용하여 빠른 시간 내에 외부 API 호출을 하도록 구현했습니다

테스트 코드 작성

  • 기능 구현으로 끝나지않고, 구현한 기능을 제대로 테스트 하는 것이 중요합니다.
  • 구현한 기능을 테스트하는 방법으로는 직접 애플리케이션을 실행시켜 테스트 하는 방법이 존재하지만, 반복되는 작업이 있습니다.
1. 애플리케이션이 의존하는 외부 저장소 등 구동중 이어야합니다.

2. 코드 변경이 일어난 경우 테스트를 위해서 매번 컴파일, 빌드 등의 과정을 거친 후 실행을 시켜야합니다. 시간적으로 소모가 되며 개발자가 직접 수동으로 진행해야합니다.

3. API를 테스트하기위해선  필요한 데이터를 기입하는 작업을 추가적으로 해줘야합니다.

4. 테스트를 마치고, DB의 데이터를 정리시켜줘야합니다.

이 과정을 반복해야합니다.
  • 테스트 코드를 활용하면 여러 조건 하의 다양한 시나리오에서 실패, 성공을 확실하게 확인할 수 있습니다.

  • 테스트 케이스를 작성하면서 예상치 못한 문제를 미리 발견하여 보완하게 됩니다.

  • 작성한 코드가 의도한 대로 작동하는지 검증할 수 있습니다.

  • 그래서 구현한 기능에 대하여 Unit TestIntegration Test를 작성함으로써 단위 모듈들의 유효성 검증뿐만아니라 모듈간 결합시 상호작용의 대한 유효성을 검사함으로써 테스트 코드를 바탕으로 신속하고 정확하게 문제가 없음을 보증할 수 있도록 하는 것을 목표로 진행하였습니다.

결과적으로 현재 본 프로젝트에서는 테스트 커버리지 94% 달성을 통해 달성하였습니다.

공식문서 활용하기

  • 공식문서는 블로그 글과는 달리 최신 정보나 변경사항 또는 구조 기능 등에 대해 매우 정확하게 확인할 수 있는 장점이 있습니다.

  • 그러나, 개발을 하다 막히는 부분이 존재하면 구글링에 의존합니다. 공식문서를 읽는 것보단 구글링으로 블로그 글 등을 읽는 것이 빠르게 원하는 정보를 찾을 수 있기 때문입니다.

  • 하지만, 어느정도 숙련도가 올라간다면 블로그에서 다루는 내용으로는 부족할때가 있으며, 틀린경우도 존재합니다.

  • 따라서 빠른 문제해결을 위해 구글링을 통해 해결하기 보단, 공식문서를 읽어 해결하는 습관을 키워나가는 것을 목표로 진행하였습니다.

CI/CD

  • 자동화를 도입하기 전에는 아래와 같은 작업이 매번 반복되는 문제가 있었습니다.
1. 코드 변경 후 테스트 실행
2. 프로젝트 빌드
3. 빌드한 jar 파일을 서버에 전송
4. 전송된 jar 파일을 명령어를 통해 실행
  • 현재 서비스 규모가 작음에도 기능 구현마다 위와 같은 번거로움이 존재하는데 대규모 트래픽을 위한 scale-out 을 진행한다면 개발 생산성이 크게 떨어질 수 있습니다.
  • 따라서 번거로움을 해결하고 개발 생산성 향상을 위해 빌드, 테스트 ,배포 자동화를 도입하였습니다.
⚠️ **GitHub.com Fallback** ⚠️