
이번 주 요약
원데이 코스들을 강사들이 개설하고 그를 중개하는 플랫폼의 API를 구현 중
초기 인프라를 구성하고, 회원, 주문, 출석, 결제 도메인의
기반 엔티티를 구성, 회원, 인증, 검색 등의 도메인의 개발 역할을 맡게 됨
최소 MVP 의 구현 도메인 작업 후에는 아마 소셜 로그인, AI 도입 등
추가적인 도메인과 현재 작업물을 좀 더 고도화 하는 역할을 수행 예정
이번 프로젝트에서는 AI Code 검토 및 정적 테스트 도구인 CodeRabbit 과
Sonar Cloud 를 사용하기로 하여 CI 환경에서 돌도록 구현
또한 프로젝트 관리 툴 도입으로 범용성이 큰 Jira 를 선택해 활용 중
구현한 것
프로젝트 초기 셋업
GitHub Actions를 이용해 CI 파이프라인을 구성했고,
SonarCloud와 JaCoCo를 연동해 코드 커버리지를 확인할 수 있도록 했다
또한 CodeRabbit을 적용해 PR 단위에서 자동 코드 리뷰를 받을 수 있게 했다
도메인 엔티티 설계
공통 엔티티로 BaseTimeEntity, BaseTimeWithDelEntity를 만들고,
Soft Delete가 필요한 도메인에서 재사용할 수 있도록 설계하였다
이후 회원, 주문, 대기열, 출석, 결제, 환불, 웹훅 관련 엔티티를 구현했다
도메인이 많다 보니 단순히 테이블을 만드는 것보다,
각 엔티티가 어떤 기능과 책임에 대해 어떤 컬럼을 가지는 것이 맞는가 고민했다
예를 들어 채팅의 경우 만약 풀 구현이 가능하다면,
AI CS 챗봇이 응대를 하다가 관리자와 대화 요청시 참가하여 대화를 이어나가게
하도록 하기 위해선 참여자 엔티티를 따로 두는 것이 올바른 형태라고 판단했고
또 여기에 단순히 Member 엔티티 속 ID 를 활용하는 것도 챗봇이라면 없을테니
따로 Type 을 두고 관리하는 것이 옳겠구나 하는 판단을 했다
기능 구현
타 팀원들의 진행 방향까지 어느정도 서술 하자면,
출석 기능에서는 ZXING 라이브러리를 사용해 QR 코드를 생성하고,
Redis를 이용해 QR 토큰을 관리하도록 구현 중이다
결제 기능은 PortOne 연동을 고려해 PaymentGateway 인터페이스를 두고, Facade 패턴을 적용해 외부 결제 연동 세부사항이
서비스 로직에 직접 퍼지지 않도록 작업 중이다
회원 기능에서는 JWT 발급과 검증, Spring Security 필터 체인을 통한 가입, 로그인
타 팀원들이 사용할 Redisson 을 통한 분산락 구현과,
API 테스트 및 문서화를 1차로 이용하기 위해 Swagger 설정을 함께 구성했다
주문 생성 과정에서는 대기열 처리를 위해 Redis 와 Lua 스크립트를 활용하여
분산락을 구현 중이다가 Redisson 으로 변경할 예정이다
이번 주 주요 배울 점
분산락은 트랜잭션 순서가 중요하다
저번 토이 프로젝트 중에서도 분산락의 구현 중 트랜잭션의 순서가 고민되었었다
락이 비즈니스 로직의 트랜잭션보다 먼저 해제되면 문제가 생길 수 있기 때문이다
그러므로 가장 중요했던 부분은 락이 트랜잭션보다 먼저 잡히고,
트랜잭션이 끝난 뒤 락이 해제되도록 구성해야한다
1. 분산락 획득
2. 비즈니스 트랜잭션 시작
3. 비즈니스 로직 실행
4. 비즈니스 트랜잭션 커밋
5. 분산락 해제
이 순서가 올바르다고 판단되고 실제로도 문제가 없으리라 판단된다
락이 풀리고 비즈니스 로직이 커밋 되면 그 사이에 다른 락이 들어올 수 있고
작업 전의 데이터를 기반으로 또 재차 작업이 이루어 질 수 있으리라 본다
AOP 를 기반으로 만들어진 Transactional 은 같은 클래스 내에서 참조시Self-invocation 문제를 일으켜 제대로 동작하지 않는다
프록시 패턴으로 동작하는 AOP는 내부에서 자기 자신을 거칠 때
프록시가 작동하지 않아 AOP가 미적용되어 처리되지 않는 것이다
그래서 AopInTransaction이라는 별도 Bean을 만들고,REQUIRES_NEW 트랜잭션을 실행하도록 분리했다
이번엔 이에 더불어 @Order(HIGHEST_PRECEDENCE)를 사용해
분산락 Aspect 자체가 트랜잭션보다 먼저 실행되도록 해보았다
프로젝트는 마무리 되었으나 좋은 경험은 아니였다
다들 안하려는 분위기가 너무 강해서 솔직히 맘이 아팠다
이제 스스로 나아갈 차례다