Easy Understanding

스프링부트로 페이 시스템 구축 도전해보기(초보 난이도) (1) - 프로젝트 개요 본문

Spring

스프링부트로 페이 시스템 구축 도전해보기(초보 난이도) (1) - 프로젝트 개요

appleg1226 2020. 10. 15. 14:32

초보 주의

예전 개발 경험이 적을 때 작성한 거라서 지금 저의 시점으로 보니 너무 도움이 안 되는 글이네요...

솔직히 지우고 싶으나 풋풋함을 기억하기 위해서 남겨둡니다. 

(심지어 지금 결제 도메인 개발 중이라 더 부끄러움)

 


What is this Project?

이번에는 제가 가지고 있는 개발에 대한 각종 기초 지식들과 기술들을 모아모아서

간단한 테스트 프로젝트를 하나 해보려고 합니다.

그 중에 제가 고른 것은 '페이 시스템'에 대한 구현입니다.

 

이번에 기획한 페이 시스템은 기본적으로는 그렇게 복잡한 로직을 사용하지 않습니다.

클라이언트와 서버에서는 간단한 덧셈과 뺄셈으로 이루어진 내부 작업을 수행하는 것이 대부분입니다.

 

'결제, 충전, 송금, 조회'

딱 봐도 결제는 사용자 계좌에서 돈만 빼면 되는 로직이고,

충전은 돈을 넣어주는 로직이고,

송금은 두 유저 중 한 유저는 돈이 빠지고, 한 명은 돈이 들어오는 로직밖에 없습니다.

조회는 그냥 DB에서 조회만 해주면 되겠습니다. 

(물론 현실에선 이것보다 수백배는 복잡합니다^^)

 

작게 시작해서 조금씩 단계별로 기능을 추가해보는 방식으로 프로젝트를 진행하겠습니다.


어떤 식으로 구성할 것인가?

사실 기획대로라면 그렇게 복잡한 시스템은 아니어서 하나의 스프링 어플리케이션으로 충분히 만들 수 있습니다.

그렇지만 실제 어플리케이션처럼 굉장히 코드가 복잡하고 가늠할 수 없다고 가정하였으며,

MSA 아키텍쳐모양을 갖추기 위해 세 개의 Spring Application으로 나누겠습니다.

또한 모든 개발은 API만으로 구성될 것입니다.

 

1) 조회/충전 서비스

조회 서비스와 충전 서비스는 하나의 어플리케이션에서 같이 담당합니다.

 

조회는 자신의 페이머니의 변동을 날짜별로 볼 수 있게 해주는 기능이 일단 있어야 합니다.

가장 대표적인 조회이며, 이외에는 각 서비스들에서 필요한 정보를 제공해주는 각종 api를 만들 것입니다.

 

충전 서비스는 각 유저가 결제하는 데에 필요한 페이머니를 충전하는 서비스입니다.

사용자는 이 과정에서 여러 방법을 이용하여 충전이 가능하도록 해야합니다. 

 

2) 결제 서비스

결제 서비스는 사용자가 자신의 페이 결제 수단을 이용하여 영업점에서 결제를 하는 과정을 담당합니다.

우리가 QR코드를 찍어서 계산을 하는 과정을 생각해보면 됩니다.

결제가 이루어진다면 다음의 주체들은 다음의 처리가 필요합니다.

 

- 사용자

• 결제 수단 확인 및 인증

• 자신의 페이머니가 충분한지 확인, 충분하지 않으면 결제 취소

• 정상적으로 결제가 이루어진다면 페이머니 감액 

 

- 영업장

• 정상적으로 결제가 이루어진다면 영업자가 정산받아야할 페이머니  증가

 

- 시스템

• 매 월 각 영업자들에게 수익 정산(이 과정에서 수수료 정책 적용)

 

3) 송금 서비스

송금 서비스는 가입된 유저 간의 전달, 가입되지 않은 유저에게로의 전달 두 가지 유형을 담당합니다.

그러나 단순하게 한 유저의 돈을 빼서 한 유저에게로 전달하는 방식은 아닙니다.

요새 페이의 송금 방식을 참조하여 저는 다음과 같이 구현하려고 합니다.

 

1. 한 유저가 다른 유저에게 돈을 송금한다.(이 과정에서 인증이 이루어진다)

   이 때 보낸 유저의 페이머니에서는 송금 금액을 빼지만, 받은 유저는 아직은 송금 금액을 받지 못한다.

2. 받은 유저가 승인을 누르는 순간, 보낸 유저에게는 승인 알림이, 받은 유저는 송금 금액을 받게 된다.

3. 만약 받는 유저가 일정 시간 내에 승인을 누르지 않을 경우 알림을 보냅니다.


왜 이 기술을 사용하는가?

1) Java 8

자바 8은 여전히 가장 안정적인 자바 버전이라고 생각합니다.

특별히 높은 버젼의 기능이 필요하지 않아서 8을 선택했습니다.

2) Maven

메이븐은 그레이들보다 가독성도 떨어지고 느리다고는 하지만,

저의 어플리케이션에서는 성능적인 측면에서 이점이 크지 않다고 판단해 그레이들을 사용하지 않기로 했습니다.

(사실 익숙해서 사용하는게 더 큽니다..)

3) Spring Dependencies

스프링 초기 의존성 설정 화면

1. Lombok

getter, setter 등 코드를 깔끔하게 유지시켜줘서 롬복이 있어야 안심이 됩니다. 이젠 스프링에는 필수인 듯.

IntelliJ에서는 Annotation processor를 켜고 사용해야 합니다.

 

2. Web

기본적인 MVC 모델로 사용하기에 가장 적절한 Web을 추가했습니다.(여긴 뷰는 없지만..)

 

3. MongoDB

가장 대중적인 NoSQL인 MongoDB를 메인 저장소로 골랐습니다.

굳이 NoSQL을 사용한 이유는 익숙해지기 위한 연습도 있고, 연습 과정에서 크게 여러가지 따질 이유가 없었기 때문입니다.

실제로 페이 시스템을 사용하는 시스템들에서는 아무래도 더 안전한 느낌이 드는 SQL을 사용할 것 같다는 생각이 듭다만,

이것도 요새는 어떻게 돌아가는지 알아 봐야겠습니다.

 

4. Redis

Redis는 인메모리 DB라 해서, 저장이 디스크가 아닌 메모리에 이루어지는 빠른 접근을 장점으로 하는 데이터베이스입니다.

저는 여기에서는 캐시로 사용하여 데이터베이스 조회 성능을 향상시킬 예정입니다.

 

5. RabbitMQ

RabbitMQ는 메시징큐입니다. 여기에서는 여러 어플리케이션 인스턴스 간에 소통을 담당할 것입니다.

서비스 A에서 일어난 일을 서비스 B에서 연속으로 처리해야 한다면,

아래처럼 A에서 RabbitMQ를 통해서 B로 특정 메시지를 보낼 것입니다.

그럼 B는 그 메시지를 받아보고 자신이 해야할 일을 수행하겠죠.

A -> RabbitMQ -> B

4) Docker

docker를 사용하는 가장 큰 이유는 편리함입니다.

컴퓨터에 직접 셋팅해서 설정하는 귀찮음을 해결해줄뿐 아니라, 설치가 정말 순식간에 끝납니다.

게다가 스프링 자동 설정은 docker에 띄워져 있는 미들웨어들의 대표 port를 알아서 찾아내서,

특별한 설정이 없어도 바로 스프링에 연결될 수 있게 하여 정말 편리합니다.

저는 Redis, MongoDB, RabbitMQ를 Docker에 띄우고 사용할 예정입니다.


다음 글에서는 Springboot를 이용한 조회/충전 서비스에 대한 구현을 살펴보도록 하겠습니다.

 

(실제 구현 코드)

github.com/appleg1226/sample-pay-system