본문 바로가기

소프트웨어-이야기/프로그래밍 언어와 프레임워크

Lombok 기본 생성자와 Getter/Builder 어노테이션 @Getter @Builder public class AddItemToCartCommand { private final Long userId; private final Long productId; private final Integer quantity; } Request DTO에 Getter, Builder 어노테이션만 추가하면, 다음과 같은 에러를 보게 되는 경우가 있다. Cannot construct instance of (no Creators, like default construct, exist): cannot deserialize from Object value (no delegate- or property-based Creator) 이번주에도 이 에러를 보게 되었다. 낯설지 않아서, 에러 노트..
JPA Entity와 Lombok Annotation java entity를 쓰다보면 Lombok annotation이 덕지덕지 붙게 된다. 요렇게 말이다. 👇🏻👇🏻 @AllArgsConstructor @NoargsConstructor(access = AccessLevel.PROTECTED) @Getter @Entity public class CartItem { ... 왜 annotation이 덕지덕지 붙게 되는건지, 왜 프로젝트마다 스타일이 다른건지 매번 까먹게 되어서 노션에 정리한걸 기록해보고자 한다. Context @Entity Entity를 사용하려면 JPA Proxy 기능 때문에 매개변수가 없는 기본 생성자가 필요하다. @Entity 어노테이션은 기본 생성자가 없는 경우, 알아서 기본 생성자를 만들어준다. 그래서 @NoArgsConstructor ..
[EDA] 이벤트 데이터 설계 이벤트 설계 이벤트는 “뭔가" 일어났음을 전하는 메시지가 아니라, 이벤트가 발생한 동안의 모든 일들을 기록해야한다. 이 출력 이벤트를 단일 진실 공급원으로 간주해서 다운스트림 컨슈머가 소비할 불변의 팩트로 기록해야한다. 때문에 컨슈머는 이벤트 데이터 만으로도 데이터를 처리할 수 있다. 이론적으로는 출력 이벤트를 SSOT으로 간주하라고 한다. 그러나 실제 서비스에서는 ZERO-PAYLOAD 방식을 사용하는 경우가 많은 것 같다. 이벤트 스트림에는 하나의 논리적 이벤트를 나타내는 이벤트가 포함되어야 한다. 이벤트 데이터 타입은 가장 좁은 범위를 사용한다. 이벤트는 하나의 목적만 가진다. 다용도 스미카는 비즈니스 요건이 조금만 달라져도 엄청나게 복잡해진다. 이벤트 크기는 최소화한다. 이벤트 메시지가 큰 경우,..
[예외처리] 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..
[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 ..