본문 바로가기

Coding/내일배움캠프

[내일배움캠프] 대용량 트래픽 처리, ORM 쿼리 복잡 | 최종 프로젝트 Day 07 | Node.js 4기 | Day 88 | 24.04.01.(월)

13. 대용량 트래픽 발생 시 어떻게 대응해야 하나요?

[내용 정리]

1. 트래픽 모니터링

- 트래픽 패턴을 모니터링하고 분석한다.
- 어떤 유형의 트래픽이 증가하였는지, 어디에서 발생하고 있는지 파악해야 한다.

2. 스케일 업 또는 스케일 아웃

- 대용량 트래픽을 처리하기 위해 서버 자원을 확장한다.
- 수직 확장 또는 수평 확장으로 이루어질 수 있으며, 클라우드 서비스를 활용하면 자원을 쉽게 확장할 수 있다.

3. 로드 밸런싱

- 로드 밸런서를 사용하여 트래픽을 여러 서버로 분산시킨다.
- 이를 통해 단일 서버에 가해지는 부하를 줄일 수 있으며, 가용성도 향상된다.

4. 캐싱

- 정적 콘텐츠를 캐시하여 반복적인 요청에 대한 응답 시간을 줄인다.
- CDN을 사용하여 지리적으로 분산된 캐시 서버를 활용할 수도 있다.
    - CDN(Content Delivery Network)이란?
        - CDN(Content Delivery Network)은 지리적으로 분산된 서버들을 연결한 네트워크로서 웹 컨텐츠의 복사본을 사용자에게 가까운 곳에 두거나 동적 컨텐츠(예: 라이브 비디오 피드)의 전달을 활성화하여 웹 성능 및 속도를 향상할 수 있게 한다.


5. 데이터베이스 최적화

- 데이터베이스는 대용량 트래픽에서 주요 병목구간이 될 수 있다.
- 데이터베이스 쿼리를 최적화하고, 인덱스를 조정하며, 캐싱을 활용하여 데이터베이스 성능을 향상시키자.


1, 2, 3, 4, 5는 장기적인 관점인 것으로 보임.
왜냐? 서버가 정상적으로 작동하기 위해서는 대용량 트래픽을 처리할 수 있어야 하기 때문. 대용량 트래픽을 처리하지 못한다면 서버가 정상적으로 작동하지 않게 되고, 이것은 곧 서버가 터졌다는 것을 의미한다.

** 서버가 터지는 이유? **

- 메모리 오버 플로우
- 큐 오버플로우
- 타임아웃

** 데이터를 말아올린다? **

비동기식 통신(Asynchronous Communication)

MQ(Message Queue)
- IBM MQ
- Apache ActiveMQ
- RabbitMQ

** 비동기 처리 **

- 특정 로직의 실행이 끝날 때까지 기다려주지 않고 나머지 코드를 먼저 실행하는 것

[답변]

대용량 트래픽은 서버를 운영하는 과정에서 항상 신경 써야 하는 부분입니다. 어떤 트래픽 유형의 증가했는지, 어디에서 증가했는지 항상 모니터링 해주어야 합니다. 트래픽 모니터링을 통해 파악한 대용량 트래픽을 처리하기 위해서, 4가지 방법이 존재합니다. 첫 번째로, 클라우드 서비스를 활용한 스케일업 또는 스케일다운 방식으로 서버를 확장하여 대용량 트래픽을 처리합니다. 두 번째로, 로드 밸런서를 활용하여 트래픽을 여러 서버로 분산시켜 대용량 트래픽을 처리할 수 있습니다. 세 번째로, 캐싱을 활용할 수 있습니다. 캐싱을 활용하여 반복적인 요청에 대한 응답 속도를 줄일 수 있고, CDN을 통해 지리적으로 분산된 캐시 서버를 사용할 수도 있습니다. 네 번째로, 데이터베이스 최적화입니다. 어떻게 보면 아주 기초적인 단계라고 생각할 수도 있겠지만, 타 서비스를 사용하지 않고 데이터베이스 쿼리 최적화, 인덱스, 캐싱을 활용하여 자체적으로 데이터베이스 성능을 향상시킬 수 있다면, 적은 비용으로도 좋은 성능을 낼 수 있지 않을까 예상해봅니다.

[추가 질문]

[피드백]

장단점이 뭔지 .. 컴퓨터 하이러레키 .. 소프트웨어 아키텍쳐를 바탕으로 캐시에 대한 이해 .. 자세히 설명해주면 좋을 것 같다..

14. ORM을 사용하면서 쿼리가 복잡해지는 경우에는 어떻게 해결하는 게 좋을까요?

[내용 정리]

- 쿼리 최적화
    - ORM으로 생성된 쿼리를 분석하고 필요한 경우 최적화를 진행.
    - 예를 들어, 불필요한 JSON이나 서브쿼리를 제거하고, 인덱스를 적절히 활용하는 등의 작업을 수행할 수 있습니다.
- 로우 레벨 쿼리 사용
    - ORM을 사용하더라도 특정 쿼리에 대해서는 로우 레벨 쿼리(직접 SQL문을 작성하는 방식)를 사용하는 것이 효율적일 수 있습니다.
    - 복잡한 쿼리의 경우 ORM을 통한 처리보다 직접 SQL 문을 작성하는 것이 더 성능이 좋을 수 있습니다.
- 배치 처리
    - 여러 개의 데이터베이스 작업을 한 번에 처리하여 네트워크 오버헤드를 줄이는 배치 처리를 고려합니다.
        - 배치 처리란 무엇인가요?
            - 배치 처리는 컴퓨터가 주기적으로 대량의 반복적인 데이터 작업을 완료하기 위해 사용하는 방식입니다.
- 캐싱
    - 자주 사용되는 데이터나 쿼리 결과를 캐시에 저장하여 빠르게 접근할 수 있도록 합니다.
- 커넥션 풀링
    - 데이터베이스 커넥션을 재사용하여 커넥션 생성 및 소멸에 드는 오버헤드를 줄입니다.
- N+1 쿼리 문제 해결
    - ORM을 사용할 때 발생할 수 있는 N+1 쿼리 문제를 해결하기 위해 즉시 로딩(Eager Loading) 또는 지연 로딩(Lazy Loading) 등을 적절히 활용합니다.
    - N+1 문제란?
        - 연관 관계에서 발생하는 이슈로 연관 관계가 설정된 엔티티를 조회할 경우에 조회된 데이터 갯수(n)만큼 연관관계의 조회 쿼리가 추가로 발생하여 데이터를 읽어오게 된다. 이를 N+1 문제라고 한다.
- 프로젝션
    - 필요한 필드만 선택하여 데이터를 조회하는 프로젝션 기능을 사용하여 데이터 전송량을 줄입니다.
- 페이지네이션
    - 한 번에 많은 양의 데이터를 불러오는 대신, 필요한 만큼만 데이터를 불러오도록 페이지네이션을 사용한다.

[답변]

ORM을 사용하며 쿼리가 복잡해지는 경우에는, ORM으로 생성된 쿼리를 분석하고 필요한 경우 최적화를 진행하는 방법과, 특정 쿼리에 한해 로우 레벨 쿼리로 직접 SQL 문을 작성하는 방식을 통해 성능을 개선할 수 있습니다. 또한, 배치 처리와 네트워크 오버헤드를, 커넥션 풀링을 통해 커넥션 생성 및 소멸에 드는 오버헤드를 줄일 수 있습니다. 이외에도 캐싱을 통해 데이터에 빠르게 접근할 수 있고, 즉시 로딩 또는 지연 로딩을 통해 N+1 문제를 해결할 수 있고, 프로젝션과 페이지네이션 사용을 통해 성능을 개선할 수 있습니다.

[추가 질문]

[피드백]

ORM 맹신론자, ORM 불신론자
케바케 언제 ORM 쓸 거냐?
ORM을 사용해야 할 경우와 사용하지 않아야 할 경우에 대해 생각해보셨으면 좋겠고
ORM .. TypeORM .. 등등등 .. 여러 가지 ORM 망설임없이 사용할 수 있는 실력 .. ORM 쓰지 않아야 하는 제약 조건 있어야 한다면 잘 사용 ..

DB .. Primary Key .. Foreign Key .. 정규화 ..

정규화, 역정규화 역시 통용되는 사례가 다 다르다. 클라이언트 요구사항에 대해 확실히 인지하는 능력 .. 스스로 견적 낼 수 있는 ..

N+1 문제 꼭 공부해보셨으면 좋겠다. 면접에 많이 나올 수 있다.

——

출처

https://dev-dobim.tistory.com/86

https://www.ibm.com/kr-ko/topics/content-delivery-networks

https://velog.io/@songyuheon/CS-Study-ORM을-사용하면서-쿼리가-복잡해지는-경우에는-어떻게-해결하는게-좋을까요

https://aws.amazon.com/ko/what-is/batch-processing/

https://incheol-jung.gitbook.io/docs/q-and-a/spring/n+1

 

 

 

Client does not support authentication protocol requested by server; consider upgrading MySQL client at Handshake.

 

.env 파일 수정으로 해결

 

 

 

테스트 코드 실행 결과

 

 

Git Action

 

구버전 테스트 ..

 

CI의 목표? 어떤 환경에서도 오류가 없음을 검증해야 한다.

 

그래서 다중 버전 검증을 많이 한다.

 

 

  • on

 

  • jobs

 

workflow event : on 하위 …

 

lint .. 문법적으로 세미콜론을 안 붙이거나 .. 아니면 여백이 너무 많거나 .. 또는 메서드 이름을 마음대로 쓰거나 .. 

 

린팅 .. 코딩 컨벤션 .. 

 

 

린팅 진행

 

 

CI 테스트!

 

 

이것이 CI 파이프라인이다~

 

CI : 배포가 있다는 것을 의미. 오류가 없다는 것을 증명한 .

 

가지가지하네..