전체 글 361

DDD - 트랜잭션과 잠금을 관리하는 다양한 방법!

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 애그리거트와 트랜잭션 주문 애그리거트에 대해 운영자가 배송 준비 상태로 변경할 때 사용자는 배송지 주소를 변경하면 어떻게 될까? 다음 그림은 운영자와 고객이 동시에 한 주문 애그리거트를 수정하는 과정이다. 리포지토리는 트랜잭션마다 새로운 애그리거트 객체를 생성한다. 운영자 스레드와 고객 스레드에서는 개념적으로 동일하지만 물리적으로 서로 다른 애그리거트를 사용한다. 즉, 각 애그리거트는 서로의 객체에 영향을 주지 않는다. 고객 스레드 입장에서는 주문 애그리거트가 아직 배송 상태가 아니므로 배송..

Programming/DDD 2022.07.19

Spring - JpaRepository가 아닌 Repository를 사용해야 하는 이유!

Spring Data JPA를 사용하면 일반적으로 Repository에서 다음의 인터페이스 중 하나를 상속하여 사용하게 된다. JpaRepository CrudRepository Repository 해당 인터페이스들은 어떤 부분이 다르며 Repository를 사용하는 것을 권장하는 이유가 무엇인지 알아보자. JpaRepository 아래의 그림은 Spring Data Jpa에서 제공하는 인터페이스 사이의 상속관계를 정리한 것이다. 그림에서 아래로 갈 수록 저수준 모듈이며 기능 구현이 많음을 알 수 있다. CrudRepository의 경우 메서드를 정의하지 않아도 간단한 CRUD 사용이 가능하다. public interface AccountRepository extends CrudRepository { }..

Server/Spring JPA 2022.07.18

Spring Security - SecurityFilterChain 사용하기! (+ WebSecurityConfigurerAdapter is Deprecated)

WebSecurityConfigurerAdapter 프로젝트 개발을 진행중에 WebSecurityConfigurerAdapter가 Deprecated된 것을 확인했다. Spring Security 5.7.0-M2 부터 해당 클래스는 컴포넌트 기반의 보안 설정을 권장한다는 이유로 Deprecated 처리되었다. @Configuration @EnableWebSecurity public class SecurityConfiguration extends WebSecurityConfigurerAdapter { @Override protected void configure(HttpSecurity http) throws Exception { // configure HTTP security... } @Override p..

Server/Spring 2022.07.18

DDD - 도메인 서비스란 무엇인가 ?! (+ 다수의 애그리거트를 참조하는 방법)

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 여러 애그리거트가 필요한 기능 도메인 영역의 코드를 작성하다 보면 한 애그리거트로 기능을 구현할 수 없을 때가 있다. 결제 금액 계산 로직의 예로 살펴보자. 상품 애그리거트 : 구매하는 상품의 가격이 필요하다. 또한 상품에 따라 배송비가 추가되기도 한다. 주문 애그리거트 : 상품별로 구매 개수가 필요하다. 할인 쿠폰 애그리거트 : 쿠폰별로 지정한 할인 금액이나 비율에 따라 주문 총 금액을 할인한다. 회원 애그리거트 : 회원 등급에 따라 추가 할인이 가능하다. 이 경우 실제 결제 금액을 계산하는..

Programming/DDD 2022.07.14

DDD - 표현 영역과 응용 서비스! (+ 값 검증, 권한 검사, ...)

해당 포스팅은 "도메인 주도 개발 시작하기" 라는  내용을 정리한 글입니다. 해당 도서는 아래 Link에서 확인할 수 있습니다. - http://www.yes24.com/Product/Goods/108431347 표현 영역 표현 영역의 책임은 크게 다음과 같다. 사용자가 시스템을 사용할 수 있는 흐름(화면)을 제공하고 제어한다. 사용자의 요청을 알맞은 응용 서비스에 전달하고 결과를 사용자에게 제공한다. 응용 서비스에서 익셉션이 발생 시 예외에 맞게 처리해서 사용자에게 노출한다. 사용자의 세션을 관리한다. 값 검증 값 검증은 표현 영역과 응용 서비스에서 모두 수행할 수 있다. 원칙적으로 모든 값에 대한 검증은 응용 서비스에서 처리한다. 하지만 표현 영역은 잘못된 값이 존재하면 이를 사용자에게 알려주고 값..

Programming/DDD 2022.07.13

In-memory DB 비교 (Redis vs Memcached)

In-memory DB 비교 사이드 프로젝트 진행 도중 MSA로의 확장성 등을 고려하여 Session storage로 In-memory DB를 고려하게 되었다. (이점: https://jaehoney.tistory.com/165?category=970233) 휴대 전화 인증 등도 메인 DB와 분리하여 관리하기 위해 In-memory DB에 저장할 계획을 가지고 있다. 대표적인 In-memory DB로 redis와 memcached가 있는데 어떤 차이점을 살펴보자. 공통점 1ms 이하의 응답시간을 제공한다. 문법적으로 사용하기 쉽고 개발이 편리하다. 데이터를 여러 노드에 분산하여 저장할 수 있다. Redis String, Set, Hash, List 등 복잡한 데이터 타입을 지원한다. ub / Sub 패턴..

Database/NoSQL 2022.07.10

Database - 샤딩이란 무엇인가?! (+ 샤딩의 다양한 기법, 각 기법 비교)

서비스 오픈전에 J곡선 그래프를 타면서 성장하길 바라는 마음은 모두 같을 것이다. 그런 중요한 순간에 서버가 바틀넥이 되어 발목을 잡으면 안된다. 그래서 예측 가능한 서버 확장 방안에 대해서 사전에 준비를 해둬야 한다. DB 샤딩은 데이터가 급격히 증가하게 되거나 트래픽이 특정 DB로 몰리는 상황을 대비해서 빠르고 유연하고 안전하게 DB를 증설할 수 있게 한다. 샤딩에 대해 알아보자. 샤딩 샤딩(Sharding)은 DB 트래픽을 분산할 수 있는 중요한 수단이다. 추가적으로 특정 DB의 장애가 전면 장애로 이어지지 않게 하는 역할도 한다. 샤딩은 각 DB 서버에서 데이터를 분할하여 저장하는 방식이다. 해당 데이터에 접근할 때는 샤딩키를 사용하여 동적으로 DB 서버를 매핑하는 과정이 필요하다. 샤딩과 수평적..

Database/Server 2022.07.09

JPA - Fetch Join에 ON절 추가하는 방법! (쿼리 개선, 인덱싱)

Fetch Join + ON 절 JPA에서 Fetch Join 시 원하는 인덱스를 태우기 위해서 ON절을 추가하고 싶을 때가 있다. 아래의 예를 들어보자. @Entity @Getter @NoArgsConstructor(access = AccessLevel.PROTECTED) public class Member { @Id @GeneratedValue private Long id; ... private int countryCode; @OneToMany(fetch = FetchType.LAZY) @JoinColumn(name = "credit_id") private CreditCard creditCard; public Member(... 생략, CreditCard creditCard, int contryCod..

Server/Spring 2022.07.08

Real MySQL - Replication(복제)란 무엇인가?!

데이터베이스를 사용할 때 가장 중요한 두 가지는 확장성(Scalability)과 가용성(Availability)이다. 서비스에서 발생하는 대용량 트래픽을 안정적으로 처리하기 위해서는 서버의 확장이 필수적이며, 사용자가 언제든지 안정적인 서비스를 이용할 수 있게 하려면 DBMS 서버를 포함한 하위 시스템들의 가용성이 반드시 뒷받침되어야 한다. 이 두 요소를 위해 가장 일반적으로 사용하는 기술이 복제(Replication)이다. 복제 복제(Replication)는 한 서버에서 다른 서버로 데이터가 동기화 되는 것을 말한다. 원본 데이터를 가진 서버를 소스(Source) 서버, 복제된 데이터를 가지는 서버를 레플리카(Replica) 서버라고 부른다. 소스 서버에서 데이터가 변경되면 레플리카 서버에서는 변경 내..

Database/SQL 2022.07.07

블로킹(Blocking)과 논 블로킹(Non-Blocking)!

동기와 비동기, 블로킹과 논 블로킹을 같은 것이나 비슷한 것이라고 오해하는 경우가 많다. 해당 개념들은 전혀 다른 개념이며 직접적인 관련이 없다. Caller와 Callee 먼저 아래 개념을 이해하자. Caller: 호출하는 함수를 말한다. Callee: 호출당하는 함수를 말한다. 동기 & 비동기 동기와 비동기는 프로세스의 수행 순서 보장에 대한 매커니즘이다. 동기(Synchronous)는 Caller가 Callee의 작업 결과를 기다린다. 비동기(Asynchronous)는 Caller는 Callee의 작업 결과에 관심이 없다. Callee가 Caller에게 Callback을 수행한다. (Callee에서 예외가 터져도 Caller는 영향을 받지 않는다.) 일반적으로 Blocking(블로킹)과 Async(..

Operation/OS 2022.07.06