본문 바로가기

분류 전체보기845

DDD 이벤트 스토밍 - 크림 클론 프로젝트 개요 본 프로젝트는 Kream 서비스를 클론하는 프로젝트이다. 기본적으로 헥사고날 아키텍처를 코드 베이스로 가져갈 예정이며 점진적으로 CQRS까지 도입해본다. 코드는 깃허브를 통해 작성할 예정이며 본 포스팅에서는 이벤트 스토밍을 통해 바운디드 컨텍스트를 도출하는 과정까지만 간략하게 기술한다. 소스코드는 https://github.com/teamhide 에서 확인할 수 있다. (아직 개발중인점 참고) 범위 모든 기능을 구현하진 않을 것이며 대략 아래와 같은 싸이클을 수행할 수 있도록 필요한 기능만을 구현할 예정이다. 유저가 회원가입을 한다. 구매자가 상품에 입찰/즉시구매를 한다. 판매자가 상품을 입찰/즉시판매를 한다. 낙찰된 상품이 배송된다. 도메인 이벤트 식별 - 주황색 도메인 이벤트 사이에 순차적인 관.. 2023. 8. 18.
Webflux Function Endpoints 정리 개요 Webflux에서는 HandlerFunction이라는 것을 통해 HTTP Request를 다루게 된다. HandlerFunction은 ServerRequest를 인자로 받고 지연된 ServerResponse(Mono)를 리턴한다. Request/Response 모두 JDK8에서 제공하는 기능을 통해 불변 객체로써 동작한다. HandlerFunction은 어노테이션 기반 프로그래밍에서 등장하는 @RequestMapping과 동일한 역할을 수행한다. 클라이언트로부터 들어오는 Request는 RouterFunction을 통해 다뤄진다. 해당 객체는 위에서 설명한 것 처럼, ServerRequest를 받고 지연된 ServerResponse를 리턴한다. Request가 라우터에 등록된 핸들러와 매칭되면 핸들.. 2023. 8. 17.
Spring AOP 개념 정리 AOP 적용 방식 AOP 적용 방식은 크게 3가지 방법이 있다. 컴파일 시점 .java 소스 코드를 컴파일러를 사용하여 .class를 만드는 시점에 부가 기능 로직을 추가한다. 이때는 AspectJ가 제공하는 특별한 컴파일러를 사용해야 하는데, 컴파일 된 .class를 디컴파일 해보면 실제로 AspectJ 관련 호출 코드가 코드상으로 들어가게 된다. AspectJ 컴파일러는 Aspect를 확인하여 해당 클래스가 적용 대상인지 확인하고 적용 대상인 경우 부가 기능 코드를 적용한다. 이렇게 원본 로직에 부가 기능이 추가되는 것을 위빙(Weaving)이라고 한다. 하지만 특별한 컴파일러도 필요하고 타 방법에 비해 복잡하다는 단점이 존재한다. (잘 사용하지 않음) 클래스 로딩 시점 자바를 실행하면 자바 언어는 .. 2023. 7. 20.
Spring 빈 후처리기 정리 의존성 추가 implementation("org.springframework.boot:spring-boot-starter-aop") 먼저 위처럼 aop에 관한 의존성을 추가해준다. 이렇게 하면 aspectjweaver라는 aspectJ 관련 라이브러리를 등록하고 스프링 부트가 AOP관련 클래스를 자동으로 빈으로 등록한다. AutoProxyCreator 스프링 부트는 AnnotationAwareAspectJAutoProxyCreator라는 빈 후처리기를 자동으로 빈으로 등록한다. 해당 빈은 자동으로 프록시를 생성해주는 클래스로써 스프링 빈으로 등록된 Advisor들을 자동으로 찾은 후 프록시가 필요하다면 자동으로 프록시를 적용해준다. 일반적으로 AOP를 구현할 때 클래스 위에 @Aspect 어노테이션을 붙.. 2023. 7. 19.
Spring DataSource/TransactionManager 정리 개요 Spring Batch 5 버전을 통해 배치를 생성하고 관리하고 있는데, 멀티 모듈로 구성된 상황에서 DataSource 설정 관련 동작이 원활하지 않아 Spring DataSource와 Transaction Manager에 대한 내용에 대해 정리한다. 본 포스팅의 내용은 인프런 김영한님의 데이터 접근 핵심 원리 강의에 기반한다. DataSource 일반적으로 커넥션을 얻는 방법으로 JDBC DriverManager를 직접 사용하거나 HikariCP등의 커넥션 풀을 사용하는 방법이 존재한다. DriverManager를 통해 커넥션을 획득하는 경우 항상 신규 커넥션을 획득하게 되는데 이를 커넥션 풀을 사용하는 방법으로 변경하려면 어떻게 해야할까? 어플리케이션 로직에서 DriverManager를 사용하.. 2023. 7. 19.
광고 시스템 퍼포먼스 튜닝 회고록 요기요 기술블로그에 작성한 글입니다.개요2022년 12월부터 CPS(Cost Per Sale)기반 신규 광고 시스템이 도입되었는데, 서비스를 운영하는 과정에서 발생한 퍼포먼스 이슈와 그에 대한 해결 사례를 간단하게 소개해 드리고자 합니다.배경 지식사례를 소개해 드리기 전 배경지식을 먼저 말씀드리겠습니다. 실제로는 아래에 설명드리는 로직 외에도 추가적인 복잡한 로직이 존재하지만, 설명을 위해 본 포스팅의 주제에 부합하는 핵심 로직들만 설명드린 점 감안해 주시길 바랍니다.신규 광고 시스템의 경우 헥사고날 아키텍처를 기반으로 이루어져 있고, 각 애그리거트(Aggregate)에 속해있는 유즈케이스는 저마다의 역할에 충실하도록 구현되어 있는 상태였습니다.예를 들어 광고/레스토랑/캠페인이라는 3개의 애그리거트가 존.. 2023. 7. 19.