분류 전체보기 28

내가 보려고 작성한 비동기 논블로킹 정리 글

비동기 논블로킹 I/O의 가장 큰 장점은 하나의 스레드로 여러 I/O 작업을 동시에 처리할 수 있다는 점입니다. 이는 epoll_wait (Linux), kqueue (BSD/macOS), IOCP (Windows) 같은 OS 레벨 시스템 콜을 통해 여러 파일 디스크립터(FD)를 하나의 스레드가 구독하고 I/O 완료를 기다리는 방식으로 구현됩니다[1][2].이벤트 루프이벤트 루프는 비동기 논블로킹 I/O의 핵심 메커니즘입니다[3].동작 과정I/O 이벤트 등록: 관심 있는 FD와 감시할 이벤트 유형(읽기/쓰기)을 커널에 등록 (epoll_ctl, kevent 등)대기: epoll_wait 같은 시스템 콜로 등록된 FD 집합에 이벤트가 발생할 때까지 블록처리: 이벤트가 발생하면 깨어나서 해당 FD에 대한 작..

서버 2025.12.03

커머스에서 메시지큐 도입 검토하기 (Database-per-Service 패턴을 중심으로)

개요Rockpay 백엔드는 빠르게 서비스를 구축하기 위해 모놀리식 아키텍처로 시작했습니다. 저는 주문 서비스와 강결합을 피하기 위해 필요에 따라 독립적으로 확장할 수 있는 두 개의 서비스로 분리 하였습니다.주문 서비스 : 주문 관련 기능만을 담당하며, 트래픽이 몰릴 때 이 서비스만 선택적으로 확장할 수 있습니다.코어 서비스 : 주문을 제외한 나머지 기능을 담당합니다. 새로운 통신 방식 검토분리된 서비스 간의 통신을 위해 처음에는 HTTP 기반의 동기 통신을 고려했습니다. 하지만 Request-Response 모델은 서비스 사이의 결합도를 높여, 한 서비스의 변경이나 통신 실패가 다른 서비스에 직접적인 영향을 주는 문제가 있습니다. 이러한 단점을 보완하고 시스템 전체의 안정성과 확장성을 높이기 위해, 비동..

서버 2025.11.19

CAS로 인해 생기는 ABA 문제와 해결법

CAS (Compare-And-Swap)CAS는 멀티스레드 환경에서 공유 변수를 동시성 문제가 없도록 수정하기 위한 원자적 연산이다. 메모리의 현재 값을 읽고, 예상 값과 비교한 후, 같으면 새 값으로 교체하고 다르면 실패한다. 락을 사용하지 않아 성능이 좋고 데드락이 발생하지 않는다는 장점이 있다.ABA 문제CAS의 값 기반 비교에서 문제가 발생한다. 스레드가 값 A를 읽은 후 대기하는 동안, 다른 스레드가 A를 B로 변경했다가 다시 A로 되돌리면, 첫 번째 스레드는 값이 변경되지 않았다고 판단하여 CAS가 성공 처리 된다. 하지만 실제로는 중간에 상태 변경이 있었다.계좌 송금 예시계좌 잔액이 100원인 상황에서 스레드1이 잔액 100을 읽고 10원을 출금하려고 2초간 대기한다. 이때 스레드2가 50원..

서버 2025.11.19

connection pool maxWait

커넥션 풀에서 커넥션을 할당하기 위해 발생시키는 알림(notify notify all) 얼마나 기다릴것인지를 명시한 값이다. 만약 커넥션 풀이 부족할 경우 앞서 생긴 request가 커넥션을 획득 하기 위해 maxWait만큼 대기해서 정작 필요한 request들이 커넥션을 획득하지 못하게 된다. maxwait을 더 큰 값으로 하게 된다면, 응답이 느려질 수 있다. 반대로 작게 하게 된다면 너무 빨리 connection을 획득 실패 하게 되어 사용자가 에러 응답을 받을 수 있다. 적절한 값을 찾아 세팅하는 것이 중요하다. ref- https://d2.naver.com/helloworld/5102792

디비 2025.09.30

spring transaction self invocation 문제

Bean을 통한 호출이 아닌 경우에는 Proxy가 self invocation된 메소드를 인터셉트하지 못하기 때문에 @Transactional이 적용되지 않는다.Spring은 Bean의 메소드를 CGLIB Proxy로 감싸 트랜잭션을 처리하는데, self-invocation으로 호출된 메소드는 Proxy를 거치지 않으므로 트랜잭션 처리가 불가능하다. 따라서 this.method() 형태로 메소드를 호출하면, 해당 메소드에 선언된 트랜잭션은 동작하지 않는다. 해결 법은 transaction을 self invocation 처리된 메소드에 달지 않고 감싸진 메소드에 넣는다. 필요하다면, self invocation 된 메소드를 다른 클래스로 따로 추출한다.

서버 2025.09.09

이벤트 루프 vs 블로킹 멀티쓰레드

이벤트 루프 개념I/O 이벤트 등록: 관심 있는 FD(파일 디스크립터)와 어떤 이벤트(읽기/쓰기)를 감시할지 커널에 등록 (epoll_ctl 등)대기: epoll_wait 같은 호출로 등록된 FD 집합에 이벤트가 생길 때까지 블록처리: 이벤트가 발생하면 깨어나서 해당 FD에 대한 작업 수행반복: 처리가 끝나면 다시 대기 단계로 돌아가 루프를 반복특징소수의 스레드로 다수의 연결 처리: 한 이벤트 루프 스레드가 수천 개의 FD를 감시 가능논블로킹 방식: 이벤트가 준비된 것만 처리하므로 CPU 사용 효율적콜백/핸들러 구조: 각 이벤트마다 지정된 콜백 함수 실행요약이벤트 루프 = I/O 이벤트 감시 + 처리의 반복 구조단일 스레드에서도 다수 FD 처리 가능 → 스레드-당-연결 구조보다 효율적블로킹 멀티스레드에서..

서버 2025.09.03

자바 메소드 레퍼런스란

자바에서 메소드 레퍼런스는 특정 메소드만을 호출하는 람다 표현식을 더 간단하게 표현할 수 있는 방법입니다. 메소드 레퍼런스는 함수형 인터페이스의 구현을 위해 이미 정의된 메소드를 참조하는 데 사용됩니다. 이 구문은 코드를 더 간결하게 만들어주며, 가독성을 향상시키는 데 도움을 줍니다.정적 메소드 참조 1. 클래스의 정적 메소드를 참조:문법: 클래스명::메소드명Arrays.sort(numbers, Integer::compare);2. 특정 객체의 인스턴스 메소드 참조:문법: 객체참조::메소드명List messages = Arrays.asList("Hello", "World");messages.forEach(System.out::println);3. 임의 객체의 인스턴스 메소드 참조: 같은 타입의 어떤 객체..

카테고리 없음 2024.05.01

내가 느낀 객체지향 프로그래밍에 대해서 (의존성을 중심으로)

객체 지향 프로그래밍은 현실의 중요한 문제를 해결 하기 위한 과정을 배치는 방법이다. 반대로, 절차 지향은 문제 해결 과정을 서술한다. 순서대로 나열된다는 뜻이다. 왜 보통 사람들에게 익숙한 문제를 서술하는 방법을 사용하지 않는 방법이 등장 했을까? 순차적으로 작성하는 방법은 마치 자전거 체인 처럼 부속품 사이에 커다란 의존성이 생긴다. 의존성이 여럿이면 문제를 해결하기 어렵게 한다. 하나의 문제가 아니라 여러개의 문제를 해결해야 하기 때문이다. 반면, 배치 하는 방식을 사용하면 의존이 생기지 않는다. 순차적인 방식보다 문제의 범위를 더 좁힐 수 있다고 생각한다.

자바 2024.04.06