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); } ..
1️⃣ 왜 clone은 위험할까? 자바의 Cloneable 인터페이스와 Object.clone() 메서드는 객체의 복사를 쉽게 해줄 것 같지만, 실제로는 아님복사가 얕게(shallow) 이루어짐CloneNotSupportedException 예외를 신경써야 함상속 구조에서 불변식을 깨뜨리기 쉬움즉, 잘못 사용하면 버그가 생기기 쉽고, 안전한 복제를 위해선 주의 깊은 설계가 필요함 2️⃣ 얕은 복사로 생기는 문제class Person implements Cloneable { String name; List phones; @Override public Person clone() { try { return (Person) super.clone(); // ..
이번 포스팅에서는 저번 포스팅에서 만든 echo_duck 명령어에 duck이라는 prefix를 붙여 응답하는 메서드를 구현합니다. 🎯 목표 127.0.0.1:6379> echo_duck hello"duckhello" 1️⃣ 커맨드 함수 구현 (with sds, sdscatfmt)Valkey에서는 문자열을 처리할 때 SDS(Simple Dynamic Strings) 라는 Redis 전용 문자열 구조체를 사용합니다.이를 이용해 duck prefix가 붙은 문자열을 조합할 수 있습니다. 📌 server.c에 다음 함수 추가:void echoDuckCommand(client *c) { sds s = sdscatfmt(sdsempty(), "duck%S", c->argv[1]->ptr); addRe..