이번 포스팅에서는 자바의 ORM 표준인 JPA를 이용해 리포지터리와 애그리거트를 구현하는 방법에 대해 살펴보겠습니다. 앞선 포스팅에서 설명한 것처럼 리포지터리 인터페이스는 애그리거트와 같은 도메인 영역에 속하고, 이를 구현한 클래스는 인프라스트럭처 영역에 속합니다.가능하면 위와 같이 리포지터리 구현 클래스를 인프라스트럭처 영역에 위치시켜 인프라스트럭처에 대한 의존을 낮추는 것이 중요합니다.리포지터리 인터페이스는 애그리거트 루트를 기준으로 작성합니다.애그리거트를 수정한 결과를 저장소에 반영하는 메서드는 필요없습니다.JPA를 사용하면 트랜잭션 범위에서 변경한 데이터를 자동으로 DB에 반영합니다.JPA는 변경된 객체의 데이터를 DB에 반영하기 위해 UPDATE 쿼리를 실행합니다.매핑 구현애그리거트와 JPA 매..
애그리거트란?하나의 시스템을 개발할 때, 상위 수준 개념을 이용해서 전체 모델을 정리하면 전반적인 관계를 이해하는 데 도움이 됩니다.쇼핑몰을 예시로 들면, 아래와 같이 표현할 수 있습니다.이를 개별 객체 단위로 다시 그려보면 아래와 같습니다.여기서 도메인 객체 모델이 복잡해지면 개별 구성요소 위주로 모델을 이해하게 되고, 전반적인 구조나 큰 수준에서 도메인 간의 관계를 파악하기 어려워지게 됩니다. 결국, 복잡한 도메인을 이해하고 관리하기 쉬운 단위로 만들려면 상위 수준에서 모델을 조망할 수 있는 방법이 필요한데, 이 방법이 애그리거트 입니다. 애그리거트를 한 마디로 표현한다면,관련된 객체들의 집합을 하나의 단위로 취급하는 패턴입니다.즉, 도메인 모델에서 밀접하게 관련된 객체들의 집합을 의미합니다. 이는 ..
계층 구조 아키텍처네 영역을 구성할 때 많이 사용하는 아키텍처는 아래와 같은 계층 구조입니다.계층 구조는 특성상 상위 계층에서 하위 계층으로의 의존만 존재하고 하위 계층은 상위 계층에 의존하지 않습니다. 하지만, 편리함을 위해 아래와 같이 응용 계층에서 인프라스트럭처 계층에 직접 의존하는 계층 구조를 가지기도 합니다.응용, 도메인 영역이 DB나 외부 시스템 연동을 위해 인프라스트럭처의 기능을 사용하므로, 위의 구조는 직관적으로 이해하기 쉽습니다. 하지만, 이 경우표현, 응용, 도메인 계층이 상세한 구현 기술을 다루는 인프라스트럭처 계층에 종속되게 됩니다. 도메인의 "가격 계산 규칙"을 예시로 들어보겠습니다.우선, `Drools`라는 룰 엔진을 통해 계산 로직을 수행하는 인프라스트럭처 영역의 코드입니다.p..
Redis는 기본적으로 Key-Value 데이터베이스 입니다. 따라서, 대부분의 명령이 Key를 바탕으로 동작하고, Value로 사용하고자 하는 자료형에 따라 다른 명령어를 사용하게 됩니다. StringString은가장 기본적인 자료형Java의 `Map`처럼 동작저장할 수 있는 최대 크기는 512MBSET, GETSET user:email alex@example.comGET user:email`SET ` : key에 value 문자열 데이터를 저장합니다.`GET ` : key에 저장된 문자열을 반환합니다.INCR, DECR만약, 저장된 데이터가 정수 데이터라면 증가, 감소가 가능합니다.SET user:count 1INCR user:countDECR user:count`INCR key` : key에 저장..
도메인이란?도메인이란해결하고자 하는 문제의 영역을 말합니다. 한 도메인은 다시 하위 도메인으로 나눌 수 있습니다.예를 들어, "온라인 서점"이라는 도메인은 다음과 같은 하위 도메인으로 나눌 수 있습니다.회원주문결제배송카탈로그리뷰정산혜택도메인 모델도메인 모델이란특정 도메인을 개념적으로 표현한 것입니다. 주문 도메인을 예시로 객체 모델로 구성하면 다음과 같이 나타낼 수 있습니다.도메인을 이해하려면 도메인이 제공하는 기능과 도메인의 주요 데이터 구성을 파악해야 합니다. 이런 면에서 기능과 데이터를 함께 보여주는 객체 모델은 도메인을 모델링하기에 매우 적합합니다.물론, 객체가 아닌 상태 다이어그램, 수학 공식 등을 통해 모델링하는 방법도 존재합니다. 즉, 도메인을 이해하는 데 도움이 된다면 표현 방식이 무엇인지..
`@EqualsAndHashCode`는 Lombok 라이브러리에서 제공하는 어노테이션으로, Java 클래스의 `equals()`와 `hashCode()` 메소드를 자동으로 생성해줍니다.특징자동 메서드 생성클래스에 `@EqualsAndHashCode`를 적용하면 모든 필드를 고려한 `equals()`와 `hashCode()` 메소드가 자동으로 생성됩니다.필드 선택`of` 속성을 사용하여 특정 필드만 동등성 비교에 포함시킬 수 있습니다.상속 관계 처리`callSuper` 속성을 통해 부모 클래스의 필드를 동등성 비교에 포함할지 여부를 결정할 수 있습니다. 사용 예시@EqualsAndHashCode(of = {"email", "name"}, callSuper = false)public class Member ..
Spring을 이용한 프로젝트를 진행하던 중에 ModelMapper를 사용하게 되어 이에 대해 한 번 정리해보려 합니다.ModelMapper란?ModelMapper는어떠한 Object에 있는 필드 값들을 원하는 Object에 자동으로 mapping 시켜주는 라이브러리이다.즉, Source Object → Destination Object 를 자동으로 해준다고 생각하면 된다.그렇다면, 어떤 경우에 ModelMapper를 사용할까?보통 DTO를 통해 데이터를 받아 다른 Object(엔티티 등...)에 넣거나 이와 반대로 객체를 DTO로 변환할 때, getter와 setter를 이용해 원하는 필드들을 일일이 넣는다. 아니면, of 와 from이라는 정적 메서드(static method)를 만들어 사용한다.이 ..
4 계층 아키텍처4계층 아키텍처는 소프트웨어 시스템을 4개의 주요 계층으로 나누는 구조적 패턴입니다.이 방식은 ‘관심사의 분리’라는 핵심 원칙을 따르며, 각 계층이 특정 역할을 담당하도록 설계됩니다.각 계층 살펴보기1. Presentation Layer사용자와 직접 상호작용하는 최상위 계층입니다.사용자 인터페이스 (UI) 구현사용자 입력 처리 및 기본적인 유효성 검사다른 계층에서 받은 데이터를 사용자에게 표시2. Business Layer애플리케이션의 핵심 로직이 구현되는 곳입니다.비즈니스 규칙 및 워크플로우 관리데이터 처리 및 연산 수행프레젠테이션 계층과 영속성 계층 사이의 중재자 역할3. Persistence Layer데이터의 영구 저장을 담당하는 계층입니다.데이터베이스와의 통신 관리CRUD 작업 수..
애그리거트(Aggregate)란?애그리거트는관련된 객체들의 집합을 하나의 단위로 취급하는 패턴입니다.즉, 도메인 모델에서 밀접하게 관련된 객체들의 집합을 의미합니다. 이는 복잡한 도메인을 더 작고 관리하기 쉬운 단위로 나누는 데 도움을 줍니다.애그리거트의 주요 목적도메인 모델의 복잡성 감소데이터 일관성 유지트랜잭션 경계 정의애그리거트의 구조애그리거트는 다음과 같은 구조로 이루어져 있습니다애그리거트 루트: 애그리거트의 대표 엔티티로, 외부에서 애그리거트에 접근할 수 있는 유일한 진입점입니다.엔티티: 고유한 식별자를 가진 객체들입니다.값 객체: 식별자가 없고 불변성을 가진 객체들입니다.애그리거트 설계 원칙불변식 보호: 애그리거트 내부의 모든 불변식(invariants)은 항상 일관된 상태를 유지해야 합니다...