링크풀은 링크를 쉽게 저장하고 카테고리별로 폴더링하여 언제든 쉽게 찾아볼 수 있도록 하는 링크 관리 앱입니다.
- IOS(아이폰) : https://apps.apple.com/us/app/링크풀-체계적인-링크-관리의-시작/id1644108674
- 안드로이드 : https://play.google.com/store/apps/details?id=com.mr.ac_project_app
현재 Layered Architecture로 구성되어있는 프로젝트를 Hexagonal Architecture로 전환하기 위해 Domain과 Infra 영역을 분리하고 Domain → Infra 방향으로 흐르는 의존성을 제거했습니다.
- 통속적으로 사용되는
계층형 구조의 문제점을 인식- 서비스 코드 안에서 비즈니스 로직과 기술적 요소가 혼합되어, 서비스가 제공하는 핵심 가치가 잘 보이지 않음
- 한 패키지 안에 너무 많은 것들이 들어가면서 구조화가 안됨
- 자연스럽게
데이터베이스 주도 설계를 하게 됨 (DB 스키마부터 정의하면서 시작하게 되는 프로젝트)
클린 아키텍처가 이 문제점을 해결할 수 있을 것이라 기대의존성 역전을 통해 영속성이 아니라 비즈니스 도메인이 서비스의 주인공이 될 수 있도록 ⇒DDD적용에 용이- 도메인이 기술적인 세부사항에 의존하지 않기 때문에 기술을 도중에 변경하더라도 도메인영역을 유지할 수 있음
⇒ ex) JPA ⇒ R2DBC, Servlet Stack ⇒ Reactive Stack
Hexagonal Architecture( = Port and Adapters Architecture) 채택- 클린 아키텍처 중 가장 레퍼런스가 많은 것으로 판단되어 채택
- Port & adapters
- 도메인을 향하고 있는 의존성 흐름을 표현
현재 운영 중인 LinkPool Service를 DDD(Domain Driven Design)에 입각하여 전환하였습니다.
-
Event Storming방법론 채택 -
Context Map도출 -
애그리거트별로 패키지 구성
기존에 채택한 Spring Framework Servlet Stack에서 Reactive Stack으로 전환하여 Reactive Web Application을 구현하였습니다.
- Spring Webflux
- Spring Data R2DBC
- Kotlin Coroutine
Domain간의 의존성을 제거하고, 트랜잭션을 분리하여 비동기적으로 처리해야할 기능을 Domain Event로 구현하였습니다.
- User :
회원 탈퇴이벤트 발행- Folder:
회원 탈퇴이벤트를 구독하여 해당 회원의 Folder Batch 삭제 - Link :
회원 탈퇴이벤트를 구독하여 해당 회원의 Link Batch 삭제
- Folder:
- Domain
- 이벤트를 정의하고 이에 대한
publisher와listener를 등록 listener측에서 이벤트가 발생하면 해야할 행위를 정의
- 이벤트를 정의하고 이에 대한
- Infra
- 이벤트를 실제로 발행하여 각각의 listener들에게 aysnc non-blocking하게 전달
Trouble Shooting

