- IDE: 이클립스
- OS: Windows 10
- 버전관리 : GIT
- Spring Boot 2.4.0
- JPA
- H2
- JUnit 5
- Gradle
- Lombok
git clone https://github.com/hongdaepyo/kakaopay_pretest.git
cd kakaopay_pretest/
./gradlew clean build
java -jar build/libs/kakaopaySprinkle-0.0.1-SNAPSHOT.jar
- 뿌리기 POST /kakaopay/sprinkle
- url : http://127.0.0.1:8080/kakaopay/sprinkle
- request
- headers 에 추가. X-USER-ID : 00001 X-ROOM-ID : ABCDE
- body
{
"amount": 200000,
"memberCount": 5
}
- response (랜덤으로 만들어진 토큰) IEX
- 받기 PUT /kakaopay/sprinkle
- url : http://127.0.0.1:8080/kakaopay/sprinkle
- request
- headers에 추가. X-USER-ID : 00002 X-ROOM-ID : ABCDE
- body
{
"token": "IEX"
}
- response (랜덤으로 분배된 뿌리기 금액) 11
- 조회 GET /kakaopay/checkmoney/{token}
-
request
-
path value : IEX
-
/kakaopay/checkmoney/IEX
-
response
{
"totalMoney": 200000,
"receivedInfo": [
{
"receiverId": "00002",
"receivedMoney": 23
},
{
"receiverId": "00003",
"receivedMoney": 11
}
],
"totalReceivedMoney": 34,
"createDate": "2020-11-23T18:25:17.706"
}
- 토큰 생성
- 영어 대문자 + 영어 소문자 + 숫자를 결합한 문자열을 만든 후, Java.security.SecureRandom 클래스를 이용하여 랜덤하게 인덱스를 만든다. 만들어진 인덱스를 charAt에 사용하여 3자리의 랜덤 문자열을 생성한다.
- 뿌리기 금액 분배
- 분배 전 금액을 뿌린 금액과 같게 초기화한다.
- long remainMoney = totalAmount;
- SecureRandom 클래스를 이용하여 random long value를 만들고 remainMoney 에서 빼준다. 이 때 long value는 remainMoney로 나눈 나머지를 구하게 하여 remainMoney보다 크지 않은 무작위 값을 뺄 수 있도록 한다.
- long randomMoney = Math.abs(random.nextLong() % remainMoney);
- 위에서 구해진 randomMoney를 long 배열에 담고 그 배열을 shuffle하여 무작위 뿌린 금액 배열을 만들어 저장한다. shuffle 함수에도 random 으로 인덱스 두개를 생성한 뒤 배열에서 해당 인덱스의 값을 스왑한다.
- sprinkle/util/common.util 참고
- 제약조건 처리
- 뿌리기 당 사용자는 한번만 받을 수 있다
- JPA를 활용하여 현재 방에서 받기 요청한 사용자가 요청 토큰으로 받은 내역이 있는지 확인.
- 자신이 뿌리기한 건은 자신이 받을 수 없다.
- db에서 받아온 데이터에서 뿌리기를 등록한 사용자와 현재 받기 요청한 사용자의 아이디를 도메인에서 비교
- 뿌리기 호출된 대화방과 동일한 대화방에 속한 사용자만 받을 수 있다.
- JPA로 조회 시 By 조건절에 RoomId 항목을 추가하여 현재 방의 뿌리기만 조회하도록 한다.
- 뿌린 건은 10분간만 유효합니다.
- db에서 받아온 데이터에서 현재 시간과 뿌리기가 생성된 시간을 비교.
- 제약조건 처리
- 뿌린 사람 자신만 조회할 수 있습니다.
- JPA로 조회 시 By 조건절에 UserId를 넣어 현재 요청한 사용자의 뿌리기 내역만 조회한다.
- 뿌린 건에 대한 조회는 7일 동안 할 수 있습니다.
- JPA로 조회 시 By 조건절에 createDateBetween을 넣어 오늘부터 일주일 전까지의 데이터를 조회한다.
- 뿌린 사람 자신만 조회할 수 있습니다.