본문 바로가기

전체 글147

[알고리즘] LIS - 최장 증가 부분 수열(dp,이진탐색,수열 복원) LIS (최장 증가 부분 수열: Longest Increasing Subsequence)LIS란 최장 증가 부분 수열로 어떤 수열에서 오름차순으로 정렬된 가장 긴 부분 수열을 의미한다.여기서 부분 수열이란 원소의 순서를 유지한 채, 일부 원소를 골라 만든 수열이다.수열: [10, 20, 10, 30, 20, 50]LIS: [10, 20, 30, 50] → 길이 4구현 방법일반적으로 DP와 이진 탐색을 이용해서 구현할 수 있다.DP: O(n²)이진 탐색: O(n log n)DP로 구현하기int[] dp = new int[n];Arrays.fill(dp, 1); // 최소 길이 1for (int i = 0; i i 번째 까지 반복하면서 이전 인덱스 j 들을 확인한다.arr[i]가 arr.. 2025. 4. 21.
[MSA] MSA 환경에서 EDA 기반으로 사용자 요청 비동기 처리하기 프로젝트를 진행하며, 성향 분석 요청과 같은 특정 로직에 트래픽이 집중될 것이라 판단하였고, 이에 따라 서비스의 확장성과 안정성을 확보하기 위해 MSA(Microservices Architecture) 를 도입했다.성향 분석 과정은 여러 서비스에 의해 처리되는 복잡한 구조를 가지고 있으며, 초기에 이를 동기 방식으로 처리할지 고민했지만,하나의 서비스 지연이나 실패가 전체 프로세스에 영향을 미칠 수 있기 때문에, 서비스 간 비동기 이벤트 흐름을 기반으로 유연하게 처리할 수 있는 EDA(Event-Driven Architecture) 를 적용했다.이를 통해 각 서비스가 낮은 결합도로 유연하게 연동되며, 이벤트 기반의 통신을 통해 확장성과 장애 대응 측면에서 높은 안정성을 확보할 수 있는 구조를 완성 할 수 .. 2025. 4. 17.
[Kafka] Kafka 파티션, 컨슈머, 그룹 (파티션 리밸런싱, 컨슈머 리밸런싱) 이전글(https://bangbaeking.tistory.com/161)에서 카프카와 카프카 클러스터에 대해 정리해 보았다.카프카의 병렬 처리 구조의 핵심인 파티션(Partition), 컨슈머(Consumer), 그리고 컨슈머 그룹(Group)에 대해 더 깊이 알아보려고 한다.파티션이란?우리는 Kafka에서 토픽을 생성하고, 해당 토픽에 메시지를 전달한다.토픽은 데이터를 저장하는 논리적 단위이고, 토픽은 여러개의 파티션으로 나뉠수 있다.즉, 하나의 토픽은 여러 파티션으로 분할되어 데이터를 저장하고, 여러 파티션을 통해 메시지를 동시에 소비함으로써 병렬성을 높일 수 있다.그렇다면 토픽으로 들어온 메시지는 어떤 기준에 따라 여러 파티션으로 분배될까?파티션에 메시지가 어떻게 분배될까?Kafka는 Produce.. 2025. 4. 7.
[Kafka] Kafka의 기본 개념 및 구성 요소(Kafka 클러스터) 최근 프로젝트에서(https://bangbaeking.tistory.com/160) Kafka를 사용했지만, 면접에서 "Kafka 클러스터가 뭔가요?" 라는 질문에 정확히 답변하지 못했다. (브로커를 여러개 설정해서 어쩌구 고가용성 저쩌구) 그래서 카프카 클러스터가 뭔지 정리해보려고 한다. 결론부터 정리하면 Kafka 클러스터는 여러 개의 브로커로 구성된 분산 시스템으로, 데이터의 고가용성과 확장성을 보장하는 Kafka의 핵심 구조이다. 카프카란?Apache Kafka는 대용량 데이터의 실시간 스트리밍을 처리하기 위한 분산 메시지 큐 시스템이다.대규모 데이터 파이프라인, 실시간 데이터 분석, 로그 수집, 이벤트 기반 아키텍처 등에 활용된다.Kafka의 주요 특징은 다음과 같다.높은 처리량(High Thr.. 2025. 3. 9.
[MSA] Orchestration 기반 SAGA 패턴을 활용한 분산 트랜잭션 처리 이전 글에서(https://bangbaeking.tistory.com/159) Orchestration 기반의 SAGA 패턴을 활용하여 분산 트랜잭션을 처리했다고 언급했는데, 이번에는 그 과정을 좀 더 자세히 정리하고자 한다. 전체적인 구조는 아래와 같다.1. 결제 서비스의 트랜잭션 흐름결제 프로세스 개요현재 결제 관련 플로우는 다음과 같다.클라이언트에서 외부 결제 API에 결제 요청을 보낸다.결제가 성공하면 서버에서 비즈니스 로직이 실행된다.비즈니스 로직 처리 단계비즈니스 로직의 주요 단계는 다음과 같다.결제 내역 저장 (결제 서버)쿠폰 사용 업데이트 (쿠폰 서버)회원 수업 횟수 증가 (회원 서버)2. MSA 환경에서의 분산 트랜잭션 문제현재 서비스는 결제, 쿠폰, 회원 서비스가 각각 독립된 MSA 구.. 2025. 3. 2.
[MSA] MSA 환경에서의 분산 트랜잭션 처리(2PC, SAGA) MSA(Microservices Architecture) 환경에서는 각 서비스가 독립적으로 데이터베이스를 관리하기 때문에 기존의 단일 시스템에서 사용하던 트랜잭션 처리 방식이 적용되기 어렵다. 이를 해결하기 위해 다양한 분산 트랜잭션 관리 기법이 사용된다. 분산 트랜잭션이란?서로 다른 서비스가 하나의 비즈니스 로직에 참여할 때, 모든 서비스의 작업이 성공해야만 전체 트랜잭션이 커밋된다.일부 서비스만 성공하고 다른 서비스가 실패하면 데이터의 일관성이 깨질 수 있으므로, 이를 방지하기 위해 분산 트랜잭션 관리가 필요하다.예시:현재 진행중이 프로젝트를 예시로 들면, 사용자가 외부 결제 API를 통해 결제를 성공했을 때의 처리 과정은 다음과 같다.결제 서버: 결제 내역을 데이터베이스에 저장쿠폰 서버: 쿠폰 사용.. 2025. 2. 23.
[Database] MongoDB와 RDB의 차이점 (Master-Slave와 Sharding) 프로젝트를 진행하며 채팅 내역을 MongoDB에 저장하기로 결정했다. 이는 MongoDB가 NoSQL 데이터베이스로서, 채팅 내역과 같은 비정형 데이터를 저장하는 데 더 적합하고, 조회 속도 또한 빠르기 때문이다. MongoDB가 이러한 장점을 가지는 이유를 RDB와 비교하며 정리해보려고 한다. RDB(Relational Database)란?RDB는 관계형 데이터베이스(Relational Database)의 약자로, MySQL, Oracle, PostgreSQL 등 대표적이다. 데이터를 행(Row)과 열(Column)로 구성된 테이블 형태로 저장하며, 스키마(Schema)라는 데이터 구조를 미리 정의하는 것이 특징이다.RDB의 장점명확한 스키마 구조데이터를 테이블 형태로 관리하며, 사전에 정의된 스키마를.. 2025. 2. 16.
[Spring Cloud] MSA 서버 간 호출방식 비교 (RestTemplate, FeignClient, WebClient, RestClient) MSA 프로젝트를 진행하면서, 서비스 간 통신이 필요한 상황이 발생했다. 이를 해결하기 위해 HTTP 클라이언트를 찾아본 결과 RestTemplate, FeignClient, WebClient, RestClient 네 가지 방식이 존재했다. 각 방식의 특징과 장단점을 비교한 후, 우리의 요구사항에 가장 적합한 방법을 선택했다.우리의 경우 MSA에서 서비스 간 호출이 목적이므로, FeignClient를 사용하기로 결정했다. RestTemplate (Spring 5 이전 사용)개발이 중단되었으며, RestClient 사용을 권장한다.RestTemplate은 Spring 5 이전까지 사용되던 동기식 HTTP 클라이언트로,Spring Boot 3.2 이상에서는 RestClient 사용이 권장된다.특징동기 방식(.. 2025. 2. 8.
[Docker] DinD(Docker in Docker) 와 DooD(Docker out of Docker) 프로젝트를 진행하며 EC2에 Jenkins를 배포하여 CI/CD 파이프라인을 구축하였다. 이 과정에서 컨테이너 환경에서 실행 중인 Jenkins에서 docker-compose: not found 오류가 발생하는 문제가 있었고, 이를 해결하는 과정에서 DinD(Docker-in-Docker)와 DooD(Docker-out-of-Docker) 방식에 대해 학습하게 되었다. CI/CD 파이프라인 흐름개발자가 GitLab에 코드를 push한다.GitLab에 설정된 webhook을 통해 push 이벤트가 Jenkins로 전달된다.Jenkins는 GitLab의 최신 코드를 가져와 테스트 및 빌드를 수행한다.빌드 과정에서 docker-compose up -d --build 명령을 실행하여 새로운 코드 기반으로 컨테이.. 2025. 2. 2.