분류 전체보기 35

[AMQP] RabbitMQ와 DLX/DLQ

개요AMQP (advanced message queuing protocol)란 메세지를 생산하는 Producer와 메세지를 소비하는 Consumer 사이에 메세지를 보관하는 Broker를 두어, 생산자와 소비자를 연결하는 네트워크 프로토콜을 의미한다. AMQP를 사용하는 대표적인 서비스로는 RabbitMQ가 있으며, 구성요소는 다음과 같다.Exchange : 메세지 생산자인 Producer는 메세지를 발행할 때 Queue가 아닌, Exchange에 메세지를 저장한다. Exchange에 저장된 메세지는 Binding Key를 사용하여 사전에 정의된 바인딩 규칙에 따라 적절한 Queue로 옮겨진다.Queue : Queue는 Exchange로 부터 이동해온 메세지들을 보관하는 저장소로서, 메세지 소비자인 Co..

CS 2025.03.24

[DB] 트랜잭션 격리 수준과 부정합 문제 (1)

DBMS의 데이터 변경 작업을 진행할 때 우리는 작업의 최소 단위인 트랜잭션을 기준으로 데이터의 상태를 변경한다.트랜잭션을 이해하기 위해서는 전파 속성과 격리 수준을 반드시 살펴보아야 한다. 지난 글에서 전파 속성에 대해 정리하였으니, 이번 글에서는 격리 수준에 대해 정리하고자 한다.그리고 격리 수준에 따른 부정합 문제에 대해서도 간략하게 다뤄본다.스프링을 활용한 개발에서는 일반적으로 Configuration에서 PlatformTransactionManager를 Bean으로 등록한 후 비즈니스 Layer 혹은 application Layer에서 @Transactional 어노테이션을 활용하여 트랜잭션을 관리한다.@Transactional 어노테이션은 전파 속성과 격리 수준을 트랜잭션 별로 제어할 수 있도..

[DB] 낙관적, 비관적 락 (Optimistic Lock, Pessimistic Lock)

개요다중 요청을 처리하는 동시성 환경에서 데이터의 정합성과 일관성을 보장하기 위해 Lock을 사용한다.이 글에서는 Lock의 종류와 스프링 애플리케이션에서 Jpa를 활용하여 Lock을 처리하는 방법에 대해 정리한다. 락 (LOCK)데이터베이스에는 중요한 정보가 저장된다. 따라서 무결성과 일관성, 정합성이 반드시 지켜져야 한다. 하지만, 여러 사용자(Transaction)가 동시에 자원을 획득하게 되면 문제가 생기게 될 것이다. 이러한 문제를 방지하기 위해 데이터베이스는 Lock 기능을 제공한다. 한 트랜잭션이 특정 Row에 대한 Lock을 획득하면, 다른 트랜잭션이 이를 변경할 수 없는 것이다. 이는 데이터에 대한 처리 순서를 보장하여 정합성과 무결성을 지키고 안전한 데이터 처리를 가능하게 한다. Loc..

Blocking/Non-Blocking(블로킹/논블로킹), Sync/Async(동기/비동기), Concurrent/Parallel(동시/병렬)

이번 글의 목표는 Blocking/Non-Blocking(블로킹/논블로킹), Sync/Async(동기/비동기), 그리고 Sync/Async를 이해하는 데 필요한 Concurrent/Parallel(동시/병렬) 이 세 가지를 이해하는 것이다.Sync/Async는 자바스크립트에서 비동기 통신을 사용하며 자주 접하였던 내용이다. 하지만 Blocking/Non-Blocking은 Webflux 관련 자료를 찾는 과정에서 처음 알게되었다. Webflux는 Async, Non-Blocking을 사용한다고 하는데, Blocking과 Non-Blocking의 개념을 모르니 이해를 하는 데 어려움이 있었다. 처음에는 단순히 Sync == Blocking, Async == Non-Blocking 으로 이해했지만 이는 잘못된..

CS 2024.10.11

[Java] Design-Pattern Proxy

프록시 패턴이란?- 프록시는 사전적 의미로 대리자·대리인을 뜻한다. Http 프로토콜을 사용하는 Client-Server 아키텍처에서 Client가 요청을 보내면 Server는 응답을 전달하게 되는데, 이 사이에 일종의 미들웨어처럼 프록시가 적용될 수 있다. 프록시 서버는 클라이언트의 요청을 대신 받아 서버에 전달한다. - 프록시 디자인 패턴 역시 동일한 원리가 적용된다고 볼 수 있다. 스프링 부트에서 Aop는 CGlib 방식의 Proxy 패턴을 적용하여 부가 기능 (Aspect-Advice)을 주 관심사로부터 분리한 후 Runtime Weaving을 수행한다. 즉 프록시 패턴을 활용하면 타겟이 되는 객체의 로직을 수행하기 전에 프록시 객체가 이를 intercept 하여 부가 기능을 주입하게 되는 것이다..