분류 전체보기(344)
-
[Go] goroutine 과 channel 로 API 실행 시간 개선하기
목차- 서론- 동기식 호출- 비동기 호출 : Goroutine 활용- 비동기 호출 개선 : Channel 활용- 결론 서론여러 테크 기업의 기술 블로그를 읽기 좋아합니다. 다만 매번 여러 블로그 홈페이지를 방문하다 보니 자주 가는 블로그는 따로 모아서 읽고 싶은 생각이 들더라고요. 이를 위해 Go를 활용한 테크 블로그 스크래퍼를 개발하기로 했습니다. 이미 그런 서비스는 많지 않냐고요? 맞습니다. 그래도 한번 직접 해보고 싶었습니다🙃.기업의 블로그들은 다양한 플랫폼을 활용합니다. Medium 부터 자체 블로그를 운영하는 곳까지, 다양한 방식의 기술 블로그를 제공합니다. 각기 다른 형태의 플랫폼을 사용하기 때문에 그에 맞는 스크래핑 방식을 사용해야 합니다. 저는 블로그 플랫폼에 맞는 스크래핑 구현체를 만..
2024.09.13 -
[후기] DB Internals 책 스터디 후기
주절주절 기록하는 8주간의 기록 (책 얘기 별로 없어용) 작년 글또에서 진행한 스터디 뒷풀이가 정기 술 모임으로 변질된지 1년째.간만에 모인 스터디원들과 신나게 떠들다가 동인님의 추천으로 새로운 스터디에 (갑자기) 참여하게 됐다.마침 백수 기간이라 시간적 여유도 있었고 평소에 들어보지 못한 생소한 책이라 호기심도 생겼다.내가 참여한 스터디는 LIVID 에서 주관하는 DB Internals 책 스터디로 총 8주간의 커리큘럼이 예정되어 있었다. 결론부터 말하면, 8주간의 스터디가 끝나고 딱 아래의 짤이 떠올랐다.합의 알고리즘... 해치웠나? (아니요)분산 시스템.. 해치웠나? (nope) 3년을 겨우 채운 백엔드 개발자가 읽기엔 아직 버거운 책이라 느꼈졌다.불과 3달 전에 겨우겨우 데이터 중심 애플리케이션..
2024.09.10 -
[DB] Select For Update 란? (feat. 조회와 업데이트)
SELECT ~ FOR UPDATE 란일반적인 SELECT 구문은 락을 사용하지 않습니다. 락을 획득하지 않아도 데이터를 조회할 수 있죠.하지만 간혹 조회 시점에도 락이 필요한 경우가 있습니다. 예를 들어 정산 시점을 생각해보면, 정산시간 동안은 해당 조회 트랜잭션에서 read 중인 데이터를 다른곳에서 수정하면 안됩니다. 이럴 경우엔 SELECT FOR UPDATE 구문을 사용해 조회 중 수정을 방지할 수 있습니다.쉽게 말해 '내가 데이터를 조회하는 동안은 이 데이터를 수정하지마!' 라고 표현할 수 있고,기술적으로 표현하면 동시성 제어를 위해 특정 Row 에 배타적 LOCK 을 거는 것이라 할 수 있습니다. 실습 server_info 테이블 대상으로 Select for update 쿼리를 실험해보겠..
2024.09.06 -
[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