📖 Real MySQL 책 내용 발췌... 스트리밍 방식 서버 쪽에서 처리해야 할 데이터가 얼마나 될지에 관계없이 조건에 일치하는 레코드가 검색될 때마다 바로바로 클라이언트로 전송해주는 방식. 클라는 쿼리 요청 후 곧바로 첫번째 레코드를 전달 받음. 마지막 레코드를 받는 시점은 알 수 없음. 클라이언트는 바로 데이터 가공 시작할 수 있음. 레코드 수에 상관 없이 빠른 응답 시간 보장 가능. 💡 클라이언트 도구, API에 따라 스트리밍 처리 방식이 다를 수 있음 JDBC => mysql 서버는 레코드를 읽자마자 클라이언트로 그 결과를 전달할 것이지만, JDBC가 mysql 서버로부터 받는 레코드를 일단 자체적인 버퍼에 모두 담아 두고, 마지막 레코드가 전달되면 그 때서야 비로소 클라이언트 어플리케이션에 반..
회사에서 발표했던 자료 😎 시연한 예제 코드 generator // feature1 ) pause - resume function* sampleGen(){ console.log('함수를 시작합니다') x = yield 1; console.log(`여기서부터 함수를 다시 시작해요. input = ${x}`) y = yield 2; console.log(`다시 시작~ ${y}`) } const gen1 = sampleGen() gen1.next() gen1.next(5) gen1.next(6) // feature2 ) iterator function* sampleGen2(){ for (let i=1; i coroutine (지역 변수 및 pc 값을 저장할 수 있는 초경량 실행 유닛) ---> async/aw..
yield 키워드 지난 yield 와 generator에 대한 글에서 제너레이터를 2가지 관점으로 바라봤었는데 1) 반복적으로 실행 flow를 pause, resume할 수 있는 경량(유저레벨) 스레드 같은 것. => cpu 스케줄 타임을 점유하는 문제와 관련되어 있다. => 코루틴 (일반적인 언어들) / Fiber (루비) 으로 연결된다. 2) 호출할 때마다 값을 하나씩 produce 함 (next로 호출, yield문을 만나면 caller에게 값을 돌려주고 멈춘다.) => memory를 효율적으로 사용하는 문제와 관련되어 있다. => 연산전에 모든 element를 메모리에 올릴 것인가? (전통적인 배열 같이) 아님 lazy하게 필요할 때 하나씩 갈 것인가? => stream processing 개념으..
배경 연동된 외부 재고 관리 시스템에서 주문을 마감하고 쌓인 정보를 가져가는 시각을 "오후 10시로 고정" 에서 "관리자가 시간을 설정할 수 있도록" 바꿔야 하는 요구사항이 있었다. 따라서 이와 같이 관리자가 설정한 스케줄 (주문 마감) 정보를 테이블에 저장하면 매일 새벽 5시 (서버가 제일 한가한 시간) 마다 한번씩 cronjob이 돌면서 해당 날짜에 설정된 스케줄 데이터가 있는지 확인하고 있다면 해당 시각으로 주문 정보 가져가세요~ api 를 요청하는 job을 실행하도록 만들었다. 이때 이 cronjob을 어떤 툴을 이용해서 구현하면 좋을지 고민이었다. 선택 기준 (1) 중복 실행되지 않도록 job은 idempotent 하게 구현해야 하는 원칙이 있어서, 여러번 실행돼도 상관 없게 짜야하지만 많을 때..
지난 2분기에는 "물류센터 작업자의 수고로움을 덜 수 있도록 한번의 처리 요청으로 전체 대상을 처리할 수 있도록 해달라" 라는 요구사항과 관련된 태스크를 많이 처리하게 되었다. 개중에는 전체 처리 시간이 너무 오래걸려 request - response flow 안에서 동기적으로 처리하기 무리인 것들이 있었는데 이런 경우는 클라이언트에 응답은 바로 주고, 작업은 job으로 비동기 실행하도록 했다. 그런데 이때 작업자에게 노티할 수 있도록 슬랙으로 시작, 완료 알람도 보내야하고 실행하는 동안 몇건 성공했고, 몇건을 어떤 이유로 실패했는지도 전달하고 싶었다. (기획자분이 그렇게까지 요구하진 않았지만...) 어떻게 복잡하지 않게, 그렇지만 정확하게 여러 job들을 하나의 단위로 묶고, 그와 관련된 메타 데이터들..
iterator 패턴 자료구조 (list, tree, stack..)를 노출하지 않고 추상화시켜서 collection의 요소를 traverse하는 패턴. 메인 아이디어 collection의 traverse behavior를 iterator라는 분리된 객체로 뽑아내기 iterator 객체에 traverse 알고리즘을 구현해두고, 외부에서는 그 디테일을 알 수 없도록 은닉한다. 여러 iterator를 사용하면, 같은 collection을 동시에 독립적으로 탐색할 수도 있다. 모든 iterator는 같은 인터페이스를 구현해서, client code가 어떤 자료구조의 collection이든, 어떤 traverse 알고리즘이든 호환 가능하게 만들어져야 한다. 보통 더이상 element가 없을 때까지 (traver..
elasticsearch cloud에서 데모 연습 (14일 free trial) 1. 무료 cluster deploy 배포한 cluster edit 버튼 누르고 data tier 추가해준다. (rollover 테스트 해야하므로 이미 설정된 hot 외에도 warm, cold 티어 추가. 데모 테스트하는 시점에 frozen 티어는 추가하려면 과금됨.) (참고) 데이터 티어란? A data tier is a collection of nodes with the same data role that typically share the same hardware profile 이렇게 수정했다.. hot 인스턴스 : 2개 warm 인스턴스 : 2개 cold 인스턴스 : 1개 빠른 테스트를 위해 클러스터의 poll_int..
🌻 Abstract Factory 📝 한 줄 정리 Factory에서 생성 하는 것 : product => product family 로 확장 🤔 해결할 문제 상황 가구샵 시뮬레이터를 만들고 있는 상황을 가정해보자. 다음과 같은 것을 표현할 클래스들이 필요하다. 1. 연관된 가구 품목의 패밀리 : 의자 + 쇼파 + 커피 테이블 2. 해당 패밀리의 여러 variant : 모던 스타일 / 빅토리안 스타일 / 아르데코 스타일 같은 스타일에 매칭되는 개별 가구 객체를 생성할 수 있어야 한다. 그리고 프로그램에 새로운 상품이나 제품군을 추가하려고 할 때 기존 코드를 수정하고 싶지 않다. 🧐 해결 방법 각 제품군에 대한 인터페이스를 명시적으로 선언한다음 각 (스타일의)제품이 해당 인터페이스를 구현하도록 만든다. 그 ..