Backend (7) 썸네일형 리스트형 AWS와 Elasticsearch를 이용해 실시간 검색 구현하기 (CDC) [문제 상황]상품을 검색할 때, 검색엔진을 별도로 사용하지 않고 데이터베이스에게 위임하여 사용하고 있습니다. 데이터베이스에서 제공하는 검색기능이 부족하다보니, 원하는 상품을 검색하는데 어려움이 있습니다. 상품을 검색하는데 결과에 나오지 않기 때문에 마치 고객에게는 상품이 없는 것처럼 인식되기도 하였습니다. 그래서 저희는 Elasticsearch를 도입하여 이 문제를 해결하기로 하였습니다. 검색엔진을 사용하는 것은 크게 문제가 되지 않습니다. document를 저장하고 검색할 필드를 통해서 원하는 상품을 조회하는건 어렵지 않습니다. 다만, 문제는 상품의 변화가 실시간으로 검색엔진에 바로 반영되어야 한다는 점입니다. 구체적인 요구사항은 다음과 같습니다. - 상품의 변화가 바로 검색엔진에 반영되어야 한다. -.. AWS RDS Proxy를 통해서 DB 부하분산 효과적으로 이용하기 [문제 상황]제가 근무하는 회사의 도메인은 이커머스입니다. 다른 이커머스 회사도 마찬가지겠지만, 연중 트래픽이 몰리는 시즌이 있습니다. 대표적으로 어버이날, 크리스마스, 명절이 있습니다. 이전까지만 해도 특정 시즌에 트래픽이 몰려도 데이터베이스에 큰 문제가 없었습니다. 그러나, 점차 서비스가 성장하면서 유저가 많아지게 되었습니다. 그러면서 작년 어버이날에 문제가 발생하게 되었습니다. 데이터베이스 연결에 문제가 생기고, 쿼리의 지연이 굉장히 길어지면서 타임 아웃이 발생하는 장애를 겪었습니다. 이를 해결하기 위해 급하게 읽기 전용 데이터베이스를 추가하고, 서버를 재부팅하면서 이를 해결하였습니다. 다만, 이전에 설정했던 읽기전용 데이터베이스에 쿼리 분산이 정상적으로 이뤄지지 않은 것을 확인했습니다. 이 문제에.. Static type language vs Dynamic type language 동적타입언어와 정적타입언어의 차이를 알기 위해, 변수의 타입에 대해서 먼저 알아봅시다. 변수의 타입 변수에 들어갈 데이터의 타입에 따라 나눈 것입니다. (변수가 저장되는 데이터의 종류) C language (정적타입 언어) int, float, char등등 다양한 변수 타입이 존재합니다. 이러한 타입은 컴파일 하면서 결정됩니다. 컴파일 하는 과정에서, #include 헤더파일의 내용을 삽입힙니다. 그러면서 int i = 5를 발견하면 그에 맞는 stack공간에 변수를 할당하여 5를 넣습니다. 모든 코드를 컴파일하면, 링킹을 하여 exe파일을 생성합니다. exe파일을 load하고 프로세스가 실행됩니다. int i = 5는 exe파일이 실행되기 전에 변수의 타입이 정해집니다. 데이터 타입에 1대1 대응하는 .. Function Scope(ES5) vs Block Scope(ES6) 두 scope의 차이를 더 명확하게 알려면, 자바스크립트가 어떻게 자신이 엑세스 할 수 있는 변수를 어떻게 찾가는 지, 실행하는 원리가 어떠한지 알 필요가 있습니다. 자바스크립트의 작동에 필요한 내부 구조에 대해서 알아봅시다. 실행 문맥의 구성 (Execution Context) 자바스크립트는 실행에 필요한 정보를 저장하는 공간이 있습니다. 바로 실행문맥입니다. 실행문맥은 크게 2가지로 나뉩니다. LexicalEnvironment : 블록의 유효범위 안에 있는 식별자와 그 값이 존재하는 공간. 변수 및 함수를 저장하는 실행공간입니다.(블록 외부도 유효공간입니다. 전역변수를 생각해 보세요.) ThisBinding : 함수를 호출한 객체의 참조가 저장되는 공간. 우리가 잘 아는 this를 말합니다. Lexi.. Single-Thread Server VS Multi-Thread Server Single-Thread Event Loop Model, Node.js JSP, Spring 등은 멀티스레드를 이용해서 requset와 response를 처리한다. 그리함으로서, 동시발생적인 사용자들을 잘 처리할 수 있기 때문이다. 우리가 평소 사용하던 많은 웹 애플리케이션들은 멀티스레드기반이 더욱 친숙하다. 하지만, Node.js는 싱글스레드 기반 이벤트 루프 구조를 선택했다. 이벤트 루프 덕분에, 싱글스레드이지만 동시발생적인 사용자들을 잘 처리할 수 있게 된다. Multi-Thread Request-Response Model(Synchronous) Steps 클라이언트는 웹서버에 request를 보낸다. 웹서버는 무한 루프를 돌면서 클라이언드의 리퀘스트를 기다리는 중이다. 웹서버는 내부적으로 제한된 .. 자바스크립트와 다른언어의 차이점 Javascript와 다른언어와 차별점 1. 자바스크립트는 동적 프로토 타입 기반 객체 지향언어이다. 객체지향언어에는 2가지의 큰 틀이 있다. 클래스 기반 객체지향언어 프로토타입 기반 객체지향언어 우선, 자바스크립도 객체지향언어라는 걸 잊지 말아야 한다. 하지만, Java와 다르게 클래스라는 개념이 없다. ECMAScript5에서 많은 라이브러리가 클래스를 지원한 것처럼 보이게 하는 것들이 있다. 하지만 주의해야한다. 클래스 기반 언어와 다르다(C++, Java) JS의 프로토 타입과 상속에 대해서는 다음 문서를 참고 https://sdcodebase.tistory.com/21?category=861404 자바스크립트의 프로토타입 JS의 프로토 타입 프로토 타입은 JS와 클래스 기반 객체지향언어와 크게 .. 자바스크립트의 프로토타입 JS의 프로토 타입 프로토 타입은 JS와 클래스 기반 객체지향언어와 크게 차이를 주는 부분이다. 프로토타입은 상속과 멤버 함수 추가등에 많이 쓰인다. 각각에 대해서 알아보도록 한다. 1. 생성자 안에서 메서드를 정의하는 방식의 문제점 JS는 생성자 안에 다음과 같이 모든 메서드를 입력할 수 있다. 하지만, 아주 치명적인 문제가 발생한다. 생성자로 생성한 모든 인스턴스에 똑같은 메서드가 추가된다. 생성한 인스턴스만큼 같은 작업을 하는 메서드가 추가된다 . 메모리가 크게 낭비 된다. 2. 프로토 타입 객체 프로토타입 객체를 이용하면, 생성자 안에 있는 프로토타입 프로퍼티가 외부에 정의된 객체 하나를 가리킨다. 그리고 그 프로토타입 객체에 prototype키워드로 지정한 함수들을 저장하는 것이다. 결국, 인스.. 이전 1 다음