분류 전체보기(341)
-
[TS] IntrinsicAttributes & (props) is not assignable to type ... 에러
에러 발생CardSection 컴포넌트로 posts props 를 넘기는 과정에서 발생한 문제.CardSection 역시 동일한 타입의 props 를 선언했지만 아래와 같은 에러가 발생했다. MainBlog.tsx (부모 컴포넌트)posts 변수를 CardSection 컴포넌트의 props 로 전달한다.해당 변수의 타입은 CardInterface[] 배열이다.export interface CardInterface { name: string; role: string;}const MainBlog = () => { const posts: CardInterface[] = [ {name: 'Post1', role: 'CEO BALENCIAGA'}, {name: 'Post2', role: 'CEO..
2024.08.06 -
[Go] panic: runtime error: invalid memory address or nil pointer dereference 에러 해결
개요fiber 프레임워크를 사용하여 웹소켓 채팅 서버를 개발 중 http 에서 websocket 으로 프로토콜을 업그레이드 하는 과정에서 발생한 문제. 에러 발생주석에 달아놓은 것 처럼 websocket handler 내부에서 fiber.Ctx 에 접근하자마자 에러가 발생했다.유효하지 않은 메모리 주소이거나 nil pointer 에러가 발생했다는데, ServeHttp() 메서드 진입시점에서 c 를 로그로 확인했을 땐 정상 값이 출력됐다.즉 websocker 핸들러 내부에서 fiber.Ctx 를 접근하지 못하는 것이 원인이라 생각했다.func (r *Room) ServeHTTP(c *fiber.Ctx) error { if r == nil { return fiber.NewError(fiber.St..
2024.08.06 -
[kotlin] 돌려돌려 돌림판~ 룰렛 게임 구현하기
📌 서론 룰렛 게임을 한 번쯤 해본 적이 있을 것이다. 빙글빙글 돌아가는 원판에는 구역별로 상품이 걸려있고 돌아가는 원판이 속도를 잃을 때쯤 멈추는 곳의 당첨 막대가 가리키는 상품을 얻게 된다.이런 룰렛 게임을 코드로 구현하려면 어떻게 해야할까? 필자는 백엔드 개발자이기에 UI를 그리는 것보단 어떤 원리에 의해 상품이 당첨되는지 초점을 두게 됐다. 만약 원판이 여섯 개의 구역으로 나뉘어 있다면 각각 1/6의 당첨확률을 가진다고 생각할 수 있다. 하지만 세상일이 원래 생각대로 되던가요? 좋은 상품은 항상 빗나가고 상대적으로 값어치가 떨어지는 상품만 자주 걸리는 게 차가운 자본주의의 현실이다 like 윤루카스. 프로그램으로 구현된 룰렛 게임은 각 구역의 당첨확률을 세팅할 수 있기에 값어치가 높은 상품보단 ..
2024.07.03 -
AWS Lambda 로 배포 자동화 구축 (feat. Docker Hub)
서론최근 해커톤을 나가면서 배포 자동화 프로세스를 고민하게 됐다. 필자는 백엔드 개발자이기 때문에 프론트엔드 개발자가 빠르게 서버와 통신할 수 있도록 먼저 EC2 인스턴스를 배포했다. 기존 배포 프로세스는 아래와 같다.1. 로컬에서 스프링부트 도커 이미지를 빌드하여 도커 허브로 push2. EC2 인스턴스에 SSH 접속하여 도커 허브의 이미지 pull3. pull 받은 이미지를 빌드하여 EC2 내부에서 서버 실행- EC2 내부에 shell script 를 작성하여 image pull 과 container run 은 한번에 진행할 수 있다. 위 방법은 3가지 스텝으로 구분 돼 비교적 간단해보이지만, 코드에 변경이 있을 때마다 EC2 내부에서 새로운 도커 이미지를 pull 받는 과정을 반복해야 했다. 매번 ..
2024.05.30 -
[kafka] 리밸런싱 종류와 컨슈머 파티션 할당 전략
개요카프카 컨슈머는 브로커의 메시지를 가져와 처리하는 역할을 맡는다. 개별 컨슈머를 그룹으로 묶어 컨슈머 그룹으로 관리할 수도 있으며 컨슈머 그룹 내에서 어떤 토픽의 파티션과 매칭되는지를 특정 전략에 따라 지정할 수 있다. 특정 컨슈머에 문제가 발생하면 해당 컨슈머가 처리하던 파티션을 그룹 내 다른 컨슈머에게 매칭해야 되는 상황이 발생할 수 있다. 이런 '리밸런싱' 과정은 아래의 상황에서 발생할 수 있다. 1. 컨슈머 그룹에 신규 컨슈머가 추가 될 때2. 컨슈머 그룹의 기존 컨슈머가 이탈할 때3. 토픽에 파티션의 수가 변경될 때 (추가/감소)4. 컨슈머가 구독하는 토픽이 변경될 때 (물론 스태틱 멤버십을 적용하면 컨슈머 그룹 이탈 후 재합류해도 리밸런싱이 일어나지 않는다.) 리밸런싱을 단순히 컨슈머의 담..
2024.05.04 -
데이터 중심 애플리케이션 설계 #6장
파티셔닝 데이터 셋이 매우 크거나 질의 처리량이 높다면 복제만으론 부족하고 데이터를 파티션으로 쪼갤 필요가 있다. 목적 : 데이터와 질의 부하를 노드 사이에 고르게 분산 시키는 것 각 노드에서 자신의 파티션에 해당하는 질의를 독립적으로 실행 가능 → 노드를 추가하여 질의 처리량을 늘릴 수 있다. 파티셔닝의 주된 목적 확장성 비공유 클러스터에서 파티션은 서로 다른 노드에 저장될 수 있다. 즉 대용량 데이터셋이 여러 디스크에 분산될 수 있어 질의 부하도 여러 프로세스에 분산된다. 로그 데이터의 효율적인 관리 불필요한 데이터 삭제 작업은 단순히 파티션을 추가하거나 삭제하는 식으로 간단히 해결할 수 있다. 파티셔닝과 복제 복제와 파티셔닝을 함께 적용해 각 파티션의 복사본을 여러 노드에 저장 각 레코드는 정확히 ..
2024.03.25 -
실시간 협업 애플리케이션은 어떻게 동작하는 걸까? (CRDT와 OT)
서론 구글 독스, 노션, 피그마 같은 애플리케이션에서는 동일한 페이지나 화면을 다수의 사용자가 동시에 편집할 수 있는 기능을 제공한다. 이러한 실시간 협업 애플리케이션은 여러명이 동시에 컨텐츠를 편집하더라도 결과적으로 동일한 내용으로 수렴(Convergence)하는 특징을 가진다. 이런 기술은 어떤 원리로 구현됐을까? 대표적인 기술로 OT(Operation Transformation) 와 CRDT(Conflict-free Replicated Data Types) 가 있다. 각 기술의 특징과 장단점을 아래에서 더 자세히 다뤄보겠다. OT OT : Operational Transformations (1989 ~ 2006) OT 는 2006년 정도까지 사용된 기술로 Google Docs 와 MS Office ..
2024.03.11 -
[Kafka] Avro 알아보기
서론 데이터를 파일에 쓰거나 네트워크를 통해 전송하려면 바이트열 형태로 encoding 작업이 필요하다. 인메모리 표현에서 바이트열로 전환하는 작업을 인코딩(encoding, 부호화, serializing) 이라 하며, 그 반대를 디코딩(decoding, 복호화, deserializing) 이라 한다. Binary Encoding 여러 인코딩 방법이 존재하지만 우선 이진 부호화 방식을 살펴보자. 이진 부호화는 데이터를 이진 숫자(0, 1)로 표현하는 과정을 의미한다. 데이터를 이진 형태로 표현하기 때문에 JSON, XML 같은 부호화 방법보다 효율적인 데이터 저장 및 전송이 가능하다. 가독성이 뛰어난 JSON 방식보다 읽기는 어렵겠지만 대규모 데이터셋을 저장해야 하는 상황이라면 이진 부호화가 좋은 선택이..
2024.03.04 -
[책] 개발자를 위한 최소한의 실무 지식
책 표지의 현장에서 바로 써먹는 40가지 핵심 기술이란 카피가 눈에 띄어 읽게 됐다. 과연 나는 최소한의 실무 지식을 갖췄을까? 그렇지 않다면 어떤 점을 더 갖춰야 할까 라는 마음으로 읽었다. 예상 독자 책의 예상 독자는 개발자로 취업을 준비 중인 사람, 이제 막 커리어를 시작한 신입 개발자, 그리고 어느정도 개발 경험이 있는 주니어 개발자를 대상으로 한다. 책을 읽어보니 어느정도 아는 내용에 대해선 더 자세히 알수 있어 유용했고, 새롭게 배운 내용은 배운다는 마음으로 읽을 수 있어 좋았다. 책 구성 1부에서는 학업에서 배운 데이터베이스, 보안, 자원관리, 성능 등 다양한 이론을 현장에서 적용할 수 있는 실무적 관점을 제공한다. 데이터베이스의 중요한 개념을 실무에 녹인 관점을 보여주고, 소프트웨어 특징에..
2024.02.21