본문 바로가기

소프트웨어-이야기

[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..
[DDD] Specification 명세 Specification Specification 객체는 객체가 특정 조건을 만족하는지 확인하는 역할을 한다. 본 글에서는 Specifiaction을 언제, 왜 사용하는지에 대해서 설명하고자 한다. 유효성 검증 추가 (1) 도메인에 간단한 유효성 검증 추가하기 도메인에 유효성 검증을 추가해야할 때, 로직이 간단한 경우에는 도메인 엔티티의 메서드로 유효성 검증 함수를 추가하는 방식으로 구현할 수 있다. 그러나 유효성 검증 절차가 복잡한 경우, 도메인 엔티티의 메서드로 두는 것이 어색한 경우가 있다. (2) 서비스에 추가하기 예를 들어, 인당 구매 수량이 제한되는 상품을 판매하는 경우, 주문서를 생성하기 전에 누적 주문 수량을 조회해야한다. 이 경우, 레파지토리를 통해 회원의 누적 주문 수량을 조회해야한다...
Java14. Record Keyword java 14 이전 버전에서는 데이터 클래스를 생성하려면, 여러 보일러 플레이트 코드가 필요하다. 다음 샘플처럼 hashcode, equals, toString 함수를 추가해줘야한다. public class Person { private final String name; private final String address; public Person(String name, String address) { this.name = name; this.address = address; } @Override public int hashCode() { return Objects.hash(name, address); } @Override public boolean equals(Object obj) { if (this ..
Spring과 의존성 주입 (DI) 의존은 변경에 의해 영향을 받는 관계를 의미한다. DI는 의존하는 객체를 직접 생성하는 대신 의존 객체를 전달받는 방법을 말한다. 의존성 주입 위치별 특징 의존성을 주입하는 방법은 크게 3가지이다. 1. Constructor Injection 클래스를 생성할 때, 모든 의존성 객체를 주입하기 때문에 NPE 문제를 방지할 수 있다. final 인자를 사용할 수 있기 때문에 불변성을 유지할 수 있다. 반면, 여러 객체를 의존하고 있는 경우 의존성 객체를 주입하는 코드가 복잡해지고 이해하기 어려워진다. 그러나 여러 객체를 의존한다는 것은 SRP (단일 책임 원칙)을 위배하는 것이기 때문에 베드스멜인 상황이다. 의도적으로 의존 객체를 줄여야한다는 위기의식을 줄 수 있기 때문에 권장되는 방식이다. 2. Sette..
HTTPS 통신 순서 1. 브라우저는 호스트 주소를 IP로 변환한다. 로컬에 IP 주소가 있으면, 주소 정보를 재사용한다. 만약 없으면 DNS 서버에 질의한다. 2. 주소가 https 스키마로 시작하는 경우, 클라이언트는 서버의 443 포트로 TCP 커넥션을 연다. SSL 트래픽은 바이너리 프로토콜이기 때문에 HTTP와는 다르다. 그래서 80번 포트가 아니라 443 포트로 통신한다. 3. 클라이언트와 서버가 보안 변수를 주고받는 HandShake 시작한다. 3-a. 클라이언트가 서버에 보안 설정을 위한 요청을 보낸다. 이를 Client Hello라고 부른다. 세션키 생성에 사용할 랜덤 스트링, 사용가능한 암호화 기법 등을 전달한다. 3-b. 서버도 보안 설정에 필요한 응답을 내려준다. 이를 Server Hello라고 부른다...
레이어드 아키텍처 레이어드 아키텍처 (n티어 아키텍처)는 일반적으로 많이 사용되는 아키텍처이다. 더 나은 아키텍처 대안을 찾지 못할 때, 쉽게 선택하는 아키텍처 패턴이다. Spring Project에서 각 레이어는 다음과 같은 클래스로 구현된다. Presentation Layer : Controller Business Layer : Service Persistence Layer : Entity Database Layer : Repository 특징 레이어드 아키텍처는 작고 간단한 서비스를 만들 때, 출발점으로 적합한 아키텍처다. 개발자에게 익숙하고, 복잡도도 낮기 때문에 소규모 애플리케이션에 적합하다. 단점 계층형 아키텍처는 영속성 계층을 토대로 만들어지기 때문에, 데이터베이스 주도 설계를 유도한다. 계층형 아키텍처에서 ..
AWS SQS Queue - 표준 VS FIFO 표준 대기열 초당 호출수 제한이 거의 없다. 무제한이다. 표준 대기열도 최대한 메시지가 도착한 순서대로 처리될 수 있도록 메시지를 정렬하고 있다. 그러나 순서가 안맞을 수도 있다. 메시지가 중복으로 발행될 수도 있다. AWS에서는 고가용성을 위해 메시지를 여러 서버에 복제해둔다. 만약 메시지 수신/삭제 요청이 서버에 반영되지 않는 경우, 메시지가 중복으로 발행될 수 있다. 때문에 표준 대기열을 사용하는 경우, 중복 요청이 발생하더라도 문제가 되지 않도록 멱등적으로 기능을 구현해야한다. FIFO 대기열 초당 호출수 제한이 있다. API는 초당 최대 300개까지 호출할 수 있다. 배치 함수는 메시지를 초당 최대 3000개까지 처리할 수 있다. 배치 API도 초당 최대 300개까지 호출할 수 있고, 하나의 A..