분류 전체보기

· CS
이벤트 이벤트는 여러 애그리거트에 걸처 처리해야하는 작업이 하나의 트랜잭션으로 묶일 필요가 없는 경우 사용하기 좋은 데이터 처리 방법이다. 예를 들어 주문 취소 및 환불 프로세스는 순차적으로 실행되어야 하지만 실제로 트랜잭션으로 묶여 처리될 필요는 없다. 주문 취소는 주문 도메인의 영역이고, 환불은 결제 도메인의 영역으로 분리되어 있다고 가정한다. 시스템 간 강결합 문제 만약 주문 취소와 환불이 하나의 트랜잭션으로 묶이는 경우를 생각해보자. 사용자로부터 주문 취소 요청이 들어왔을 때, 표현 계층은 주문 애그리거트의 상태를 주문 취소로 변경하고, 해당 주문의 결제 정보를 찾아 환불 프로세스를 진행한다. 포인트제도 처럼 결제가 완벽하게 애플리케이션의 내부에서 진행된다면 문제가 없을 것이다. 하지만 보통 결제..
· CS
애그리거트의 동시성 문제와 트랜잭션 관리 주문 애그리거트의 루트 엔티티인 Order 클래스가 존재한다고 가정한다. 또, 주문 애그리거트는 주문 상태가 배송 상태가 아닌 경우에만 배송지를 변경할 수 있다는 정책이 존재한다. 만약 하나의 주문 애그리거트에 대해 관리자 스레드가 주문 상태를 배송으로 변경함과 동시에 고객 스레드가 배송지를 변경한다면 문제가 발생할 것이다. 예를 들면 위와 같이, 관리자가 주문 레코드를 읽고(1), 그 다음 고객이 주문 레코드를 읽는다(2). 해당 상태에서는관리자와 고객 모두 본인이 원하는 변경(주문승인 → 배송중, 경기도 → 강원도)이 가능한 상태이다. 여기서 관리자가 먼저 배송승인 상태를 배송중 상태로 변경(3)하고 커밋했다면? 해당 애플리케이션의 주문 정책에 따르면 고객은 ..
· CS
도메인? 도메인은 어떤 문제를 소프트웨어로 해결하고자 하는 영역이다. 온라인 서점을 예로 들 수 있다. 하나의 도메인은 하위 도메인으로 나눌 수 있다. 온라인 서점은 회원, 주문, 배송, 결제 등의 도메인으로 나누어진다. 각 도메인의 하위 도메인의 이름이 같다고 해서 같은 도메인이라고 착각하면 안된다. 서로 다른 하위 도메인은 같은 용어를 사용할 뿐, 전혀 다른 의미와 데이터 정보를 가지고 있을 수 있다. 요구사항을 올바르게 이해하고 도메인을 잘 설정하려면 개발자와 전문가가 함께 이야기 해야 한다. 개발자도 도메인 지식을 갖추고 있어야 도메인 전문가가 요구한 것에 가까운 제품을 만들 수 있다. 처음 도메인 모델을 구성할 때 빠지기 쉬운 함정은 도메인을 완벽하게 표현하는 단일 모델을 만드는 시도를 하는 것..
· CS
Blocking I/O vs Non-Blocking I/O blocking I/O 와 non-blocking I/O의 차이는 특정 시스템(OS, 웹 서비스, DB 인스턴스 등)에 요청 후 응답을 기다리는 시점에 스레드가 block되어 응답을 받을 때까지 기다리냐(Syncronous), block되지 않고 다른 일을 처리하냐(Asyncronous)의 차이이다. 즉, Blocking I/O는 입출력 작업을 동기적으로 처리하는 것, Non-Blocking I/O는 입출력 작업을 비동기적으로 처리하는 것이다. Non-Blocking I/O 에서 응답을 확인하는 방법 여기서 의문이 생길 것이다. Blocking I/O는 요청 및 응답을 동기로 처리하기에 스레드는 요청한 뒤 응답을 기다리다가 받아서 나머지 작업을 ..
· Database
데이터베이스 작업에서 발생할 수 있는 동시성문제를 처리하기 위해 MySQL에서 지원하는 공유(Shared)락, 배타(Exclusive)락과 동시성문제를 처리하는 방식인 낙관적(Optimistic)락, 비관적(Pessimistic)락을 정리하려 한다. 모든 설명은 MySQL 8.0을 기반으로 한다. 동시성 문제 동시성 문제는 멀티 스레드, 프로세스 작업에서 개발자가 해결해야 하는 문제이다. 하나의 공유 자원에 두 스레드가 동시에 접근하여 데이터를 변경하는 작업을 처리하는 경우 발생할 수 있는 문제점들이다. 한 가지 예시를 들어보자. 웹 쇼핑몰에서 아이패드 1개를 판매하기 위해 상품을 등록했다. 아주 매력적인 가격이었기에 10명의 사용자가 동시에 결제를 진행한다고 가정한다. 동시성 처리를 하지 않은 경우라면..
· CS
이번 포스팅은 IPC중 HTTP 기반의 동기 통신중 대표적인 REST와 gRPC의 차이를 메시지 포맷과 애플리케이션 설계 순서에 따라 정리해보려 한다. 정의와 장단점, 유의할 점 등을 간단하게만 알아본다. 기술에 대한 깊은 학습은 추후 기술을 사용할 기회가 주어진다면 진행하려 한다. 프로세스간 통신에는 여러 선택지가 있다. 동기적인 요청/응답 통신을 하는 HTTP기반의 REST, gRPC(HTTP 2.0)와 AMQP, STOMP등 비동기 메시지 기반의 통신 메커니즘도 존재한다. 메시지 포맷도 JSON, XML과 같이 인간이 읽을 수 있는 텍스트 포맷부터 avro, Protocol buffer처럼 효율이 우수한 이진 포맷까지 다양하다. HTTP 기반 동기 요청/응답 통신 동기 요청/응답(request/re..
· CS
여러 서비스에서의 Message기반 비동기 호출 아키텍처를 구성할 때, Message Driven Architecture, Event Driven Architecture의 선택지가 존재한다. 여기서 Message와 Event의 차이를 정리해보려 한다. 메시징 메시징은 서비스가 메시지를 서로 비동기적(메시지 브로커를 사용하는 경우와 통상적인 경우)으로 주고받는 통신 방식이다. 보통 메시징 기반 애플리케이션은 서비스 사이에 Message Brocker(대표적으로 Kafka, RebbitMQ)를 두어 비동기 통신을 구현하지만, 서비스가 직접 서로 통신하는 BrockerLess 아키텍처도 존재한다. BrockerLess 아키텍처는 통신할 애플리케이션이 가용중이 아니라면 내부적으로 큐를 두는 방식 등을 통해 메시..
· Spring
Spring 기반 애플리케이션에서 예외를 핸들링하는 전략들에 대해 알아보고자 한다. Servlet 기반 예외 처리 서블릿 기반 예외 처리는 발생한 예외를 WAS(Tomcat) 까지 전달한다. 그 이후 매핑된 예외 종류에 따라 Dispatcher Servlet에 다시 요청하며 예외를 핸들링한다. (forward와 비슷한 개념) @Component public class WebServerCustomizer implements WebServerFactoryCustomizer { @Override public void customize(ConfigurableWebServerFactory factory) { List errorPages = List.of( new ErrorPage(HttpStatus.NOT_FOU..
· Spring
Spring Interceptor와 Servlet Filter 모두 공통 관심사항을 처리할 수 있는 유용한 기능이다. 예를 들어 로그인이 꼭 필요한 서비스에서 로그인 여부를 체크하는 작업이 필요하다고 할 때, 각 컨트롤러에서 보일러 플레이트 코드를 반복해서 작성해야 한다는 불편한 점이 존재한다. 이러한 횡단 관심사(cross-cutting concern)는 스프링에서 지원하는 AOP를 사용하여 해결할 수도 있지만 웹과 관련된 공통 관심사는 HTTP header 정보, URL 정보등이 필요한 경우가 많기에 이를 지원하는 서블릿 필터 혹은 스프링 인터셉터를 사용하는 것이 좋다. 서블릿 필터와 스프링 인터셉터는 HttpServletRequest를 포함한 여러 부가 기능을 지원하기에 특정 URL을 블랙 리스트 ..
hyunsb
'분류 전체보기' 카테고리의 글 목록 (2 Page)