전체 글 118

파일 마이그레이션

💡 회사에서 파일 마이그레이션을 했는데 그 과정과 피드백에 대해서 써보려고 합니다.무엇을 했는가?파일 경로 수정하는 작업이 과정에서 기존에 있는 데이터를 옮기는 작업목표변경 전 파일 경로: /기본경로/{회사정보}/{파일타입-user/upload}/{파일}변경 후 파일 경로: /기본경로/{yyyyMM}/{회사정보}/{파일타입-user/upload}/{파일}파일: 이름[20240425111111_유니크값].png왜?한 폴더에 파일이 많을 경우 IO가 느려지는 문제가 있음clientNo 별로 파일이 계속 쌓이는 형태한 폴더 안에 최대 약 만개의 파일이 쌓여있음권장은 한 폴더안에 4천 ~ 5천성능에 따라 다름ext1 ~ ext4, xfs 등 파일시스템의 성능이 좋아짐(inode 향상, 디렉토리 검색 성능 향상..

경험 2024.05.19

2023년 중간 회고록

2023년 첫 회고를 시간순서로 써보려고 합니다. 크게 회사, 인프콘, 이직 얘기입니다.(저만의 일기 느낌입니다.) 회사 먼저 1월~2월부터는 기존 서비스로 바쁜시간을 보냈습니다. 이 기간에 antMedia를 사용하면서 송출서버를 구축을 하고 유튜브 연동을 했습니다. 또한 ffmpeg으로 동영상을 합치고 m3u8로 변환하는 작업 등의 작업들을 했습니다. 이 때 공식문서도 많이 보고 지금까지 해보지 않았던것을 해보면서 재미를 많이 느꼈습니다. 하지만 이 기간에 회사는 크고 작은 변화들이 내부적으로 있었습니다. 그것은 합병!! 커넥트웨이브라는 모회사에 합병이 되었습니다. 합병이 되고 나서 기존 서비스를 하면서 뉴메이크샵이라는 기존 메이크샵 리메이크 프로젝트에 합류하게 되었습니다. 그 과정에서 기존 서비스를 ..

redis pub / sub 아키텍처

💡 여기서 나오는 아키텍처는 간단하게 표현한 것이며 팀장님이 설계한 아키텍처입니다. 그리고 나름 괜찮은것 같아서 기록해보려고 합니다. 무엇을 하는가? 채팅 기능과 상태 변경 등의 기능을 실시간으로 처리하기 위해서 소켓서버를 사용하게 되었습니다. 사용 이유 레디스는 데이터 저장기능도 있지만 메세지 브로커 기능또한 있어서 활용 가능하다. 빠른 개발이 가능하다. ⇒ kafka같은거로도 가능하나 초반에는 채팅부분만 활용할거라 생각한것 같고 kafka를 사용해본적이 없다. 클러스터 기능도 제공한다. 구조 이 구조로 주로 두가지 publish가 사용됩니다. 백엔드에서 redis publish 백엔드에서 redis에 publish 하면 다른 연결된 모든 소켓서버에 전달하고 그것이 클라이언트단으로 갑니다.(상태 변경)..

경험 2023.04.23

디자인 패턴 적용

💡 일하면서 유용했던 패턴들 각 패턴들에 대한 정보는 많이 있으니 왜 사용했는지, 사용하면서 느낀점을 얘기해보겠습니다. 파싸드 패턴 Spring boot에 Facade 패턴 적용 Spring boot에 Facade 패턴 적용 Facade란? "건물의 정면"을 의미로 어떤 소프트웨어의 다른 커다란 코드 부분에 대하여 간략화된 인터페이스를 제공해주는 디자인 패턴을 의미 class TV() { var channel: Int = 0 set(value) { field = value println balldev.tistory.com 느낀점 storeService, broadcastService가 있을 경우 storeService에 broadcastService를 주입하고 broadcastService에 storeS..

경험 2023.04.20

spring boot에서 커맨드 패턴

커맨드 패턴이란? 커멘드 패턴은 여러 객체들에 명령(Command)을 해야 할 때 사용되는 패턴입니다. 커맨드 패턴 간단한 원리 command가 만들어지면 createBraodcast란 커맨드로 antmedia, broadcast 등에 메서드 하나로 조작할 수 있습니다. 커맨드 패턴 사용한 이유 스트리밍 서버를 antmedia와 broadband 두가지를 사용하고 있습니다. 방송 시작할 때 antmedia와 broadband 로직의 차이가 있습니다. antmedia - 방송 할때마다 새로운 송출 주소를 생성함 broadband - 이미 생성되어 있는 송출 주소로 매번 방송을 시작함 그래서 방송 시작 로직에 방송 시작 커맨드 실행하면 각각의 로직을 실행하게 끔 했습니다. 커맨드 패턴 적용 Map으로 각 스..

송출 서버와 유튜브 스트리밍

💡 송출 서버 만드는 과정에서의 경험 시작 계기 low latency hls, webRTC 적용을 고려 + 유튜브 동시 송출을 위해서 송출서버를 만들기로 했습니다. 사전 지식 Livestreaming protocol 중에서 RTMP, HLS를 사용합니다. RTMP(real time message protocol) 비디오나 오디오등을 인터넷 상에서 실시간으로 스트리밍 데이터 전송 규격 HLS(http live streaming) HTTP 프로토콜을 사용하는 실시간 스트리밍 방식으로 스트리밍 데이터를 m3u8의 확장자를 가진 재생목록 파일과 잘게 쪼갠 다수의 ts파일을 http을 통해 전송하는 방식 송출 서버 구조 rtmp는 송수신 둘 다 이용할 수 있으나, 송출 시에만 이용하고 있고 시청은 hls로 하고 ..

경험 2023.04.11

인덱스 고민

💡 이 글은 인덱스를 적용할 때 어떤 고민을 했는지 적은겁니다. (매우 부족합니다.) 틀릴수도 있으며 더 좋은 방법이 있을 수도 있습니다. 2장. 인덱스 - 인덱스 구조 및 탐색 2장. 인덱스 - 인덱스 구조 및 탐색 💡 핵심 원리를 알아보자 인덱스 튜닝의 두 가지 핵심 요소 인덱스 스캔 효율화 튜닝 랜덤 액세스 최소화 튜닝(테이블 액세스 횟수를 줄이는 것) ⇒ 이것이 중요!! 인덱스 구조 대용량 테이블에 balldev.tistory.com 친절한 sql 튜닝 책을 보고 나름대로의 생각으로 적용 기본적인 DB 구조 뭔가 많긴한데 대충 broadcast 기준으로 이것저것 있는 구조입니다. 고려했던 부분 조회를 할 경우에 어떤 조건절을 많이 쓸까?? = 조건 위주로 broadcast_state는 ready,..

경험 2023.03.30

3장. 인덱스 튜닝 - 인덱스 설계

인덱스가 만약 많다면? DML 성능 저하 - TPS 저하 데이터 베이스 사이즈 증가 데이터베이스 관리 및 운영 비용 증가 ⇒ 개별 쿼리 성능뿐만 아니라 그 개수를 최소화함으로써 DML 부하를 줄여야 하므로 인덱스 설계가 어렵다. ⇒ 그리고 인덱스 추가는 시스템에 부하를 주고 인덱스 변경은 운영에 리스크가 있기 때문에 처음 설계가 중요하다. 인덱스 선택 조건절에 항상 사용하거나 자주 사용하는 컬럼 ‘=’ 조건으로 자주 조회되는 컬럼을 앞쪽에 두어야한다. 수행빈도, 중요도, 데이터량 등 .. nl 조인할 때 어느쪽에서 자주 액세스 되는지도 중요한 판단 기준이 된다. ⇒ 이후에 nl조인에서 설명함 수행빈도가 높다면 당장 성능이 좋아도 인덱스를 최적으로 구성해야한다. 데이터량이 적다면 굳이 인덱스를 만들 필요가..

3장. 인덱스 튜닝 - 인덱스 튜닝

💡 운영 환경에서 가능한 일반적인 튜닝 기법은 인덱스 컬럼 추가 인덱스 탐색과정에 대해서 알아보자 루트 블록에서 LMC는 자식 노드 중에서 가장 왼쪽 끝에 위치한 블록을 가리킨다. 주의할 점이 C1 = ‘B’인 레코드를 찾을 때 리프블록 3으로 가는 것이 아닌 직전 리프블록 2로 가야한다. 각 조건절에 대해서 원리를 설명하기. where C1 = 'B' where C1 = 'B' and C2 = 3 where C1 = 'B' and C2 >= 3 where C1 = 'B' and C2 = 'a' where c1 = 1 and c2 = 'A' and c3 between '가' and '다' and c4 = 'a' where c1 = 1 and c2

3장. 인덱스 튜닝 - 부분 범위 처리

부분범위 처리 DBMS가 클라이언트에게 데이터를 전송할 때 일정량씩 나누어 전송한다. 전송한 후에 fetch call이 있기 전까지 기다린다. 1억건짜리 테이블인데도 결과를 빨리 출력할 수 있는 이유 한번에 데이터를 모두 읽어 전송하지 않고 먼저 읽는 데이터부터 일정량을 전송하고 멈추기 때문이다. fech call을 받으면 대기 큐에서 나와 그 다음 데이터부터 일정량을 읽어서 전송하고 또다시 잠을 잔다. ⇒ 부분 범위 처리 - 약간 페이징하고 원리가 비슷한듯 정렬 조건이 있을 때 부분 범위 처리 select * from user order by created 인덱스가 안되어 있다면? 모든 데이터를 읽고 created 순으로 정렬 데이터 전송 인덱스가 되어 있다면? 이미 정렬되어 있으므로 부분범위 처리가 ..