1️⃣ 메시징 시스템의 공통 목표서비스 간 결합도 낮추기트래픽 폭주를 흡수비동기 처리와 장애 복원력 확보신뢰성 있는 전달하지만 이 공통 목표를 어떤 방식으로 구현하느냐가 Kafka, RabbitMQ, Redis Pub/Sub의 근본적 차이. 2️⃣ Kafka — “로그 스트림 기반 이벤트 플랫폼” 🧠 개념 Kafka는 단순한 메시지 큐가 아니라 분산 로그 저장소.모든 메시지는 디스크에 Append-Only로 기록되고,Consumer Group이 각자 오프셋을 관리하며 읽음. ✅ 강점- 초고속 처리량- 리플레이 가능: retention 기간 동안 재소비 가능- 확장성: Broker + Partition 기반 선형 확장- Exactly-once 처리 지원 (Kafka Streams / Transacti..
전체 글
✉️ seohui.duck.jo@gmail.com1️⃣ 타임아웃 (Timeout)외부 서버가 느려지거나 응답하지 않으면,우리 서버의 스레드는 계속 대기하게 됨. 이런 요청이 쌓이면 스레드가 고갈되어 전체 서비스가 먹통이 됨. 이를 방지하기 위한 게 바로 타임아웃 설정. 타입설명Connection Timeout서버에 연결되는 데 걸리는 시간 제한Read Timeout연결은 됐지만 응답을 읽는 시간 제한Write Timeout요청 본문 전송에 걸리는 시간 제한 외부 API의 평균 응답 시간보다 2~3배 긴 타임아웃을 설정API마다 타임아웃 값을 다르게 설정 2️⃣ 재시도 (Retry)재시도는 일시적 실패를 자동으로 복구하기 위한 메커니즘.하지만 무턱대고 다시 시도하면오히려 중복 요청과 트래픽 폭증을 일으킬 수 있음. 지수적 백오프: 매번 대기 시간을 두 ..
1️⃣ CAP 정리란?분산 시스템에서는 Consistency, Availability, Partition Tolerance 세 가지를 동시에 만족할 수 없다 즉, 3개 중 2개만 선택할 수 있다는 것이 CAP의 핵심.항목의미C (Consistency, 일관성)모든 노드가 같은 데이터를 본다A (Availability, 가용성)모든 요청에 대해 응답을 반환한다 (성공 or 실패)P (Partition Tolerance, 분할 내성)네트워크 단절이 발생해도 시스템이 계속 동작한다 2️⃣ 각 개념 자세히 보기🧩 1. Consistency (일관성)모든 노드가 같은 데이터를 보고 있어야 한다는 뜻.즉, A 노드에 쓴 직후 B 노드에서 읽어도 동일한 값이 나와야 함. 예시: 은행 계좌 잔액이 여러 DB 노드에..
데이터베이스에 수십만, 수백만 건의 데이터가 쌓이면 검색 속도가 눈에 띄게 느려짐.SELECT * FROM user WHERE name = '영식'; 이 쿼리가 1초 이상 걸린다면, 문제는 단순히 CPU나 네트워크가 아님.대부분은 인덱스가 없거나 잘못 설정된 경우임. 1️⃣ 인덱스란?데이터베이스에서 인덱스는데이터를 빠르게 찾기 위한 별도의 자료 구조. 📖 책의 모든 페이지를 앞에서부터 한 장씩 넘기며 찾는 게 Full Scan 📚 목차를 보고 바로 해당 페이지로 가는 게 Index Scan 즉, 인덱스는 검색 성능을 높이기 위한 추가 데이터 구조(B-Tree, Hash 등)로,WHERE, JOIN, ORDER BY 등에 사용됨. 2️⃣ 인덱스가 없으면 어떤 일이 생길까?테이블에 인덱스가 없으면,..
대부분의 백엔드 애플리케이션은 DB와 끊임없이 통신함.문제는, DB와의 연결(Connection)을 매번 새로 여는 것이 꽤 비싼 연산이라는 점.그래서 등장한 것이 바로 "커넥션 풀". 1️⃣ DB 연결은 왜 느릴까?DB 커넥션을 맺는 과정은 단순히 Socket.open() 한 줄이 아님.아래와 같은 과정을 거침.네트워크 연결 생성 (TCP handshake)인증 정보 전달 세션 초기화이 모든 작업이 요청마다 일어나면,매 요청이 DB 연결 시간만큼 지연됨.트래픽이 많을수록 이 비용은 기하급수적으로 늘어남. 2️⃣ 커넥션 풀(Connection Pool)이란?DB 연결을 미리 만들어두고 재사용하자. 커넥션 풀은 DB 연결 객체를 미리 일정 개수만큼 생성해두고,요청이 들어올 때마다 그 중 하나를 빌려 쓰..
1️⃣ 왜 문서화 주석이 중요한가?자바에서는 /** ... */ 형식의 주석을 JavaDoc 주석이라고 부름이건 단순한 설명이 아니라,컴파일러가 인식해서 공식 문서로 변환할 수 있는 API 계약 문서/** * 두 정수의 합을 반환한다. * * @param a 첫 번째 정수 * @param b 두 번째 정수 * @return 두 수의 합 */public int sum(int a, int b) { return a + b;} → javadoc 도구로 자동 HTML 문서 생성 가능 → IDE에서 마우스 올리면 바로 표시됨 2️⃣ “공개된 API”란 무엇인가?"공개된 API"란 단순히 public만 뜻하지 않음외부에서 사용할 수 있는 모든 요소public 클래스, public 메서드라이브러리에서 외부에 ..
1️⃣ “parallelStream() 붙이면 빨라지겠지?”많은 개발자가 스트림을 이렇게 사용함 list.parallelStream() .map(this::expensiveOperation) .collect(Collectors.toList()); "병렬 스트림"이니까 여러 CPU 코어를 활용해서 당연히 더 빠를거라 기대하지만,현실은 다름!병렬 스트림은 마법이 아님올바른 상황에서만 이득이 있고, 그렇지 않으면 오히려 성능이 나빠지거나 오류를 일으킬 수 있음 2️⃣ 스트림 병렬화의 원리병렬 스트림은 내부적으로 ForkJoinPool을 사용해요소들을 여러 쓰레드로 쪼개서 처리함IntStream.range(0, 1_000_000) .parallel() .forEach(i..
1️⃣ 마커란 무엇인가?"마커"란, 추가 메서드 없이 단순히 '특정 속성을 표시'하는 용도의 구조를 말함 자바에는 두 종류가 있음종류예시특징마커 인터페이스 Serializable, Cloneable타입 수준에서 표시마커 애노테이션@Override, @Deprecated소스 코드 수준에서 표시 둘 다 "이 객체는 ~한 성격을 가진다"는 의미를 전달하지만,적용 범위와 역할이 다름 2️⃣ 마커 인터페이스의 대표 예시자바 표준 라이브러리에서 이미 여러 예시를 볼 수 있음public interface Serializable {}public interface Cloneable {} 이 인터페이스들은 메서드를 하나도 가지지 않음그저 "이 객체는 직렬화/복제가 가능하다"는 타입 표시(marker)로만 쓰임 3️⃣ ..
1️⃣ 제네릭은 유연하지만, 타입 제약은 단단하다자바의 제네릭은 타입 안정성을 높이는 대신,타입 불일치에 매우 예민함List objList = new ArrayList();List strList = new ArrayList();objList = strList; // ❌ 컴파일 에러 직관적으로는 "String은 Object의 하위 타입이니까 괜찮지 않나?" 싶지만,List은 List의 하위 타입이 아님 왜냐하면, List에 Integer를 추가할 수도 있기 때문즉, 제네릭 타입은 "불변" 2️⃣ 이때 등장하는 것이 “한정적 와일드카드”?은 와일드카드(wildcard)로"어떤 타입이 올지 모른다"는 뜻 여기에 extends나 super를 붙이면 "한정(bound)"할 수 있음표현의미예시? extends TT..
1️⃣ 중첩 클래스(Nested Class)란?자바에서는 클래스 안에 클래스를 정의할 수 있음이걸 중첩 클래스(nested class)라고 함 종류는 크게 네 가지이다 👇 종류static 여부외부 클래스 참조주 사용처정적 멤버 클래스OX독립적인 유틸리티내부 로직 캡슐화비정적 멤버 클래스XO외부 인스턴스와 강하게 연결로컬 클래스XO메서드 내부의 임시 클래스익명 클래스XO짧은 1회성 구현 2️⃣ 비정적 멤버 클래스의 문제점비정적 멤버 클래스는 무조건 외부 클래스의 인스턴스에 묶여서 존재함class Outer { class Inner { void hello() { System.out.println("Hello from " + Outer.this); } ..
