대부분의 DBMS는 데이터를 2차저장소에 저장하고 관리한다. 2차저장소는 컴퓨터 구성요소에서 보조기억장치를 말한다. (ex: 하드디스크) 2차저장소는 다음과 같은 특징이 있다. 데이터를 처리하는 속도가 컴퓨터 시스템에서 가장 느림데이터를 저장하는 용량이 가장 큼 그럼 왜 데이터를 2차저장소에 저장하는 걸까? 여러 이유가 있겠지만 2개를 뽑자면 아래와 같다. 서비스를 운영하면서 중요한 데이터들을 영구적으로 보관할 저장소가 필요서비스가 커지면서 많은 양의 데이터를 보관할 장소가 필요 이러한 이유로 처리하는 속도는 느리지만 데이터를 보관할 장소로 쓰인다. 2차저장소의 특징은 한가지가 더 있는데, 데이터를 읽고 쓸 때 block(또는 페이지) 단위로 실행이 된다. block이란 2차저장소에서 데이터를 읽고..
뱅크셀러드 같은 예산 관리 애플리케이션 API를 개발하고 있는데, 여러 기능 중 이번 달에 설정할 예산을 추천해주는 기능을 개발하고 있었다. 사용자가 예산금액을 입력하고 서버에 보내면, 서버는 이번 달에 이미 예산을 설정한 기존 사용자들을 통계내서 각 카테고리별 예산 금액으로 추천해주는 흐름이다. 저장돼있는 예산을 카테고리별로 그룹화한 후 각 그룹의 예산 금액을 더한 값에서 총 예산 금액의 합을 나누면 평균 비율을 계산할 수 있다. 네이티브 쿼리로 작성된 로직은 다음과 같다. select SUM(amount) from budget b 먼저 모든 예산 금액의 합을 구한다. 이렇게 구한 총 금액과 사용자가 이번달에 설정할 예산금액을 가지고 각 카테고리별 예산 금액을 추천한다. 추천하는 쿼리는 다음과 같다. ..
브라우저에서 음성채팅을 구현하기 위해 웹에서 실시간 미디어 스트림을 송수신할 수 있는 WebRTC 기술을 사용했다. 먼저 어떻게 동작하는지 알기 위해 표준 방식인 P2P를 구현한 데모코드를 실행해봤다. 아래는 P2P방식의 서버 코드다. 그런데 이상하지 않은가? P2P방식의 가장 큰 특징이 중간 서버를 거치지 않고 Peer간 직접 통신을 해 지연시간이 낮다는건데, 그럼 아래의 서버 코드는 뭘까? 바로 시그널링 서버다. 시그널링 서버는 피어 간 연결을 맺기 위한 메타데이터를 교환하는 역할을 담당하고 있다. 즉, 실제로 미디어를 송수신하는 것은 피어 간 직접적으로 수행되고 해당 서버는 실시간 미디어스트림을 송수신 하기 전 피어들을 연결시키는 역할이다. const express = require("express..
로버트 마틴은 클린 소프트웨어라는 책에서 소프트웨어 모듈이 가져야 하는 세 가지 기능에 관해 설명한다. 여기서 모듈이란 크기와 상관없이 클래스나 패키지, 라이브러리와 같이 프로그램을 구성하는 임의의 요소를 의미한다. 모든 소프트웨어 모듈에는 세 가지 목적이 있다. 첫 번째 목적은 실행 중에 제대로 동작하는 것이다. 이것은 모듈의 존재 이유라고 할 수 있다. 두 번째 목적은 변경을 위해 존재하는 것이다. 대부분의 모듈은 생명주기 동안 변경되기 때문에 간단한 작업만으로도 변경이 가능해야 한다. 변경하기 어려운 모듈은 제대로 동작하더라도 개선해야 한다. 모듈의 세 번째 목적은 코드를 읽는 사람과 의사소통하는 것이다. 모듈은 특별한 훈련 없이도 개발자가 쉽고 읽고 이해할 수 있어야 한다. 읽는 삶과 의사소통할 ..
nGrinder는 네이버에서 만든 오픈소스로, 성능 테스트를 쉽게할 수 있게 도와준다. nGrinder로 성능 테스트를 하기 위해선 Controller, Agent, Target Server가 각각 별도로 실행되어야 한다. Controller: 테스트 스크립트를 작성하고, Agent에 명령을 해서 테스트를 시작할 수 있도록 하는 웹서버다. 실행중인 테스트를 모니터링하거나, 테스트 결과를 시각화한 UI를 제공한다. Agent: 실질적으로 부하를 발생시키는 역할이다. Controller에서 작성된 스크립트에 따라 Target Server에 부하를 발생시킨다. TargetServer: 말 그대로 테스트를 진행할 서버를 말한다. 그럼 Controller와 Agent를 설치하고 실행해보자. 먼저 nGrinder에..
라이엇에서 제공하는 API는 크게 2가지가 있다. Riot API League Client Update API Riot API는 소환사 데이터나 전적 데이터 같은 정적인 데이터를 불러올 때 사용된다. (그냥 일반적인 API와 같다.) LCU API(League Client Update API 약자)는 롤 클라이언트와 상호작용할 수 있는 API다. 예시를 들면 게임매칭이 잡히고 챔피언 선택창에서 나와 내 팀원이 어떤 챔피언을 선택했는지 실시간으로 알 수 있다. 어떻게? 리그 클라이언트 아키텍쳐는 웹소켓 연결을 사용해서 LCU 자체의 변경사항을 UX프로세스(롤 앱이라고 보면 된다. 롤 앱을 LeagueClientUx라고 한다.)에 전달해서 사용자한테 표시하는데, 여기서 웹소켓을 연결하면 우리도 실시간으로 데..
8월 중순부터 지금까지 약 2달간 계속 만들고 있는 프로젝트가 있다. 바로 롤보챗(롤 보이스 채팅)이다. 롤보챗은 롤에서 만난 팀원들과 음성채팅을 할 수 있는 데스크탑 애플리케이션 서비스다. 이미 롤에도 인게임 보이스가 있지만, 사전에 같이 게임을 돌린 팀원들만 연결이 된다. 그래서 나와 프론트를 하는 친구 둘이서 사전에 같이 돌리지 않아도 자동으로 보이스 채팅을 이용할 수 있는 서비스를 만들어보면 좋겠다! 해서 시작하게 되었다. 핵심로직을 간단하게 말하자면, 매칭이 잡히고 챔피언 선택창으로 넘어가는 순간 롤보챗 앱을 이용하고 있는 팀원들끼리 자동으로 보이스방이 연결된다. 기본적으로 최근에 했던 게임 전적을 볼 수 있고, 최근 전적의 승률도 볼 수 있다. 또한 챔피언을 선택할 때마다 해당 챔피언의 평균 ..
Electron앱을 패키징했다. 근데 앱 용량이 너무 크다. 원래 일렉트론으로 만든 앱 용량이 기본적으로 크다곤 하지만, 대표적인 Electron앱인 디스코드는 392MB, vscode는 549MB다. 그래서 어떻게 줄이는지 찾아보다가, 배포할 때 제외할 리소스를 극한으로 설정하거나 필요없는 라이브러리는 삭제시키면 된다는 해결방법이 대부분이었다. 하지만 필요없는 라이브러리 삭제같은 해결방법은 기존부터 해왔기에, 용량을 다이나믹하게 줄이려면 다른 방법이 필요했다. 그러다가 electron-react-boilerplate를 찾았고, 혹시라도 보일러플레이트 앱을 패키징하면 용량이 작게 나올지도 모른다는 생각에 설명에 적힌대로 빌드를 해봤다. git clone 후 git clone https://github...
원인 확인 저번에 Github Actions을 사용해서 CI를 구축하는 블로그를 썼었다. 유용하게 사용하고 있을 때, intellij에서는 테스트가 통과되지만 빌드에서는 막히는 상황이 발생하였다. intellij에서 테스트 돌렸을 때 inteliij 터미널로 테스트를 했을 때 물론 ./gradlew build도 잘 먹힌다. 하지만 Github Actions이 돌리는 빌드에서는 오류가 뜬다. 위 사진을 봤을 때, 이상한 점이 있다. 바로 10개의 테스트가 돌아갔지만 실패한 테스트는 2개라는 것이다. 그래서 위 사진에서 실패한 테스트들의 공통점을 찾아보았다. 바로 테스트가 돌아갈 때 DB를 사용한다는 것이다. @DisplayName("이미 존재하는 이메일로 회원가입할 시 예외 발생") @Test void c..
많은 CI 툴이 있지만 오늘은 Github Actions를 이용해서 CI 구축을 해보겠다. 프로젝트를 관리할 레파지토리를 생성하자. (이름은 only-ci-test로 정했다) 그리고 Actions탭에 들어간다. 스프링부트로 테스트 할 것이기 때문에 Java with Gradle의 Configure을 눌러준다. 그럼 밑에 있는 사진처럼 디폴트 값으로 짜여져 있는 yml파일이 있다. 이제 yml파일을 건드려서 자신이 원하는 스크립트를 짜면 된다. 나는 JUnit Test Results라는 라이브러리를 사용해서 JUnit 테스트가 성공하든 실패하든 Github Actions 봇이 테스트 결과 정보를 코멘트로 알려주는 기능을 짰다. 옆에 Marketplace를 통해 다양한 기능들을 검색해서 알아볼 수 있고, 각..
- Total
- Today
- Yesterday