전체 글 83

낙관적 락과 비관적 락

낙관적 락(Optimistic Lock)과 비관적 락(Pessimistic Lock)은 **동시성 제어(concurrency control)**를 위한 두 가지 대표적인 전략입니다. 주로 데이터베이스나 ORM(JPA 등)에서 다중 트랜잭션이 동시에 동일한 데이터를 조작할 때 발생할 수 있는 **경쟁 상태(race condition)**나 데이터 무결성 문제를 방지하기 위해 사용됩니다.🟢 낙관적 락 (Optimistic Lock)✅ 개념충돌이 거의 없을 것이라는 전제 하에 동작.트랜잭션 동안 락을 걸지 않고, 최종 커밋 시점에 버전 정보나 타임스탬프를 비교하여 충돌을 감지함.충돌이 나면 커밋을 실패시키고, 예외를 발생시켜 롤백하거나 재시도.✅ 구현 방식 (JPA 기준)@Version 애너테이션을 사용하여..

데이터베이스 2025.04.17

Redis 자료구조 설명

1. String가장 기본적인 자료구조입니다.하나의 key에 하나의 문자열 값을 저장합니다.숫자, JSON, base64 등 다양한 형식의 데이터를 담을 수 있습니다.🟢 사용 예:사용자 이름, 토큰, 설정 값 저장카운터, TTL을 가진 데이터 등2. List양방향 연결 리스트 구조입니다.순서가 유지되며, 양 끝에서 push/pop 할 수 있습니다.🟢 특징:FIFO (큐) 또는 LIFO (스택) 구조로 사용할 수 있음🟢 사용 예:작업 큐채팅 메시지 목록로그 수집 (X개의 최근 메시지만 유지)3. Set중복을 허용하지 않는 무작위 순서의 집합입니다.삽입 순서를 기억하지 않습니다.🟢 특징:값의 존재 여부 확인이 빠름 (SISMEMBER)집합 연산 가능 (합집합, 교집합, 차집합)🟢 사용 예:태그 목록..

프로그래밍 2025.04.17

Redis 명령어 정리

1. String기본 명령어SET name "Jinwook"GET nameINCR count실행 결과OK"Jinwook"(integer) 1설명SET은 문자열 값을 저장합니다.GET은 저장된 값을 조회합니다.INCR은 정수 값을 1 증가시키며, 존재하지 않으면 0으로 간주합니다.2. List (연결 리스트)기본 명령어LPUSH fruits "apple"RPUSH fruits "banana"LPUSH fruits "orange"LRANGE fruits 0 -1LPOP fruits실행 결과(integer) 1(integer) 2(integer) 31) "orange"2) "apple"3) "banana""orange"설명LPUSH/RPUSH는 왼쪽/오른쪽에 요소를 추가합니다.LRANGE key 0 -1은 리..

프로그래밍 2025.04.17

PostgreSQL에서 불필요한 인덱스를 찾는 방법

1. 사용되지 않는 인덱스 찾기아래 쿼리는 PostgreSQL의 pg_stat_user_indexes 뷰를 사용하여 최근 사용되지 않은 인덱스를 찾습니다.SELECT schemaname || '.' || relname AS table_name, indexrelname AS index_name, idx_scan AS index_scans, pg_size_pretty(pg_relation_size(indexrelid)) AS index_sizeFROM pg_stat_user_indexesJOIN pg_index USING (indexrelid)WHERE idx_scan = 0ORDER BY pg_relation_size(indexrelid) DESC;📌 설명:idx_scan = 0 ..

데이터베이스 2025.03.16

사가(Saga) 패턴이란?

사가(Saga) 패턴은 분산 시스템에서 데이터 일관성을 유지하기 위해 사용되는 트랜잭션 관리 패턴입니다. 일반적인 트랜잭션(ACID 트랜잭션)과 달리, 사가는 여러 개의 서비스 또는 데이터베이스에 걸쳐 있는 긴 작업을 **작은 단위의 트랜잭션(로컬 트랜잭션)**으로 나누어 실행합니다.사가 패턴은 마이크로서비스 아키텍처에서 많이 사용되며, 분산 트랜잭션을 대신하는 대안으로 활용됩니다.사가 패턴의 동작 방식사가 패턴은 여러 개의 서비스가 참여하는 트랜잭션을 작은 로컬 트랜잭션의 연속적인 흐름으로 처리하는 방식입니다.각 로컬 트랜잭션이 성공하면 다음 단계로 진행, 실패하면 보상(rollback) 작업 수행이 이루어집니다.사가 패턴에는 크게 두 가지 방식이 있습니다.1. 조정 중심(Choreography-bas..

프로그래밍 2025.03.15

빈혈 모델은 DDD인가요?

"빈혈 모델(Anemic Domain Model)"은 DDD(Domain-Driven Design)의 개념과 대조되는 설계 방식입니다. 즉, 빈혈 모델은 DDD의 원칙을 따르지 않는 모델로 볼 수 있습니다.빈혈 모델(Anemic Domain Model)이란?빈혈 모델은 객체가 비즈니스 로직 없이 데이터만을 보유하고, 모든 로직이 서비스 계층에 집중되는 구조를 의미합니다. 주로 다음과 같은 특징이 있습니다:엔티티(Entity): Getter/Setter만 존재하고, 비즈니스 로직이 없음.서비스(Service): 모든 도메인 로직이 서비스 계층에서 수행됨.DTO(Data Transfer Object)와 유사: 객체는 데이터를 전달하는 역할만 함.이런 구조는 객체지향적이라기보다는 절차지향적인 설계에 가까우며,..

프로그래밍 2025.03.15

아웃박스 패턴 (Outbox Pattern)이란?

**아웃박스 패턴(Outbox Pattern)**은 데이터베이스 트랜잭션과 메시지 브로커(예: Kafka, RabbitMQ)의 일관성을 유지하기 위해 사용되는 패턴입니다.특히 이벤트 기반 아키텍처에서 메시지 유실을 방지하고, 데이터 정합성을 보장하는 데 활용됩니다.1. 문제 상황✅ 트랜잭션과 이벤트 발행의 불일치서비스에서 데이터베이스에 변경 사항을 저장하고 동시에 메시지 브로커에 이벤트를 발행해야 할 때, 이 두 작업이 원자적으로(Atomic) 수행되지 않으면 데이터 정합성이 깨질 수 있습니다.예를 들어:사용자가 주문을 생성 (orders 테이블에 INSERT)이벤트 브로커(Kafka)에 "주문 생성됨" 이벤트 발행만약 2번 단계에서 장애가 발생하면?주문 데이터는 DB에 저장되었지만, 이벤트 브로커에는 ..

프로그래밍 2025.03.14

Anemic Model (빈혈 모델)란?

**Anemic Domain Model(빈혈 도메인 모델)**은 객체지향 프로그래밍(OOP)의 핵심 개념을 충분히 활용하지 못한 도메인 모델을 의미합니다. 이는 도메인 객체가 데이터(필드)만 포함하고, 비즈니스 로직은 별도의 서비스 계층에서 처리하는 구조를 가질 때 발생합니다.1. 특징Anemic Model은 다음과 같은 특징을 가집니다.도메인 객체(엔티티, 밸류 객체)에는 데이터만 존재하고, 의미 있는 비즈니스 로직이 없음비즈니스 로직이 서비스 계층(Application Service)에 집중됨Getter/Setter 메서드만 제공하는 단순한 데이터 구조 (DTO와 유사)객체지향보다는 절차지향적인 방식으로 개발됨예제 코드 (Anemic Model)public class Order { private..

프로그래밍 2025.03.14

스마트 머니 컨셉(Smart Money Concept, SMC) 완벽 가이드

스마트 머니 컨셉(Smart Money Concept, SMC)은 금융 시장에서 기관 투자자와 대형 자금이 시장을 움직이는 방식과 이를 따라가는 전략을 설명하는 개념입니다. 스마트 머니(Smart Money)는 개인 투자자가 아니라 금융 기관, 헤지펀드, 중앙은행 및 기타 대규모 투자자로 구성되며, 이들은 시장에서 더 많은 정보와 자본을 활용해 움직이기 때문에 개별 투자자보다 우위에 있다고 평가됩니다.스마트 머니 컨셉이란?스마트 머니 컨셉(SMC)은 기술적 분석과 가격 행동(Price Action) 기반의 거래 전략으로, 기관 투자자들이 시장에서 포지션을 설정하는 방식과 이에 따른 패턴을 분석하는 데 중점을 둡니다. 이는 일반적인 이동 평균이나 RSI 같은 보조 지표보다 시장의 유동성과 주문 흐름에 초점..

주식 2025.03.14

PostgreSQL 주의할점

1. 성능 및 튜닝 관련 주의사항✅ 1-1. 적절한 인덱스 사용인덱스를 잘못 사용하면 성능 저하가 발생할 수 있습니다.B-TREE 인덱스는 기본이지만, 경우에 따라 GIN, GiST, BRIN, Hash 인덱스가 더 적합할 수도 있습니다.주의할 점인덱스가 너무 많으면 오히려 성능이 저하됨 (INSERT/UPDATE 성능 저하).LOW CARDINALITY(고유 값이 적은 컬럼)에는 인덱스 효과가 낮음.EXPLAIN ANALYZE를 사용하여 인덱스가 실제로 활용되는지 확인.🔹 문제 예시 (불필요한 인덱스 추가)CREATE INDEX idx_name ON users (name);🔹 해결 방법 (올바른 인덱스 전략)CREATE INDEX idx_name ON users USING GIN (to_tsvect..

데이터베이스 2025.03.14

PostgreSQL에서 VARCHAR(n)을 작게 설정해도 큰 저장 공간을 차지하는가?

PostgreSQL에서 VARCHAR(n)을 작게 설정해도 큰 저장 공간을 차지하는가?📌 결론부터 말하면, VARCHAR(n)을 작게 설정해도 큰 저장 공간을 차지하는 것은 사실이 아닙니다.PostgreSQL은 문자열 크기만큼만 저장하며, 불필요한 추가 공간을 차지하지 않습니다.1. PostgreSQL의 문자열 저장 방식PostgreSQL에서 문자열(VARCHAR(n), TEXT)은 가변 길이 저장 방식을 사용합니다.즉, 저장할 문자열의 실제 길이만큼만 저장되며, 불필요한 패딩(고정 크기 할당)이 발생하지 않습니다.✅ VARCHAR(n)과 TEXT는 저장 방식이 동일PostgreSQL에서 VARCHAR(n)과 TEXT는 동일한 방식으로 저장됩니다.타입특징TEXT길이 제한 없이 저장 가능VARCHAR(n..

데이터베이스 2025.03.13

PostgreSQL 데이터 타입 정리

PostgreSQL의 기본 데이터 타입은 크게 숫자, 문자, 날짜/시간, 논리형, 배열, JSON, 범위 타입 등으로 나눌 수 있습니다. 1. 숫자 타입 (Numeric Types)정수형 (Integer Types)타입크기범위smallint2바이트-32,768 ~ 32,767integer 또는 int4바이트-2,147,483,648 ~ 2,147,483,647bigint8바이트-9,223,372,036,854,775,808 ~ 9,223,372,036,854,775,807실수형 (Floating-Point Types)타입크기설명real 또는 float44바이트단정도 부동소수점 (소수점 이하 약 6자리)double precision 또는 float88바이트배정도 부동소수점 (소수점 이하 약 15자리)고정소..

데이터베이스 2025.03.13

Redis TTL (Time-To-Live) 이란?

**TTL (Time-To-Live)**은 Redis에서 특정 키의 유효 기간(만료 시간, Expiration Time)을 설정하는 기능입니다.TTL이 설정된 키는 지정된 시간이 지나면 자동으로 삭제됩니다.TTL은 캐시 만료, 세션 관리, 임시 데이터 저장 등의 용도로 자주 사용됩니다.1. Redis에서 TTL 설정 및 확인 방법Redis에서 TTL을 설정하는 주요 명령어는 EXPIRE, PEXPIRE, EXPIREAT, PEXPIREAT 입니다.✅ TTL 설정 (EXPIRE)EXPIRE → 키의 TTL을 초(Seconds) 단위로 설정SET session:user123 "active"EXPIRE session:user123 60 # 60초 후 자동 삭제📌 session:user123 키는 60초..

데이터베이스 2025.03.03

Redis RDB vs AOF 비교

Redis는 데이터를 디스크에 저장하는 영속성(Persistence) 메커니즘으로 RDB (Redis Database)와 AOF (Append-Only File) 두 가지 방식을 제공합니다.1. RDB (Redis Database)RDB는 특정 시점(Snapshot)에서 전체 데이터를 저장하는 방식으로, 일정 주기마다 Redis의 데이터를 바이너리 파일(dump.rdb) 형태로 디스크에 저장합니다.📌 RDB의 특징✅ 스냅샷(Snapshot) 방식: 일정 시간마다 데이터를 파일로 저장✅ 바이너리 형식으로 저장: 디스크 공간을 적게 사용하며, 복구가 빠름✅ 저장 파일 (dump.rdb) 단 하나만 존재 → 파일 관리가 간편✅ 성능에 미치는 영향이 적음 (저장 시점 외에는 Redis가 평소처럼 동작)❌ 최근..

데이터베이스 2025.03.03

LRU (Least Recently Used)와 LFU (Least Frequently Used) 알고리즘

LRU와 LFU는 캐시 관리 알고리즘으로, 제한된 크기의 캐시에 데이터를 효율적으로 저장하고 교체하는 방식입니다.1. LRU (Least Recently Used, 가장 오래된 데이터 제거)LRU는 가장 최근에 사용되지 않은(오래된) 데이터를 제거하는 방식입니다.LRU 동작 방식데이터를 요청하면 캐시에 저장 (캐시 공간이 가득 차지 않았다면 그대로 저장)이미 캐시에 있는 데이터를 요청하면 해당 데이터를 가장 최신 위치로 갱신캐시가 가득 찼을 때 가장 오래 사용되지 않은 데이터를 제거LRU 예제캐시 크기: 3요청 순서: [A, B, C, A, D]A 요청 → [A]B 요청 → [A, B]C 요청 → [A, B, C]A 요청 (A가 다시 사용됨) → [B, C, A]D 요청 (캐시 초과 → 가장 오래된 B ..

데이터베이스 2025.03.03

Redis Pipelining이란?

Redis Pipelining은 여러 개의 명령어를 한 번에 전송하고, 응답을 한꺼번에 받는 방식입니다. 이를 통해 클라이언트와 Redis 서버 간의 네트워크 왕복 횟수(RTT, Round Trip Time)를 줄여 성능을 향상시킬 수 있습니다.1. Pipelining이 필요한 이유Redis는 클라이언트-서버 모델을 기반으로 동작합니다. 일반적인 요청-응답 방식에서는 다음과 같이 동작합니다.클라이언트가 Redis에 명령어 전송Redis가 명령을 처리Redis가 응답을 클라이언트로 전송이 과정이 단일 명령어마다 반복되기 때문에, 여러 개의 명령을 연속으로 실행할 때 네트워크 지연 시간이 발생합니다.예제: 네트워크 지연이 있는 경우[Client] --------(SET key1 value1)-------->..

데이터베이스 2025.03.03

Redis Pub/Sub vs Kafka 비교

Redis와 Kafka는 둘 다 메시징 기능을 제공하지만, 사용 목적과 특성이 다르기 때문에 어떤 것이 더 좋은지는 사용 사례에 따라 다릅니다.1. Redis Pub/Sub vs Kafka 비교특징 Redis Pub/Sub Kafka 메시징 방식발행-구독 (Pub/Sub)로그 기반 메시지 브로커메시지 지속성메시지 소비 후 유지되지 않음 (단기적)메시지가 지속적으로 저장됨 (장기적)확장성단일 노드에서는 빠르지만, 클러스터링이 복잡함분산 시스템으로 설계되어 확장성이 뛰어남성능메모리 기반으로 빠름 (낮은 지연시간)로그 기반이라 지연시간이 조금 높을 수 있음데이터 보존메시지는 구독자가 받지 않으면 사라짐메시지는 설정된 기간 동안 유지됨메시지 재처리불가능가능 (오프셋을 이용해 다시 읽기 가능)트랜잭션 지원없음지..

데이터베이스 2025.03.03

Keep-Alive란?

Keep-Alive는 클라이언트와 서버 간의 연결을 유지하여 여러 개의 요청을 한 번의 연결에서 처리할 수 있도록 하는 기술입니다. 주로 HTTP, TCP, WebSocket 등 네트워크 프로토콜에서 사용됩니다.1. HTTP Keep-Alive1.1 개념HTTP/1.0에서는 기본적으로 요청마다 새로운 TCP 연결을 맺고 응답을 받으면 연결을 종료했습니다. 이 방식은 성능이 좋지 않습니다.HTTP/1.1에서는 Keep-Alive(Connection: keep-alive) 기능이 기본적으로 활성화되어 있어, 하나의 TCP 연결을 유지한 채 여러 개의 요청을 처리할 수 있습니다.1.2 동작 방식클라이언트가 서버에 HTTP 요청을 보낼 때, Connection: keep-alive 헤더를 추가함.서버가 응답을 ..

프로그래밍 2025.03.02

자바와 닷넷 비교 - 접근제어자

C#과 Java의 접근 제어자(Access Modifiers)는 비슷한 개념을 가지지만, 일부 차이점이 있습니다. 아래에서 비교해 보겠습니다.🔹 C#과 Java의 접근 제어자 비교 접근 제어자  C# Java  설명 public✅✅어디서든 접근 가능private✅✅같은 클래스 내에서만 접근 가능protected✅✅같은 클래스 + 하위 클래스에서 접근 가능 (Java는 같은 패키지에서도 가능)internal✅❌같은 어셈블리(프로젝트) 내에서만 접근 가능package-private (default)❌✅같은 패키지 내에서만 접근 가능 (default 접근 제어자)protected internal✅❌같은 어셈블리 또는 하위 클래스에서 접근 가능private protected✅❌같은 어셈블리 내의 하위 클..

프로그래밍 2025.03.02

자바와 닷넷 비교 - 생성자

C#과 Java에서 생성자(Constructor)는 객체를 초기화하는 역할을 합니다. 기본적인 개념은 비슷하지만, 문법과 일부 기능에서 차이가 있습니다. 주요 차이점을 비교해 보겠습니다.1. 기본 생성자 (Default Constructor)C#과 Java 모두 기본 생성자를 명시적으로 선언하지 않으면, 매개변수가 없는 기본 생성자가 자동으로 제공됩니다.C#public class Person{ public string Name { get; set; } // 기본 생성자 public Person() { Name = "Unknown"; }}Javapublic class Person { private String name; // 기본 생성자 public ..

프로그래밍 2025.03.02

자바와 닷넷 비교 - static

C#과 Java에서 static 키워드는 거의 동일한 개념을 가지지만, 몇 가지 중요한 차이점이 있습니다.1. static의 기본 개념C#과 Java 모두 static 키워드를 사용하여 클래스 수준에서 접근할 수 있는 멤버(변수, 메서드, 클래스)를 정의합니다.즉, static 멤버는 인스턴스 없이 클래스 자체에서 접근할 수 있습니다.2. static 변수 (클래스 변수)C#class Example{ public static int count = 0; public Example() { count++; }}Console.WriteLine(Example.count); // 0Example ex1 = new Example();Example ex2 = new Example();..

프로그래밍 2025.03.02

자바와 닷넷 비교 - final과 sealed, final과 readonly and const

C#과 Java에서 각각의 키워드인 final, sealed, readonly, const의 차이점을 비교해 보겠습니다.1. final (Java) vs sealed (C#)Java의 final과 C#의 sealed는 클래스 상속 및 메서드 재정의 방지와 관련이 있습니다.기능Java (final)C# (sealed)클래스 제한final class는 상속 불가능sealed class는 상속 불가능메서드 제한final 메서드는 오버라이드 불가능sealed는 override된 메서드만 사용 가능 (sealed override)변수 제한final 필드는 한 번 할당 후 변경 불가sealed는 변수에 사용 불가예제Java (final)final class FinalClass {} // 이 클래스는 상속 불가능cl..

프로그래밍 2025.03.02

자바와 닷넷 문자열 비교

자바(Java)와 닷넷(.NET)의 문자열 비교 방식에는 몇 가지 차이점이 있습니다. 주요 차이점과 각각의 문자열 비교 방법을 살펴보겠습니다.1. 기본 비교 방식🔹 JavaJava에서 String은 불변(Immutable) 객체입니다.문자열 비교에는 == 연산자와 .equals() 메서드가 사용됩니다.String str1 = "hello";String str2 = "hello";String str3 = new String("hello");System.out.println(str1 == str2); // true (같은 String Pool 참조)System.out.println(str1 == str3); // false (new String()으로 생성 -> 다른 객체)System.o..

프로그래밍 2025.03.02

자바와 닷넷 리플렉션 비교

자바(Java)와 닷넷(.NET)의 Reflection(리플렉션) 기능을 비교해보겠습니다.리플렉션은 클래스, 메서드, 필드 등의 메타데이터를 런타임에 동적으로 조회하고 조작하는 기능을 제공합니다.1. 주요 차이점 비교 항목  Java (Reflection API) .NET (System.Reflection) 네임스페이스java.lang.reflectSystem.Reflection클래스 정보 조회Class 사용Type 사용메서드 호출Method.invoke()MethodInfo.Invoke()필드 값 변경Field.set()FieldInfo.SetValue()생성자 호출Constructor.newInstance()ConstructorInfo.Invoke()성능일반 호출보다 느림 (JVM 최적화 가능)..

프로그래밍 2025.03.02