본문 바로가기

좋은 API 설계하기 규칙 항상 사용자를 생각하기 설명서 작성하기 (api docs) 성공 / 실패 응답 모델을 모두 준비하기 명사만 사용하기 안티패턴 : /get-user, /add-user /delete-account 명확하고 직관적인 이름 사용하기 명확한 사례가 아니면 축약어 사용하지 않기 /identification-numbers보다는 /ids가 명확하다. 소문자만 사용한다. 단어는 -(하이픈)으로 구분한다. 특수문자는 사용하지 않는다. 파라미터는 카멜케이스를 사용한다. API version을 제공한다. /v1/account 혹은 header parameter: X-API-VERSION 좋은 API 설계 사례 Stripe (online payment system): https://stripe.com/docs/api T..
[EDA] 이벤트 데이터 설계 이벤트 설계 이벤트는 “뭔가" 일어났음을 전하는 메시지가 아니라, 이벤트가 발생한 동안의 모든 일들을 기록해야한다. 이 출력 이벤트를 단일 진실 공급원으로 간주해서 다운스트림 컨슈머가 소비할 불변의 팩트로 기록해야한다. 때문에 컨슈머는 이벤트 데이터 만으로도 데이터를 처리할 수 있다. 이론적으로는 출력 이벤트를 SSOT으로 간주하라고 한다. 그러나 실제 서비스에서는 ZERO-PAYLOAD 방식을 사용하는 경우가 많은 것 같다. 이벤트 스트림에는 하나의 논리적 이벤트를 나타내는 이벤트가 포함되어야 한다. 이벤트 데이터 타입은 가장 좁은 범위를 사용한다. 이벤트는 하나의 목적만 가진다. 다용도 스미카는 비즈니스 요건이 조금만 달라져도 엄청나게 복잡해진다. 이벤트 크기는 최소화한다. 이벤트 메시지가 큰 경우,..
Transactional outbox Transactional outbox은 MSA 환경에서 이벤트 메시지 발행을 보장할 때 사용하는 패턴이다. 이벤트 메시지 발행 시점 애플리케이션에서 이벤트를 발행할 때에는 트랜잭션 내부 혹은 외부에서 호출하는 상황에 따라 장단점이 있다. (1) 트랜잭션 안에서 메시지 발행 메시지 발행 여부를 쉽게 보장할 수 있다. 그러나 메시지 발행의 실패가 곧 전체 서비스로 장애가 전파될 수 있다는 단점이 있다. (2) 트랜잭션 밖에서 메시지 발행 메시지 발행 실패가 즉시 해당 서비스의 장애로 전파되지 않는다. 그러나, 메시지 발행에 실패해도 메시지 발행을 재시도 할 수 없다는 단점이 있다. 위의 방안은 모두 안정적으로 메시지 발행을 보장할 수 없기 때문에 다른 대안이 필요하다. 메시지 발행 보장하기 Transacti..
broadleafcommerce으로 재고 시스템 맛보기 이커머스 오픈소스인 broadleafcommerce의 재고 서비스를 살펴봄으로써, 재고 시스템 구조를 맛보고자 한다. 재고 예약 Flow Diagram 체크아웃을 완료하기 전인 임시 주문 단계에서 재고를 임시로 예약한다. (Soft Reservation) 그리고 체크아웃이 모두 완료되어, 주문서가 만들어지고난 이후 재고를 영구적으로 예약한다. (Hard Reservation) DB Diagram inventory transaction은 sku의 재고 히스토리를 관리하기 위한 도메인이다. inventory transaction의 8개의 타입으로 이루어져있다. SOFT_RESERVED HARD_RESERVED FULFILLED CANCELLED ORDERED RETURNED RECEIVED SHRINKAGE..
[예외처리] notification pattern catched exception 회복해야하는 대상의 예외 자바에서는 메서드가 던질 수 있는 확인된 예외 목록을 선언해야한다. 아니면 해당 예외를 try/catch으로 선언해야한다. public boolean validate() { if (this.description.length() > 100) { throw new DescriptionTooLongException(); } final LocalDate parsedDate; try { parsedDate = LocalDate.parse(this.date); } catch (DateTimeParseException e) { throw new InvalidDateFormat(); } .... return true; } public class Descripti..
[Rule Engine] 비즈니스 규칙 엔진 비즈니스 규칙 엔진이란? 비즈니스 규칙 엔진이란, 어떤 조건에 따라 액션을 유발하는 규칙이 있는 비즈니스 기능을 구현할 때 사용하는 프로그램이다. 비즈니스 규칙 엔진의 요구사항은 크게 4가지로 나뉜다. 팩트 : 규칙이 확인할 수 있는 정보 액션 : 수행하려는 동작 조건 : 액션을 언제 발생시킬지 지정 규칙 : 실행하려는 비즈니스 규칙을 지정 보통 팩트/액션/조건을 한 그룹으로 묶어서 규칙으로 만든다. 비즈니스 규칙 엔진 구현 방법은 다음과 같다. Diagram Code Class @FunctionalInterface public interface Action { void execute(Facts facts); } @FunctionalInterface public interface Condition { b..
Null Object Pattern Null Object Pattern 함수에서 null을 리턴하는 경우, 함수를 사용하는 곳에서 null을 처리하는 예외처리를 해줘야한다. 반면, Null Object Pattern을 사용하면 null 객체를 처리하는 로직이 전파되는 문제를 줄일 수 있다. 그 결과, 중복 코드를 줄일 수 있어서, 코드가 단순해진다. 예를 들어, 회원 정보를 조회하는 다음과 같은 코드가 있다고 생각해보자. public Customer GetByPhoneNumber(string phoneNumber) { return _customerRepository .List(c => c.PhoneNumber == phoneNumber) .FirstOrDefault(); } var customer = GetByPhoneNumber(phon..
<칼 뉴포트> Deep Work 📝 밑줄 그으며 책 읽기 2. 몰입과 집중을 방해하는 세상 산만한 회사는 어떻게 만들어지는가 직장에서 수용되는 산만한 행동의 경우 지금은 도처에 존재하는 상시 접속 문화(culture of connectivity)가 지배적인 지위를 차지한다. 이 문화에 따라 사람들은 이메일을 빨리 읽고 답해야 한다. ... 상시 접속 문화가 지속되는 이유는 더 쉽기 때문이다. 이 말이 옳은 두가지 이유가 있다. 첫번째는 필요에 대한 응답성과 관련된다. 필요할 때 질문에 대한 답이나 특정한 정보를 즉시 얻을 수 있다면 적어도 그 순간에는 일이 수월해진다. 이 처럼 빠른 응답을 얻지 못하면 사전에 업무를 계획해야 하고, 더욱 조직적이어야 하며, 필요한 대상을 기다리는 동안 잠시 일을 제쳐두고 다른 곳에 주의를 돌릴 준비를 ..