목차
- Aletheia?
- API 문서
- 기술 스택
- ERD
- 주요 기능
- gRPC 기반 MSA 아키텍처
- 금 구매/판매
- QueryDsl 동적 쿼리를 사용한 거래 통계
- 트러블 슈팅
- Shell Script
- 통합 테스트 효율성을 위해 Shell Script 작성
- 로깅 AOP
- Shell Script
- 구현 상세
금을 판매/구매하는 서비스 Aletheia의 백엔드 서버
인증 서버, 자원 서버를 분리하여 gRPC
를 통해 통신합니다.
Postman API 문서는 이곳에서 확인하실 수 있습니다.
(간편한 설명을 위한 ERD이며, 실제
user
테이블은 Auth 서버와 통신하는 DB에, purchase
, sales
테이블은 Resource 서버와 통신하는 DB에 위치합니다)
- Auth 서버: 사용자 인증/인가를 전담하는 독립적인 서버
- Resource 서버: 리소스 처리와 데이터 제공 기능 담당
- 인증이 필요한 요청이 도착하면
gRPC
를 사용하여 Auth 서버로 인증 요청 수행
- 인증이 필요한 요청이 도착하면
- 금 구매/판매 시 사용자 ID와 함께 Human Readable한 주문 번호를 생성하여 관리를 용이하게 구현
- Spring Validation과 enum,
Custom Annotation
을 사용해 입력 데이터 유효성 검증
@Schema(description = "수량", example = "3.75")
@NotNull(message = "수량은 필수입니다.")
@DecimalMin(value = "0.01", message = "수량은 최소 0.01g 이상이어야 합니다.")
@Digits(integer = 10, fraction = 2, message = "수량은 최대 소수점 둘째 자리까지 입력 가능합니다.")
private BigDecimal quantity;
@IsValidSalesState
private String salesStatus;
- 금 판매/구매 데이터를 필터링 하여 각 기간 동안의 거래 통계 제공
시작일
,종료일
,구매/판매/전체
, 페이징 등
- QueryDsl 동적 쿼리를 사용하여 유연한 데이터 조회 구현
- 배경, 문제
- 인증 서버, 자원 서버는 독립적으로 실행되며 gRPC와 RESTful API를 통해 상호작용
- 개발 과정에서 빈번히 gRPC 프로토콜 파일 생성, 프로젝트 빌드, 테스트해야 하는데 이를 수동으로 관리하기는 비효율적
- 해결:
자동화 스크립트
작성quick_start.sh
와stop_servers.sh
두 개의 Shell Script를 통해 서버 관리, 빌드 자동화quick_start.sh
상세- (기존) 빌드 디렉토리 삭제
- gRPC 프로토콜 파일 생성
- 인증 서버, 자원 서버 빌드
- 서버 실행
- 실행 로그는 각각 auth.log, resource.log 파일에 기록
- 배경
- 기존 코드:
log.info()
등의 메서드를 사용해 수동으로 로그 기록- 개발자가 직접 로깅을 하지 않으면 예외가 발생해도 로그가 남지 않는 문제
- 메서드명이나 인수 정보가 일관되지 않아 예외 원인 추적 어려움
- 각 서비스 클래스마다 별도의 try-catch 블록을 추가하여 예외를 처리하고 로그를 남기는 방식은 코드 중복
- 기존 코드:
- 해결:
AOP
를 도입하여 예외 로깅 자동화@AfterThrowing
어노테이션을 사용하여 서비스 메서드에서 발생하는 모든 예외를 캐칭- 예외 발생 시 메서드명, 클래스명, 전달된 인수, 예외 메시지를 자동으로 로깅
application.yml
파일을 {auth 혹은 resource}/src/main/resource
디렉토리에 적절히 생성해주세요
cd aletheia
chmod +x quick_start.sh
./quick_start.sh
chmod +x stop_servers.sh
./stop_servers.sh