회사 상황
인프런에서는 기존 레거시 시스템을 개선하는 과정에서
기존 레거시 시스템을 팀마다 복제해서 가져가고
각 팀의 목적에 맞게 점진적으로 개선해 가면서 신규 시스템과 통합했다고 한다.

하지만 현실에서는 팀마다 레거시 시스템을 개선하는 속도에서 차이가 났다고 한다.
인프런은 총 4개의 팀이 있는데 2024년 내에 학습 서비스를 국제화한다는 목표를 가지고 있었기 때문에
모든 팀이 학습 서비스를 국제화하는 프로젝트에 투입되었다고 한다.
이로 인해 학습 서비스와 관련된 팀들이 다른 팀들에 비해 레거시 시스템을 개선하는 속도가 더 빨랐던 것이다.



인프런에서 국제화 서비스를 준비하면서 고려했던 점은 트래픽 비용이다.
무료 강의를 만들어서 홍보하는 과정에서 높은 환율로 인해서 트래픽 비용이 과도하게 발생한다는 것이다.
그래서 비효율적인 트래픽 비용을 개선하는 작업을 했다고 한다.


이미지 포맷 변경
기존 방식
인프런은 AWS 아키텍처를 사용하고 있다.
lambda와 s3를 사용해서 이미지 리사이징을 통해 필요한 크기의 이미지만 제공하고
cloud front를 사용해서 이미지를 캐싱을 통해 이미지 트래픽을 최적화하고 있다.

AVIF 포맷
트래픽 비용을 줄이기 위해 추가적으로 개선하고자 했던 부분은 이미지 파일 포맷을 AVIF로 바꾸는 것이었다.
AVIF는 품질 저하 없이 고효율 압축이 가능하고 대부분의 브라우저에서 지원하고 있다.

기존 아키텍처에서 lambda에 이미지 파일 포맷을 AVIF로 변환하는 로직을 추가했다.
실제로 다른 파일 포맷과 크기를 비교해 보면 AVIF가 얼마나 효율적인지 확인할 수 있다.
이런 과정을 거쳐서 전체 이미지 트래픽의 60퍼센트를 개선했다고 한다.


CDN 캐싱으로 변경
기존 방식
카테고리 같은 경우 데이터베이스에 저장하고 있고 API 서버에서 데이터를 내려주고 있었다.
카테고리는 모든 페이지에서 볼 수 있는데 그러다 보니 트래픽량이 많았고
가장 비싼 자원인 데이터베이스에 부하가 몰리는 구조였다.



캐싱
가장 먼저 고려했던 것은 elastic cache를 도입해서 캐싱을 통해 rds의 부하를 줄이는 것이었다.
하지만 elastic cache를 도입하면서 걸림돌이었던 부분이 있었는데 바로 비용 문제였다.
rds의 스펙을 업그레이드하는 비용이나 elastic cache를 도입하는 비용이나 비슷했다고 한다.

위와 같은 비용 문제를 외부 캐시가 아닌 로컬 캐시를 사용해서 해결했다.
하지만 추가적으로 ec2로 들어오는 트래픽 부하를 개선하고 싶었다고 한다.


ec2로 가는 트래픽을 줄이기 위해 cloud front에서 캐싱하는 방법을 사용했다.
결과적으로 load balancer와 ec2의 트래픽 부하를 모두 줄일 수 있었다.


유의사항
API 응답을 CDN에서 캐싱할 때 header도 캐싱이 되는데
잘 못할 경우 header에 있는 세션 쿠키 정보도 캐싱이 될 수 있다.
cache control 설정을 통해 이를 해결해야 한다.

아키텍처 개선
기존 방식
아래 아키텍처에서 cloud front에서 많은 분기가 일어나고 있는 것을 확인할 수 있는데
path에 따라서 적절한 서버로 전달해주고 있다.

기존 레거시는 express로 되어있고 이를 next로 마이그레이션 하는 작업을 하고 있었다.
이런 상황에서 동일한 path를 사용하고 header 설정에 따라 요청을 express나 next로 전달해주고 싶었다고 한다.
하지만 cloud front에서는 이런 기능을 지원하지 않는다.


Reverse Proxy
reverse proxy를 사용하기로 했고 go 기반의 traefik을 선택했다고 한다.
traefix을 사용하게 되면서 기존 문제 되었던
제한된 route 개수와 복잡한 설정을 통한 분기 처리 문제를 해결 할 수 있었다.

