프로젝트 소개 - 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 Test
와Integration Test
를 작성함으로써 단위 모듈들의 유효성 검증뿐만아니라 모듈간 결합시 상호작용의 대한 유효성을 검사함으로써 테스트 코드를 바탕으로 신속하고 정확하게 문제가 없음을 보증할 수 있도록 하는 것을 목표로 진행하였습니다.
결과적으로 현재 본 프로젝트에서는 테스트 커버리지 94%
달성을 통해 달성하였습니다.
-
공식문서는 블로그 글과는 달리 최신 정보나 변경사항 또는 구조 기능 등에 대해 매우
정확
하게 확인할 수 있는 장점이 있습니다. -
그러나, 개발을 하다 막히는 부분이 존재하면 구글링에 의존합니다. 공식문서를 읽는 것보단 구글링으로 블로그 글 등을 읽는 것이 빠르게 원하는 정보를 찾을 수 있기 때문입니다.
-
하지만, 어느정도 숙련도가 올라간다면 블로그에서 다루는 내용으로는 부족할때가 있으며, 틀린경우도 존재합니다.
-
따라서 빠른 문제해결을 위해 구글링을 통해 해결하기 보단, 공식문서를 읽어 해결하는 습관을 키워나가는 것을 목표로 진행하였습니다.
- 자동화를 도입하기 전에는 아래와 같은 작업이 매번 반복되는 문제가 있었습니다.
1. 코드 변경 후 테스트 실행
2. 프로젝트 빌드
3. 빌드한 jar 파일을 서버에 전송
4. 전송된 jar 파일을 명령어를 통해 실행
- 현재 서비스 규모가 작음에도 기능 구현마다 위와 같은 번거로움이 존재하는데 대규모 트래픽을 위한 scale-out 을 진행한다면 개발 생산성이 크게 떨어질 수 있습니다.
- 따라서 번거로움을 해결하고 개발 생산성 향상을 위해 빌드, 테스트 ,배포 자동화를 도입하였습니다.