전체 글 (101) 썸네일형 리스트형 RabbitMQ에서 "발행했다"와 "전달됐다"는 다른 이야기다 publish()는 성공을 보장하지 않는다channel.basicPublish(...)를 호출했을 때 예외가 안 터지면, 메시지가 큐까지 잘 들어갔을 거라고 생각했다. 그런데 아니었다.basicPublish는 기본적으로 fire-and-forget이다. 애플리케이션은 소켓에 바이트를 흘려보낼 뿐이고, 브로커가 실제로 메시지를 받아서 큐에 라우팅했는지는 별도로 확인하지 않으면 알 방법이 없다.대부분의 경우엔 이 정도로 문제가 없다. 다만 아래 두 조건이 겹치면 얘기가 달라진다.발행 실패가 곧 비즈니스 데이터 유실로 이어지는 도메인 (알림 발송, 결제 이벤트, 정산 데이터 등)발행량이 많아서 네트워크 순간 장애나 브로커 클러스터 불안정이 통계적으로 반드시 발생하는 환경"실패하면 재시도하면 되지 않나" 싶었는.. Claude Code hook으로 코드 규칙 자동 강제하기 Claude Code hook으로 코드 규칙 자동 강제하기AI로 개발을 하다보면 이런 상황을 겪는다."이 프로젝트에서는 @Transactional 쓰지 말고 PlatformTransactionManager 직접 써야 해."분명히 말했는데, 대화가 길어지면 AI가 까먹고 다시 @Transactional을 추가한다. 또 말한다. 또 까먹는다. 이걸 반복하다 보면 드는 생각 하나."말로 하지 말고 구조로 막으면 안 될까?"Claude Code의 hook 시스템을 쓰면 된다. 파일을 저장할 때마다 금지 패턴을 자동으로 검사하고, 위반이 있으면 AI에게 피드백을 돌려줘서 스스로 고치게 만들 수 있다.Claude Code hook이란?Claude Code가 도구(Edit, Write, Bash 등)를 사용할 때마.. Java Executors, ExecutorService Executor 는 쓰레드 풀의 구현을 위한 인터페이스이다.등록된 작업을 실행작업 실행을 책임public interface Executor { void execute(Runnable command);} Executors 는 Executor, ExecutorService, ScheduledExecutorService, ThreadFactory 등을 위한 정적 팩토리 메서드를 지원해주는 클래스다.newFixedThreadPool(int n)고정된 쓰레드 풀을 생성한다.CPU 코어 수 기준으로 생성 시 좋은 성능을 얻을 수 있다.newCachedThreadPool()필요한 만큼 쓰레드 풀을 생성한다.쓰레드를 캐싱하는 쓰레드풀일정 시간 동안 쓰레드를 검사하여 60초 동안 작업이 없으면 Pool에서 제거한다.쓰레.. Redis-HA 구성하기 Redis ReplicationMaster-Slave 구조하나 이상의 마스터 서버가 있고, 각 마스터 서버는 하나 이상 복제된 서버를 가질 수 있습니다.장애 조치마스터 서버가 다운되었을 때, Redis Sentinel이 복제된 서버 중 하나를 마스터 서버로 승격시키고 클라이언트에게 알리는 메커니즘 존재Redisversion: '3'networks: app-tier: driver: bridgeservices: redis: image: 'bitnami/redis:latest' container_name: redis environment: - REDIS_REPLICATION_MODE=master - ALLOW_EMPTY_PASSWORD=yes networks: .. Spring Boot에서 전략 패턴 사용하기 전략패턴 전략 패턴은 런타임 중에 알고리즘 전략을 선택하여 객체 동작을 실시간으로 바뀌도록 할 수 있게 하는 행위 디자인 패턴 어떤 일을 수행하는 알고리즘이 여러가지 일때, 동작들을 미리 전략으로 정의함으로써 손쉽게 전략을 교체할 수 있는, 알고리즘 변형이 빈번하게 필요한 경우 적합한 패턴이다. 첫 번째 시도 우선 전략 패턴을 위한 인터페이스와 enum을 작성하였다. public interface Strategy { void execute(); } @Getter @RequiredArgsConstructor public enum StrategyType { A("strategyA"), B("strategyB"), C("strategyC") private final strategyName; } 전략 패턴을 위.. JAVA를 사용한 외부 API 호출 방법 Java로 외부 API를 통신하는 HTTP Library에 대해 알아보겠습니다. HttpURLConnection Java에서 기본적인 HTTP 통신을 수행하기 위한 클래스이다. 장점 Java 표준 라이브러리에 포함되어 있어 추가적인 의존성이 필요 없다 간단한 HTTP 통신에 적합하며 기본적인 요청 및 응답 처리가 가능하다. 단점 기능이 제한적이며, 고급 기능이나 편의 기능이 부족할 수 있다. 코드가 비교적 복잡하다. 응답코드가 4xx 이거나 5xx 일 경우 IOException 타임아웃을 설정할 수 없다. 쿠키 제어가 불가능하다. HttpClient Java 11에 도입된 새로운 HTTP 클라이언트이고 HTTP/2, WebSocket을 지원한다. HttpURLConnection은 비동기 처리를 위해 별도.. 이진탐색을 활용하는 여러가지 경우 구현 이진 탐색 이진탐색이란 중복 값이 없는 정렬된 배열에서 원하는 값을 찾는 효율적인 알고리즘이다. 핵심 로직 배열의 중앙값을 구한다. 중앙값과 찾고자 하는 값(target)과 비교한다. 중앙값 target 인 경우 : 끝점을 중앙값의 -1 값으로 선택 (중앙 기준 오른쪽을 버린다.) 배열에 있는 값의 인덱스 찾기 public static int search(int[] temp, int target) { int start = 0; int end = temp.length - 1; int result = -1; while(start target){ end = mid - 1; } else { return m.. Dockerfile에 대해서 알아보자 Dockerfile 이란 Docker Image를 만드는 스크립트이다. Docker Hub에서 미리 만들어져있는 Image를 사용하는 것이 아니라 사용자가 직접 Custom 하여 Image를 만들 수 있는 파일 Dockerfile 명령어 FROM 생성할 이미지의 베이스가 되는 이미지 ex) Ubuntu, CentOS, JDK, Node.js WORKDIR 컨테이너 내에서 작업할 디렉토리 설정 COPY host에서 이미지에 파일 복사하여 추가 ADD host안에 있는 파일/디렉토리 추가 copy와 다른 점은 압축파일은 해제하여 추가해준다 EXPOSE host와 연결할 포트 번호를 설정 컨테이너 실행 시 -p 로 대체 가능 ENV 환경변수 설정 RUN 컨테이너 내부에서 돌아갈 명령어 이미지가 생성 되기 전에.. 이전 1 2 3 4 ··· 13 다음