캐러셀이란 캐러셀은 슬라이드쇼와 같은 방식으로 콘텐츠를 표시하는 UX 구성 요소입니다. 회사에서 운영하는 서비스에서도 테마 별 캐러셀을 사용하고 있습니다. 문제 상황 staging QA에서 홈화면에 접근 시 메인배너만 보이고 새로고침 전 까진 캐러셀들이 보이지 않는다는 리포트가 들어왔습니다. 브라우저 네트워크 탭에서 확인해보니 캐러셀 목록 데이터를 조회하는 API의 응답속도가 17초 이상 나왔습니다. 분석 일단 어디가 병목지점인지를 확인하기 위해 코드 중간중간 타이머를 심어 시간을 측정했습니다. 확인 결과, 상품정보목록를 불러오는 부분에서 10초 이상을 소요되어 이 부분을 더 자세히 살펴보았습니다. 서비스는 PHP Laravel로 개발되어있습니다. (기존 로직을 간결하게 재현한 코드로, 실 운영 중인 코..
String 숫자넣으면 incre decre 기능 사용 가능 활용사례 : 좋아요 수 증감처리 mset mget으로 한번에 여러 키/벨류 삽입 조회 가능 List 링크드리스트 자료구조 인덱스 조회 불가, 데이터 넣고빼기 용이 파이썬 deque와 비슷한 느낌? Set 활용사례 : 이벤트 쿠폰 발급하고 중복사용 막기. 사용한 유저id를 셋에 삽입 Hash 벨류가 오브젝트 처럼 여러 필드를 갖고있음 기존 스트링에 json으로 보관하는 것 과의 차이점 : 특정 필드에 따로 접근 가능 각 필드에 접근하여 incre decre도 가능 : 특정 숫자 증가 가능 (string inc와의 차이점) SortedSet Set의 필드에 score값이 포함되어있음 활용사례 : 게임 랭킹 시스템 Bitmap 비트벡터로 아루어짐 활..
Pageable Spring data core api에서 제공하는 인터페이스 JPA Repository 메소드 파라미터에 Pageable 객체를 넣어주면 자동으로 페이지네이션 적용 public interface UserRepository extends JpaRepository { List findByLastname(String lastName, Pageable pageable); } 반환타입 : Page, Slice, List Page : 페이지 + totalCount Slice : 페이지 + 전후 슬라이스 존재 여부 List : 페이징 안된 전체리스트 PageRequest 페이징 요청 정보 생성 쿼리스트링으로 사용하는 법 컨트롤러에 파라미터로 PageRequest 삽입 쿼리스트링에 page=3&size..
BSON(Binary JSON) JSON과 유사한 문서를 바이너리 형태로 인코딩한 데이터 포맷 날짜 타입, BinData 타입 등 JSON보다 많은 타입을 지원 Protocol Buffer, Thrift와 같은 바이너리 교환 형식(Binary Interchange Format) BSON은 Protocol Buffer 대비 schema-less 하여 유연하다는 장점이 있지만, 직렬화된 데이터의 필드명에 대한 오버헤드가 있어 공간 효율성 면에서 약간의 단점이 있다 특징 가볍다 쉬운 데이터 순회 (Traversable) 타입과 길이 정보를 인코딩하여 순회를 빠르게 할 수 있다 효율적이다 문서 맨 앞에 길이 정보를 포함하고 있어 빠르게 스캔 및 쿼리 가능 C언어의 데이터 타입을 사용하기 때문에 대부분의 프로그래..
Schema Design Pattern 데이터 모델링 시 자주 나타나는 과제들을 해결하기 위한 방법들을 비슷한 특징끼리 묶어 정리한 것 디자인 패턴의 데이터 모델링 버전이라고 볼 수 있다 소프트웨어 개발 방법에서 사용되는 디자인 패턴은 프로그램 개발에서 자주 나타나는 과제를 해결하기 위한 방법 중 하나로, 과거의 소프트웨어 개발 과정에서 발견된 설계의 노하우를 축적하여 이름을 붙여, 이후에 재이용하기 좋은 형태로 특정의 규약을 묶어서 정리한 것이다. 알고리즘과 같이 프로그램 코드로 바로 변환될 수 있는 형태는 아니지만, 특정한 상황에서 구조적인 문제를 해결하는 방식을 설명해 준다. - 위키피디아 사실 MongoDB만을 위한 패턴은 아니다. 다만 유연한 스키마를 가진 MongoDB에서 사용하기에 효과적이다..
Ranged Sharding 샤드키의 값을 기준으로 청크에 분산 연속된 숫자들이 같은 샤드와 같은 청크에 존재함 데이터의 값으로 정확히 어떤 샤드에 존재하는지 알기 때문에 데이터가 존재하는 샤드에만 쿼리를 요청하는 Target Query가 가능 단점 : 데이터가 균형있게 분산되지 않을 가능성이 높다 usage 타겟쿼리가 필수일 경우 hash shrading을 이용하지 못하는 경우 Hash Sharding 샤드키의 값의 해시값을 기준으로 분산 균등 분산 카디널리티가 낮으면 부하편중을 완전히 막을 순 없음 샤디드 클러스터의 목적이 분산이므로 균등분산이 잘되는 해시샤딩을 대부분 사용 주의할 점 데이터가 연속되어있지 않고 분산되어있으므로 모든 샤드에 다 요청해서 데이터를 가져온 후 필터링 해야 할 수도 있음 →..
Sharded Cluster MongoDB의 분산 솔루션 Replica Set에 더 이상 감당 안될 정도로 데이터가 유입되면 Sharded Cluster 사용 고려 모든 샤드는 Replica Set으로 구성되어 있다 분산을 위한 솔루션이지만 Replica Set 구성이기 때문에 HA도 지원 Replica Set의 목적 : HA 샤딩의 목적 : 스케일아웃 대량으로 늘어나는 데이터를 저장하고 쓰기에 대한 부하가 클 때 적합 Replica Set은 secondary를 늘리면서 읽기 부하를 분산할 수 있지만 primary는 하나이기 때문에 쓰기 분산이 커지면 sharded cluster를 사용하는 것이 좋다 용어 Sharding : 하나의 큰 데이터를 여러 장비에 걸쳐서 분할하는 과정 Shard : 분할된 데이..
Replica Set은 HA(High Availability)를 보장해 주기 때문에 내부적으로 아키텍처가 복잡해지는 트레이드오프가 있음 이로 인해 우리가 꼭 알아야 하는 것들이 생긴다 개발자 입장에서 Replication에 대한 이해가 있어야 Replica Set을 이용한 몽고디비를 잘 활용할 수 있다 Replica Set 3대의 MongoDB 멤버 이루어진 구조 1Primary, 2 Secondary HA(High Availability)에 대한 해결방안 멈춤 없이 지속적 운영이 필요한 서비스에서 필요한 최소 배포 단위 각 멤버는 같은 서버에 존재할 수도, 다른 서버에 존재할 수도 있다 replica set의 목적이 HA이기 때문에 각각 다른 서버에 설치되어 있어야 목적에 맞는 효과를 볼 수 있다 각 ..
뜻하지 않게 2가 풍요로운 한 해였네요 ✌️ 💻 2번째 회사와 2번의 서비스 오픈 이직을 하면서 올해만 2번의 서비스 오픈을 경험하게 되었습니다. 쇼핑몰 입점 업체용 어드민 2021년 가을부터 작업하여 2022년 2월 오픈한 서비스로, 회사 메인 쇼핑몰에 입점한 업체분들의 배송/주문/상품관리를 위한 사이트입니다. 몇 달간 작업한 정산 기능이 내부 사정으로 중단되는 등 여러 우여곡절이 있었습니다. 엑셀 다운로드 기능 관련 이슈 대응은 포스팅도 해두었는데요. 지금 와서 보면 제대로 된 해결책이 아니라 부끄럽지만, 그만큼 제가 성장했구나라고 받아들이겠습니다 😄 [Apache POI] 다량의 데이터 엑셀 다운로드 처리로 인한 서버 장애 대응 후기 스테이징 QA 도중 갑자기 사이트의 모든 기능이 먹통이 됐다는 소..
구글링 해보면 보통 Clustered Index라고 많이 하는 것 같은데, 필자가 참고한 Real MySQL 8.0 책에서는 클러스터링 인덱스라고 언급하여 여기서도 일단 클러스터링 인덱스라고 표기하겠다. PK값이 비슷한 레코드끼리 묶어서 저장하는 것 PK값에 의해 레코드의 저장 위치가 정해짐 PK값 변경 시 해당 레코드의 물리적인 저장 위치도 변경됨 클러스터링 인덱스는 InnoDB 스토리지 엔진에서만 지원 인덱싱 알고리즘이라기보단 테이블 레코드의 저장 방식이라 볼 수 있어 ‘클러스터링 테이블’이라고도 불림 세컨더리 인덱스의 리프 노드에 PK가 있는 것 과 달리, 클러스터링 인덱스의 리프노드에는 레코드의 모든 컬럼이 (=해당 식별자의 모든 데이터) 같이 저장되어있음 → 즉, 클러스터링 테이블은 그 자체가 ..
- Total
- Today
- Yesterday
- mockery
- 대규모 데이터 처리
- MySQL
- 라라벨
- laravel 테스트
- k8s
- mongoDB
- redis
- java
- laravel
- pods
- 리눅스 컨테이너
- laravel 테스트코드
- docker
- database
- php
- 백엔드
- 샤딩
- index
- 샤드
- 도커
- 주니어개발자
- 분산처리
- NoSQL
- Apache POI
- 쿠버네티스
- phpUnit
- kubernetes
- 몽고디비
- springboot
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 |