본문 바로가기

전체 글

(36)
[Kafka] Kafka에서 Avro를 사용하는 이유 목차들어가며Kafka 환경에서 데이터를 주고받을 때 직렬화(Serialization) 과정은 필수이다. 만약, 직렬화에 대해서 모른다면 다음의 글을 먼저 읽어보는 것을 추천한다.2023.08.20 - [Language/Java] - [JAVA] 직렬화(Serialization)란? 프로듀서는 객체를 바이트 배열로 변환해 토픽에 전송하고, 컨슈머는 이를 다시 객체로 복원(deserialize)한다. 이 과정에서 단순히 “객체 → 바이트” 변환만 필요하다면 커스텀 시리얼라이저(Custom Serializer) 를 직접 구현할 수도 있다. 하지만 시스템이 확장되고 데이터 구조가 바뀌기 시작하면 프로듀서와 컨슈머 간의 결합도, 유지보수성, 호환성 문제가 드러나게 된다. 이러한 이유로 Avro, Protobuf,..
[Kafka] Kafka 기초 정리 (메시지 큐, 파티션, DLT, 클러스터 구조) 목차들어가며기존의 모놀리식 애플리케이션을 MSA로 마이그레이션하면서 이벤트 기반 통신이 필요하게되었다. 이를 위해 Redis, RabbitMQ, Kafka 등의 다양한 도구가 있겠지만, MSA 구조에서 많은 장점을 가진 Kafka를 이번 구현에서 선택했다. Kafka는 대규모 데이터를 빠르게 처리할 수 있는 분산 메시징 플랫폼이다. 단순한 메시지 큐 이상의 기능을 제공하며, 비동기 이벤트 기반 시스템을 구성할 때 자주 사용된다.중점적으로 봐야 하는 내용Kafka는 메시지를 토픽(topic) 단위로 관리한다.토픽은 여러 개의 파티션(partition) 으로 구성되어 병렬 처리 성능을 높인다.Kafka는 컨슈머 그룹(consumer group) 단위로 오프셋(offset)을 관리해 메시지 중복 없이 안정적인..
[짧은 책 리뷰] 성공과 실패를 결정하는 1%의 네트워크 원리 제목 : 성공과 실패를 결정하는 1%의 네트워크 원리저자: 츠토무 토네 (Tsutomu Tone) 의 제2판. 한정된 장면이나마 전체의 움직임을 보여주기 위해 네트워크의 움직임을 한 권의 책에 정리했다. 제2판은 여기에" data-og-host="www.aladin.co.kr" data-og-source-url="https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=243233851" data-og-url="https://www.aladin.co.kr/shop/wproduct.aspx?ItemId=243233851" data-og-image="https://blog.kakaocdn.net/dna/SZBkf/hyZKByO0Wi/AAAAAAAAAAAAAAAAAAAAANrUbKh85Ck35h4TATTsj8Z4IGNSaueE1krI1qCF4dio/..?credential=yqXZFxpELC7KVnFOS48ylbz2pIh7yKj8&expires=1764514799&allow_ip=&allow_referer=&signature=gp6m%2F86jUwOwGhp%2BhRBFPzvgdVU%3D
[Spring WebFlux] 왜 WebFlux를 선택했는가? (Tomcat NIO와 비교) 목차들어가며티켓팅 프로젝트에서 Spring WebFlux를 사용했다는 이야기를 하면 종종 이런 질문을 받습니다.“톰캣도 NIO를 지원하는데, 굳이 WebFlux를 선택한 이유가 뭔가요?” 저도 처음에는 “어차피 둘 다 non-blocking이면 큰 차이가 없지 않을까?” 라고 생각했지만, 실제로 비교해보면 철학과 활용 범위에서 확실한 차이가 있었습니다. 이번 글에서는 WebFlux와 Tomcat NIO를 비교하며 WebFlux를 선택한 이유를 정리해 보겠습니다.아키텍처의 차이Tomcat NIOServlet API 기반으로 동작필터 체인, Request/Response 객체 등 서블릿 스펙의 제약 존재WebFluxReactive Streams 표준 기반Netty 같은 이벤트 루프 서버에 최적화서버-프레임워..
[EFFECTIVE JAVA 3/E] #2 생성자에 매개변수가 많다면 빌더를 고려하라 목차중점적으로 봐야 하는 내용선택적 매개변수가 많은 클래스는 생성자나 정적 팩터리 메서드만으로 표현하기 어렵다.점층적 생성자 패턴이나 자바빈즈 패턴은 유지보수성·안정성 측면에서 한계가 있다.이런 경우 빌더 패턴을 사용하면 가독성과 객체 일관성 면에서 유리하다.주요 개념 요약빌더 패턴은 복잡한 객체를 구성할 때 필수 매개변수와 선택 매개변수를 분리하고, 단계별 설정을 가능하게 하는 설계 기법이다.보통 클래스 내부에 정적 멤버 클래스로 Builder를 두고, 메서드 체인 방식으로 속성들을 설정한 뒤 build() 메서드로 객체를 생성한다.장점매개변수가 많은 경우 코드 가독성이 좋아진다.필수 매개변수와 선택 매개변수를 명확히 구분할 수 있다.메서드 체인(Fluent API)을 통해 설정이 직관적이다.계층적으로..
[EFFECTIVE JAVA 3/E] #1 생성자 대신 정적 팩터리 메서드를 고려하라 목차중점적으로 봐야 하는 내용클래스는 생성자와 별도로 정적 팩터리 메서드를 제공할 수 있다.정적 팩터리 메서드는 생성자와 달리 이름을 가질 수 있어 의도를 명확히 표현할 수 있다.또한, 하위 타입 반환, 인스턴스 재사용, 구현체 캡슐화 등 다양한 이점을 제공한다.주요 개념 요약정적 팩터리 메서드는 new 키워드로 객체를 직접 생성하지 않고,클래스 내부에 선언된 static 메서드를 통해 객체를 반환하는 방식이다. 예시:public class User { private final String name; private User(String name) { this.name = name; } public static User of(String name) { ret..
[TypeScript] 추상 클래스 vs 인터페이스 - 직원 조직도로 이해하기 목차 TypeScript에서 추상 클래스(abstract class)와 인터페이스(interface)는 둘 다 “규약”을 정의하는 도구이다. 하지만 실제 목적과 사용법은 다르다. 이번 글에서는 직원 조직도 비유를 통해 이 차이를 쉽게 정리해보고자 한다.추상 클래스 vs 인터페이스 — 핵심 차이인터페이스 (interface)컴파일 후 사라짐: 타입 정보만 제공, JS 출력 없음.구조적 타이핑: 이름이 아니라 모양(shape) 이 같으면 호환.다중 구현 가능: class A implements I1, I2선언 병합 가능: 같은 이름의 인터페이스를 여러 번 정의하면 자동으로 합쳐짐.상태(필드) 불가: 런타임 상태나 공통 구현은 가질 수 없음.추상 클래스 (abstract class)런타임에 남음: 공통 메서드..
[짧은 책 리뷰] LUVIT♥ 나의 첫 타입스크립트 프로젝트 제목 : LUVIT♥ 나의 첫 타입스크립트 프로젝트부제: 타입스크립트 + 리액트 + NestJS + 몽고DB로 나만의 블로그 만들기저자: 조용수 LUVIT♥ 나의 첫 타입스크립트 프로젝트 | LUVIT(러빗) 시리즈 | 조용수타입스크립트는 자바스크립트의 슈퍼셋 언어로, 웹 개발 및 대규모 프로젝트에서 널리 채택되고 있다. 이 책은 타입스크립트의 기본 개념부터 핵심 문법, 고급 기능까지 살펴보고, 나만의 블로www.aladin.co.kr 나는 이미 자바스크립트 기반으로 개발을 하면서 타입스크립트도 어느 정도 사용해본 상태였다. 그래서 이번에는 단순히 문법을 익히는 것보다는, 타입스크립트를 실제 프로젝트에 적용해보는 경험을 원했다. 이 책의 제목과 소개에 있는 “나의 첫 타입스크립트 프로젝트” 라는 문구를..