TIL(20240726) [대용량 트래픽 대응과 복잡한 쿼리 해결방법]
- 기술면접 7,8 제출하기
- 튜터님 면담 기술면접 준비
- 대용량 트래픽 발생 시 어떻게 대응해야 하나요?
- 대용량 트래픽 발생 시 대응하는 방법 6가지를 말씀드리면
1) 로드밸런싱을 이용하는 방법으로 로드밸런서는 들어오는 트래픽을 여러 서버에 분산시켜 서버의 과부하를 방지하는데, DNS 로드밸런싱, 하드웨어 로드밸런서, 소프트웨어 로드밸런서를 통해서 시스템의 가용성과 성능을 유지할 수 있습니다.
- DNS 로드 밸런싱: 도메인 네임 시스템(DNS)을 이용해 트래픽을 여러 IP 주소로 분산시킵니다.
- 하드웨어 로드 밸런서: 물리적인 장비를 사용하여 트래픽을 분산합니다.
- 소프트웨어 로드 밸런서: Nginx, HAProxy와 같은 소프트웨어를 사용하여 트래픽을 분산합니다.
2) 캐싱을 이용하는 방법으로는 브라우저 캐싱, CDN, 서버 측 캐싱이 있으며 캐싱은 자주 요청되는 데이터를 미리 저장하여 서버의 부하를 줄이고 응답속도를 높일 수 있습니다.
- 브라우저 캐싱: 클라이언트 측에서 자주 사용하는 리소스를 캐싱합니다.
- CDN (Content Delivery Network): 전 세계에 분산된 서버 네트워크를 사용하여 사용자에게 가까운 서버에서 콘텐츠를 제공함으로써 로드 타임을 줄이고 서버 부하를 분산시킵니다.
- 서버 측 캐싱: Redis, Memcached와 같은 인메모리 데이터베이스를 사용하여 자주 조회되는 데이터를 캐싱합니다.
3) 오토스케일링을 활용하는 방법으로는 클라우드 서비스, 컨테이너 오케스트레이션으로 트래픽 변화에 따라 서버 인스턴스를 자동으로 늘리거나 줄이는 방법입니다.
- 클라우드 서비스: AWS, Google Cloud, Azure 등의 클라우드 서비스에서 제공하는 오토스케일링 기능을 사용합니다.
- 컨테이너 오케스트레이션: Kubernetes를 사용하여 컨테이너 기반 애플리케이션의 스케일링을 자동화합니다.
4) 데이터베이스 성능 최적화 방법입니다. 인덱싱으로 조회 성능을 향상 시킬 수 있고, 쿼리 최적화로 비효율적인 쿼리를 최적화하며, 데이터베이스 샤딩을 통해 데이터를 여러 데이터베이스로 분할하여 저장하고 트래픽을 분산시키는 방법이 있습니다.
- 인덱싱: 자주 조회되는 컬럼에 인덱스를 추가하여 조회 성능을 향상시킵니다.
- 쿼리 최적화: 쿼리의 실행 계획을 분석하고, 비효율적인 쿼리를 최적화합니다.
- 데이터베이스 샤딩: 데이터를 여러 데이터베이스로 분할하여 저장하고, 트래픽을 분산시킵니다.
5) 어플리케이션 자체의 성능을 최적화하여 트래픽을 효율적으로 처리하는 방법으로 코드최적화를 통해 비효율적인 코드를 개선할 수 있고, 비동기 처리를 통해 I/O작업을 효율적으로 처리할 수 있으며, 마이크로서비스 아키텍쳐를 통해 어플리케이션을 독립적인 서비스로 분할하여 각각의 서비스가 독립적으로 확장될 수 있도록 하는 방법이 있습니다.
- 코드 최적화: 비효율적인 코드를 개선하고, 성능을 향상시킵니다.
- 비동기 처리: 비동기 프로그래밍을 통해 I/O 작업을 효율적으로 처리합니다.
- 마이크로서비스 아키텍처: 애플리케이션을 여러 독립적인 서비스로 분할하여 각각의 서비스가 독립적으로 확장될 수 있도록 합니다.
마지막으로 실시간으로 시스템 상태를 모니터링하고 이상징후 발생시 즉시 대응하여 대용량 트래픽에 대응하는 방법이 있습니다. 위와 같은 전략과 기술을 종합적으로 활용하면 대용량 트래픽 발생시에도 시스템 안정성과 성능을 유지할 수 있습니다.
- ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는게 좋을까요?
- 1) 네이티브 SQL쿼리를 사용, 2) 서브쿼리를 활용하여 성능최적화, 유연성 증가와 가독성을 향상시킬 수 있으며 3) Mybatis를 활용하게 되면 동적 SQL을 사용할 수 있고 복잡한 조인, 서브쿼리, 집계함수 등을 사용하여 처리할 수 있습니다. Mybatis를 활용하면 직관성을 높이고 유연성 향상과 성능최적화를 극대화 할 수 있습니다. 또 4) QueryDSL통해서 활용할 수 있는데요, 안전한 쿼리를 작성하고 메서드 체인 방식으로 쿼리를 구성하기에 가독성이 높고 유지보수 측면에서 좋으며 또한, 동적쿼리를 작성할 수 있습니다. (BooleanExpression,BooleanBuilder)
GET, POST의 개념과 함께 데이터 흐름에 대해서 설명해주세요.
OSI 7계층에 대해 아는대로 설명해주세요.
세션 기반 인증과 토큰 기반 인증의 차이에 대해 설명해주세요.
JWT, Refresh, Access Token에 대해서 설명해주세요.
OAuth에 대해서 설명해주세요.
클래스형과 함수형의 차이를 설명해주세요. 어떤 방식을 주로 사용하였고 그 이유가 뭔지 답변해주세요.
CI/CD에 대해서 설명해주세요.
TDD에 대해서 설명해주세요.
프로세스와 쓰레드에 대해서 설명하고 그 차이에 대해서 설명해주세요.
멀티프로세스와 멀티쓰레드의 특징에 대해 설명해주세요.
쿼리 최적화에 대해 설명해주시고 방법에 대해 설명해주세요.
DB 로직 최소화를 하려면 어떻게 해야 할까요?
테스트코드에 대해서 아는대로 설명해주시고 활용 경험에 대해서 답변해주세요.
Array, LinkedList에 대해 설명해주시고 각각 어떻게 사용하는지 말씀해주세요.
AWS S3, EC2를 사용하는 이유와 사용 경험에 대해서 답변해주세요.
정렬 알고리즘에 대해서 아는대로 설명해주세요.
Array, LinkedList에 대해 설명해주시고 각각 어떻게 사용하는지 말씀해주세요.
AWS S3, EC2를 사용하는 이유와 사용 경험에 대해서 답변해주세요.
정렬 알고리즘에 대해서 아는대로 설명해주세요. –>