DEV/Backend68 조회 최적화를 위한 인덱스 조회 최적화를 위한 인덱스 Intro. 왜 인덱스를 써야 할까? 우린 주로 데이터를 메모리와 디스크에 저장한다. 그 중에서도 일반적으로 데이터베이스의 저장된 데이터는 실제로 디스크에 저장 된다 모두가 알다시피 디스크는 메모리에 비해 느리지만, 영속성과 가격 측면에서 유리함을 가지고 있기 때문이다 우리가 고민해야 할 점은 결국 디스크에 데이터에 저장해야 하는데 어떻게 효율적으로 데이터를 읽고 쓰냐이다 디스크에 접근하는 방식에 따라서 크게 랜덤 I/O와 순차 I/O 2가지 방법으로 나뉩니다 순차 접근은 연속된 블록의 데이터를 가져오는 것이며, 랜덤 접근은 특정 위치에 있는 데이터를 가져오는 것입니다. 순차 접근은 데이터를 연속적으로 읽거나 쓰는 작업에서 효율적이지만, 랜덤 접근은 특정 위치의 데이터에 접근해.. DEV/Backend 2023. 6. 2. DTO(Data Transfer Object) DTO(Data Transfer Object) - 소프트웨어 시스템에서 데이터를 전송하거나 교환하는데 사용되는 객체 - 비즈니스 계층과 프레젠테이션 계층 사이에서 데이터 전달을 위해 사용 DTO는 "Data Transfer Object"의 약어로, 데이터 전송 객체를 의미합니다. DTO는 소프트웨어 시스템에서 데이터를 전송하거나 교환하는 데 사용되는 객체입니다. 또한, DTO를 사용하지 않아 깊은 곳에 있는 엔티티가 프레젠테이션까지 나가버리면, 엔티티의 내용이 변경 되는 위험도 수반합니다 DTO는 주로 다음과 같은 상황에서 사용됩니다: 서로 다른 서비스나 애플리케이션 간에 데이터를 전송할 때 데이터베이스와 애플리케이션 사이에 데이터를 전송할 때 프레젠테이션 레이어와 비즈니스 레이어 간에 데이터를 전송할 .. DEV/Backend 2023. 6. 2. 정규화 정규화 데이터베이스 설계는 어떤 데이터를 어떻게 저장할 것인가에 대한 결정하는 것입니다 그 중에서도 '정규화’와 '반정규화’는 데이터베이스의 효율성과 성능에 큰 영향을 미칩니다 정규화(Normalization) 정규화란 '중복을 최소화하는 것’입니다. 간단하게 말해서, 동일한 데이터를 여러 곳에 반복하여 저장하지 않는 원칙입니다. 이는 데이터베이스 내에서 데이터의 일관성을 유지하는 데 중요합니다. 예를 들어, 사용자의 주소 정보가 변경되었을 때 정규화된 데이터베이스에서는 해당 사용자의 주소 정보를 단 한 번만 변경하면 되지만, 중복이 허용된 데이터베이스에서는 모든 중복된 주소 정보를 찾아 변경해야 합니다. 하지만 이 방식은 트레이드 오프가 있습니다. 데이터를 읽을 때 항상 원본 데이터를 참조해야 하기 때.. DEV/Backend 2023. 6. 1. 소프트 파싱과 하드 파싱 Soft Parsing과 Hard Parsing 데이터베이스에서의 쿼리 실행에는 Soft Parsing과 Hard Parsing이라는 두 가지 과정이 있습니다. Soft Parsing Soft Parsing은 쿼리가 이전에 실행되어 이미 Parsing 정보가 캐시에 저장된 경우를 의미합니다. 이런 경우에는 SQL 문장을 파싱하고 옵티마이저를 거치는 과정을 생략하고 바로 쿼리를 실행하게 됩니다 이를 통해 시스템 리소스를 절약하고 응답 시간을 단축시킬 수 있습니다. Hard Parsing Hard Parsing은 쿼리가 처음 실행되거나, 캐시에 파싱 정보가 없는 경우에 이루어집니다. 이 때는 SQL 문장을 파싱하고, 옵티마이저를 거쳐 실행 계획을 작성한 후 쿼리를 실행하게 됩니다. 이 과정은 시스템 리소스를.. DEV/Backend 2023. 6. 1. MySQL 아키텍처 MySQL 아키텍처 일반적으로 MySQL 서버와 통신을 할 때는 위와 같은 그림으로 동작합니다 웹 서버에서는 MySQL 서버와 통신하기 위한 컴포넌트인 커넥터를 사용합니다 커넥터는 MySQL 서버와의 연결을 설정하고, 쿼리 및 다른 데이터베이스 작업을 수행하기 위한 인터페이스를 제공하죠 그 대표적인 예시로 JDBC가 있습니다 MySQL 서버 아키테처를 이해하기 위해서는 주요한 컴포넌트들을 알아야 합니다. 이는 MySQL 엔진, 스토리지 엔진, 운영체제, 그리고 디스크로 구성되어 있습니다. MySQL 엔진 MySQL 엔진은 쿼리 파서, 전처리기, 옵티마이저, 그리고 쿼리 실행기로 구성되어 있습니다. 쿼리 파서 쿼리 파서는 사용자로부터 입력 받은 SQL을 파싱하여 Syntax tree를 생성합니다 이 과정에.. DEV/Backend 2023. 6. 1. 대용량 시스템 아키텍처 대용량 시스템 아키텍처 왜 대용량 처리는 어려운가? 부하가 상당하여 단일 서버나 데이터베이스로는 감당하기 어려운 상황에서, 서버의 스케일 업과 스케일 아웃에서 고민했듯이 다수의 서버와 데이터베이스를 하나처럼 운영해야 한다. 하지만, 동기화와 데이터 일관성 문제 등이 복잡하게 얽혀있다 게다가, 웹 서비스들은 24시간 무중단 운영을 전제로 하므로, 잘못된 코드 한 줄이 서비스 전체에 영향을 미치는 범위가 큽니다. 그리고, 서비스 간 복잡하게 얽힌 의존성은 시스템 복잡도를 급격히 증가시킵니다. 대용량 처리시 지켜야 할 점 고가용성 사용자는 언제든지 서비스를 이용할 수 있어야 합니다. 장애 점을 최소화하고 복구 시간을 단축하는 데에 중점을 두어야 합니다. 확장성 시스템 규모와 사용자 수가 증가하면서 데이터와 트.. DEV/Backend 2023. 6. 1. 서버의 스케일 업과 스케일 아웃 스케일 업과 스케일 아웃 클라이언트 입장에서 서비스는 항상 일관된 결과를 반환해야 합니다 하지만 서비스가 발전하면 시스템은 복잡해집니다 또한, 웹 서버를 단순히 늘리는 것만으로는 성능 향상의 한계에 부딪히게 되죠 부족한 리소스를 극복하기 위해 서버의 갯수를 늘리느냐, 크기를 키우느냐에 엔지니어들은 직면하게 됩니다 오늘은 이 문제에 대해 이야기 해봅시다 스케일 업과 스케일 아웃 정의 스케일 업(Scale-Up) 스케일 업이란 하나의 서버의 성능을 향상시키는 방식을 의미합니다. 예를 들면, 서버에 CPU나 RAM을 추가하거나, 디스크 용량을 확장하는 방식이 있습니다. 이런 방식은 설계가 간단하고 데이터의 일관성 유지가 비교적 쉽다는 장점이 있지만, 서버 자체의 물리적 한계가 있고 비용이 많이 들 수 있다는 .. DEV/Backend 2023. 6. 1. Session 개요 with Spring Session 개요 with Spring 세션은 사용자의 상태와 데이터를 여러 관련 HTTP 트랜잭션(거래)에 걸쳐 유지하기 위한 메커니즘입니다 세션은 Cookie처럼 여러 HTTP 트랜잭션을 아우를 수 있어, 동일한 브라우저에서의 일련의 요청과 응답을 그룹화 할 수 있습니다 이를 통해 서버는 사용자의 상호작용을 기억하고 웹 애플리케이션을 탐색하는 동안 상태를 유지하게 됩니다 Spring에서는 standard manager가 세션 객체를 만들고 삭제 등의 관리를 합니다 하지만, 세션 저장소의 편리함의 이면에는 서버 부담이 존재하기 때문에 유의해서 사용해야 합니다. 핵심 원리 세션을 인식하는 방법은 간단합니다. 오고가는 HTTP 트랜잭션에 세션 ID를 붙이면 되죠 세션 ID를 붙임으로써 원래 요청과 응답은.. DEV/Backend 2023. 5. 25. Cookie Cookie 쿠키는 ASCII 문자로만 된 이름과 값의 쌍으로 구성된 작은 정보입니다. 보통 쿠키는 클라이언트 식별 기술로 사용됩니다. 서버에서는 저장된 쿠키를 읽어 사용자를 식별합니다 서버에서 생성 되어 사용자의 브라우저로 전송되어 저장됩니다. 이 때 쿠키에는 유효기간, 도메인, 경로도 같이 포함 되어 전송됩니다 유효기간 쿠키에 저장된 유효기간에 도달하면, 쿠키는 자동으로 삭제 됩니다. 또한, 쿠키에는 상대시간과 절대 시간이 모두 기록되어서, 쿠키가 만료 시기를 결정하는데 도움을 줍니다 경로 사용자가 서버에 요청을 보낼 때마다, 브라우저는 요청의 도메인과 경로가 쿠키의 경로와 일치하는 경우에만 요청과 함께 쿠키를 자동으로 보냅니다 Cookie 왜 쓰는가? 쿠키는 HTTP의 Stateless에 기인한 문.. DEV/Backend 2023. 5. 25. Error Cannot find module socket.io Error Cannot Find Module socket.io socket.io를 설치하고 백엔드 서버를 실행 시켰더니 에러가 발생했다. 현재 상황 // socket 등록 fastify.register(fastifyIO); fastify-socket.io를 사용하려면 위와 같이 fastify Instance에 미들웨어를 등록 되어 있음을 확인했다. 미들웨어들을 한 번에 fastifyInstance에 넣도록, 모듈을 만들어뒀는데, 이게 문제가 싶었다 하지만, 에러 트레이스를 보면, node_modules에서부터 문제가 발생 했으므로, 미들웨어 등록 문제는 아니었다. 해결 방법 생각해보니 유독 TS의 경우 js의 superset이라 그런지, 타입이나 인터페이스 등과 함께 원본? 소스가 없어 에러를 겪은 기억.. DEV/Backend 2023. 5. 17. Coturn 시그널링 서버 설치 Coturn 시그널링 서버 설치 1단계: Coturn 설치 STUN 서버이자 TURN 릴레이인 Coturn은 ICE 프로토콜에 필요한 모든 기능을 지원하여 NAT 뒤에서 WebRTC 연결을 가능하게 합니다. Ubuntu 패키지 리포지토리에서 직접 설치할 수 있습니다. sudo apt-get update sudo apt-get install --no-install-recommends coturn 2단계: WebRTC용 Coturn 구성 WebRTC용 Coturn을 설정하려면 /etc/turnserver.conf 파일을 편집해야 합니다. 다음은 WebRTC용 Kurento Media Server와 함께 Coturn을 사용하기 위한 최소 구성 예입니다. # The external IP address of th.. DEV/Backend 2023. 5. 15. Kurento Media Server Docker 설치하는 방법 Kurento Media Server Docker 설치하는 방법 실행 환경 : Ubuntu 20.04 Docker 설치 sudo apt-get udpate sudo apt-get install docker.io Kurento Media Server용 Docker 이미지를 가져옵니다 이 이미지에는 Kurento Media Server의 로컬 apt-get 설치와 모든 추가 플러그인이 포함되어 있습니다. docker pull kurento/kurento-media-server:7.0.0 Docker 컨테이너를 실행합니다. 이 명령은 호스트의 네트워크 스택을 사용하여 Kurento Media Server 이미지로 새 컨테이너를 시작합니다 docker run -d --name kurento --network h.. DEV/Backend 2023. 5. 15. 이전 1 2 3 4 5 6 다음