카테고리 없음
최종 프로젝트 기술스텍
suuuki
2025. 1. 7. 21:41
1. 기술적 의사 결정
1. 인프라는 어떻게 설계하는게 좋을까?
도입
- 클라우드 서비스 전체에서 32%를 점유하고 있는 AWS 서비스를 이용
- 부하 분산에 유리한 인프라 설계
문제상황
- 외부 사용자가 백엔드 서버에 바로 접근할 수 없어야 함
- 데이터 탈취가 일어나지 않아야 함
- 부하가 분산되어야 함
- 스케일업보다 스케일아웃을 활용
의견 조율
- NLB vsALB 사용 여부 결정
- NLB
- L4계층에서 동작하며, 트래픽 부하 분산만 제공
- TCP/UDP 트래픽 처리
- 여러 개의 NLB를 사용해야 하므로 비용이 증가
- ALB
- L7계층에서 동작하며, 도메인 별로 분기 처리를 지원
- HTTP/HTTPS 트래픽 처리
- ALB 하나만으로 모든 도메인 요청을 각 백엔드로 분기 처리 가
- NLB
- RDS 사용 여부 결정
- RDS
- 고가
- 데이터 안정성
- 비교적 제어력이 떨어짐
- 고가용성을 위한 장애조치를 지원
- EC2 및 Docker
- 저가
- 서버 초기 설정을 해야 함
- 비교적 유연한 설정이 가능함
- 모니터링 시 직접 관리가 필요
- RDS
- Docker Swarm or ELB (EC2 Load Balancer)
- Docker Swarm
- Dokcer에서 제공하는 컨테이너 오케스트레이션 도구
- 무료로 사용이 가능
- 내장형 컨테이너 로드 밸런싱 제공
- ELB
- AWS에서 제공하는 로드 밸런싱
- 사용량 기반 비용 발생
- 애플리케이션 및 네트워크 로드밸런싱이 가능
- 높은 트래픽과 복잡한 로드밸런싱의 요구사항이 있는 경우 유리
- Docker Swarm
결정
- NLB vsALB
- 프론트엔드 구현을 위해 애플리케이션 계층의 로드 밸런싱(ALB)을 사용
- RDS를 사용하지 않고 EC2에 Docker를 이용해 DB를 구축하기로 결정
- EC2는 RDS보다 더 유연한 비용 구조를 제공
- 데이터 관리의 유연성
- Docker Swarm or ELB (EC2 Load Balancer)
- ELB를 사용하기로 결정
- Docker Swarm은 직접 노드를 구성하고 클러스터를 유지해야 하지만, ELB는 AWS가 모든 관리를 수행하여 관리가 간편함
- AWS Auto Scaling과 연동하여 손쉽게 수평 확장이 가능함
- ELB를 사용하기로 결정
2. 인증, 인가 시 JWT vs Session 결정
도입
- JWT를 도입하여 사용자 인증/인가를 구현
문제상황
- 분산 서비스에 유리해야 함
- 서버에 부담을 최소화해야 함
- 권한 확장이 유리해야 함
- SNS 로그인 연동이 가능해야 함
의견 조율
- JWT
- 서버 간 세션 동기화가 필요하지 않으므로 서버 수평적 확장이 용이
- 서버로부터 받은 토큰만을 사용하여 인증을 진행하므로, 서버 측에서 상태를 유지할 필요 없음
- Session
- 사용자의 인증정보를 서버에 저장하기 때문에 서버에 부하를 줄 수 있음
- 서버 간 세션 동기화가 필요하여, 여러 서버를 사용하는 분산 시스템에서는 관리가 복잡
결정
- 기존의 세션 방식은 확장성과 서버 부하 관리 측면에서 한계가 있어, 무상태 인증을 지원하고 분산 서비스에 더 유리한 JWT를 사용하기로 결정
3. CI/CD 자동화 배포 툴 결정
도입
- Docker와 Github Actions를 도입
문제상황
- 수동 배포를 하면 초기 설정은 간단하나, 지속적인 유지보수가 필요함
- GitHub 레포지토리와 밀접하게 통합되는 것이 좋음
의견 조율
- Jenkins or Github Actions
- Jenkins
- 1,800개 이상의 플러그인 제공
- 무료로 사용 가능하며 커스터마이징 가능
- 거의 모든 언어와 플랫폼 지원
- 초보자에게 설정과 관리가 어려울 수 있음
- UI가 오래돼서, 현대적인 인터페이스와는 다소 거리감이 있음
- 유지보수와 업데이트가 필요
- Github Actions
- GitHub 리포지토리와 원활하게 연동
- YAML 파일만으로 워크플로 작성 가능
- 기본 사용량은 무료(GitHub Free Plan)
- GitHub 외부 서비스와의 통합은 제한적
- 복잡한 배포 환경에서는 한계
- Jenkins
결정
- 결론적으로, 셋업과 유지보수가 간단하면서도 안정적이고 확장 가능한 CI/CD 환경을 구축할 수 있는 Docker, Github Actions을 사용하여 DockerFile로 빌드 및 자동 배포가 되도록 결정함
4. 이미지 업로드 방법은 무엇을 사용할까?
도입
- S3(Simple Storage Service)를 도입하여 이미지를 저장
문제상황
- 이미지 저장 시 서버에 부하를 주지않고 서버 용량을 효율적으로 사용해야함
- 저장공간을 자유롭게 확장할 수 있어야 함
의견 조율
- S3사용과 로컬 스토리지에 이미지를 저장하는 방법
- S3
- 무제한에 가까운 저장공간을 제공
- 트래픽 증가나 저장소 확장이 필요한 경우에도 유연하게 대처 가능
- 글로벌 접근성
- 하드웨어 관리 최소화
- 비용 증가 및 네트워크에 의존성이 높음
- 로컬 스토리지
- 서버 내부에 저장되므로 속도가 매우 빠름
- 비용이 절감됨
- 저장공간이 부족해지면 디스크 추가 등의 OS에 추가 작업이 필요함
- 서버 장애나 데이터 손실에 취약함
- S3
결정
- S3를 사용하여 이미지 저장 시 유연한 저장공간 확장과 하드웨어 관리 최소화 결정
5. Google지도 API를 사용할때 적합한 DB는 무엇일까?
도입
- PostgreSQL를 도입
문제상황
- 구글 지도 API를 활용한 위치 기반 서비스 개발을 위해, 위치 데이터를 효율적으로 처리 할 수 있는 데이터 베이스가 필요
의견 조율
- PostgreSQL + PostGIS
- 공간 데이터를 처리하는 데 매우 강력한 기능을 제공
- 위도/경도와 같은 공간 데이터를 효과적으로 저장하고, 거리 계산, 영역 검색, 반경 검색 등의 고급 공간 쿼리를 처리하는 데 뛰어남
- SQL 표준을 잘 준수하는 데이터베이스로, 복잡한 쿼리와 트랜잭션 처리에서 안정적인 성능을 제공
- 오픈소스로, 많은 커뮤니티와 다양한 문서가 있어 기술 지원을 받기 쉬움
- MySQL
- 설정과 사용이 비교적 간단하며, 많은 웹 애플리케이션에서 기본 데이터베이스로 널리 사용
- 읽기 중심의 워크로드에서 높은 성능을 발휘
- 정규화된 데이터 구조에서 성능이 좋으며, 단순한 쿼리에서 빠른 성능을 자랑
- 공간 데이터를 처리할 수 있는 기능이 존재하지만, 공간 인덱싱은 효율적이지 않음
- 거리 계산이나 복잡한 공간 쿼리에서는 성능이 떨어질 수 있음
결정
결론적으로, 위치 기반 서비스나 공단 데이터를 처리할 때 가장 적합한 PostgreSQL + PostGIS를 사용하기로 결정
2. 안건
아래에 자유롭게 작성!
PostGIS 추가 확장할지, 아니면 docker에서 바로 이용할지