- docker ์คํ
docker-compose up -d
- ์ ํ๋ฆฌ์ผ์ด์ ๋น๋
./gradlew build
3์ ํ๋ฆฌ์ผ์ด์ ์คํ
java -Dspring.profiles.active=prod -jar build/libs/mini-firfin-0.0.1-SNAPSHOT.jar -Djava.net.preferIPv4Stack=true -Duser.timezone=Asia/Seoul -Xms4096m -Xmx4096m
- http ํด๋์ ์กด์ฌํ๋ Requests.http ํ์ผ์ ํ์ฉํ๋ฉด ์์ฝ๊ฒ API๋ฅผ ํ ์คํธํ ์ ์์ต๋๋ค.
- schema.sql : index ์ค์ ์ด ๋ค์ด์์ต๋๋ค.
- data.sql : ํ ์คํธ๋ฅผ ์ํ ๋ฐ์ดํฐ๊ฐ ๋ค์ด์์ต๋๋ค.
๊ฐ์ ์๊ฐ ๋จธ๋ ์ก๊ธ์ ํ ์ ์๋ API ๋ฅผ ์ค๊ณ/๊ตฌํํ์์ค.
-
๋ค์ http api ๋ก ์ค๊ณํ๊ณ , ํ๋ผ๋ฏธํฐ์ ๋ํ ์ค๋ช ์ ์ถ๊ฐํฉ๋๋ค.
- ๋์
- ์ก๊ธ API
- ๋ก๊ทธ์ธํ ์ฌ์ฉ์๊ฐ ๋ค๋ฅธ ์ ์ ์๊ฒ ์ก๊ธ์ ํ ์ ์๋ค.
- ํน์ ์ ์ ์ ์ก๊ธ ๋ชฉ๋ก์ ๋ณผ ์ ์๋ API
- ๋ก๊ทธ์ธํ ์ฌ์ฉ์๊ฐ ํ์ด์ง์ด๋ ๋ฌดํ ์คํฌ๋กค ํํ๋ก ์์ ์ ์ก๊ธ ๋ชฉ๋ก์ ๋ณธ๋ค.
- ๊ธ์ก ์ถฉ์ API
- ๋ก๊ทธ์ธํ ์ฌ์ฉ์๊ฐ ์์ ์ ๊ธ์ก์ ์ถฉ์ ํ ์ ์๋ค.
- ์ก๊ธ API
- ์ค๊ณ/๊ตฌํ/๋ฌธ์ํ์ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ๋์ง์ ๋ํ ๋ฌธ์ํ๊ฐ ํ์ํฉ๋๋ค.
- ๋์
-
ํ๋ฃจ์ ๋ช์ฒ๊ฑด์์ ๋ช๋ง๊ฑด ์ ๋๊ฐ ๋ฐ์ํ ์ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
-
์ค์ ํ์ผ์ฌ์ฉ์๋ ์ฌ์ฉ์ ์ ์ฒด์ด๋ค.
-
๋จ์ํ ์ผ์ด์ค๊ฐ ์๋๋ผ, ์ค์ ๋ก ์ฌ๊ฐํ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์๋ ์ผ์ด์ค๋ ๊ณ ๋ฏผํด์ผ ํ๋ค.
- ์ผ์ฃผ์ผ
- 27์ผ 00 ์ ๊น์ง ์ ์ถํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
- ๊ณผ์ ์ผ์ ์ ์กฐ์ ์ด ํ์ํ๋ฉด ์ฐ๋ฝ์ฃผ์๋ฉด๋ฉ๋๋ค.
- ๊ฐ๋ฐ์ธ์ด๋ Java/Kotlin ์ ๋๋ค.
- ๊ฐ ์ ์ ๋ ํ์ฌ ๊ฐ์ง๊ณ ์๋ ๊ธ์ก์ ์ ์ฅํ๊ณ ์์ต๋๋ค.
- ํ์ฌ ์ ์ ๋ ๊ฐ์ ์ํ๊ฑฐ๋ ํํด์ผ ์ ์์ต๋๋ค.
- ์ ์ ๋ง๋ค ๋ณด์ ํ ์ ์๋ ์ต๋ ํ๋๊ฐ ์๊ณ , ์๋ก ๋ค๋ฅผ ์ ์์ต๋๋ค.
- ํ๋๊ฐ ๋์ ๊ฒฝ์ฐ ํด๋น ์ก๊ธ์ ์คํจํด์ผ ํฉ๋๋ค.
- DB Schema ๋ฅผ mysql ๊ธฐ์ค์ผ๋ก ์ฒจ๋ถ ๋ถํ๋๋ฆฝ๋๋ค.
- ์ก๊ธ์ ์ทจ์๋ ๋ฐ์ํ์ง ์์ต๋๋ค.
- ์ฌ์ฉ์์ ์ธ์ฆ ๋ถ๋ถ ์์ฒด๋ ๋ฐ๋ก ๊ณ ๋ คํ์ง ์๊ณ ํ๋ผ๋ฏธํฐ ์ ์ id๋ก ๋์ฒดํฉ๋๋ค.
- ์ด๋ค ์ํฉ์์๋ ์ต๋ํ ์์คํ
์ ์ก๊ธ ๋ฐ์ดํฐ๊ฐ ์ผ์นํด์ผ ํฉ๋๋ค.
- ์คํจํ๋ค๋ฉด ์ด๋ ์์ ์์ ํ์ด์ง๋์ง๋ฅผ ์ ์ ์์ด์ผ ํฉ๋๋ค.
- 100% ์์ฑ๋์ง ์์ ๊ฒฝ์ฐ, ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ์ ์ด์ ๋ํ ๋ถ๋ถ์ ๋ฌธ์์ ์ ๋จ๊ฒจ์ฃผ์๋ฉด ๋ฉ๋๋ค.
- ์ก๊ธ๊ณผ ์ก๊ธ๊ธฐ๋ก ๋ถ๋ถ์ ์ง์คํด์ฃผ์๋ฉด ๋ฉ๋๋ค.
- ๋ณธ์ธ์ด ํด๋น ํ๋ก์ ํธ์์ ๋ฐ์ํ ์ ์๋ ์ํ์์, ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ์ด๋ป๊ฒ ํด๊ฒฐํ ์ง์ ๋ํด์ ์ ๋ฆฌํ ๋ฌธ์
- ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ์ด์ ๋ํ ํด๊ฒฐ์ฑ (๋น์ฉ์ธก๋ฉด ๋๋ ์ฑ๋ฅ ์ธก๋ฉด๋ฑ)
- ๊ตฌํ ์ฝ๋
์ฌ์ฉ์ ํ ์ด๋ธ
- birth_date : ์๋ ์์ผ
- deleted : ์ญ์ ์ฌ๋ถ
- created_date_time : ์์ฑ ์๊ฐ
- updated_date_time : ์์ ์๊ฐ
- phone_number : ์ ํ๋ฒํธ
- ํ๋ก์ ํธ ๋จ์ํ๋ฅผ ์ํด ๊ตญ์ ๋ฒํธ ๋ฑ์ ๊ฒฝ์ฐ๋ ์ ์ธํ๊ณ 11์๋ก ๊ณ ์
- ํ๋ก์ ํธ ๋จ์ํ๋ฅผ ์ํด ํต์ ์ฌ๋ ๋ฐ๋ก ์ ์ฅํ์ง ์์
- name : ์ด๋ฆ
- ๊ตญ๋ด์์ ์ด๋ฆ ๊ฐ์ฅ ๊ธด ์ฌ๋ (ํ๊ธ ๊ธฐ์ค) : 30์
- ์ํ๋ฒณ ๊ธฐ์ค ๊ฐ์ฅ ๊ธด ์ฌ๋ (์ํ๋ฒณ ๊ธฐ์ค) : 747์
- ์ ํ๋ฆฌ์ผ์ด์ ๋จ์ํ๋ฅผ ์ํด ํ๊ธ ๊ธฐ์ค์ผ๋ก 30์๋ก ์ค์
- email : ์ด๋ฉ์ผ
- rfc 2821 ๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ 254์๋ก ์ค์
- https://www.ietf.org/rfc/rfc2821.txt
- serial_number : ์ฌ์ฉ์ ๊ณ ์ ๋ฒํธ
์ฌ์ฉ์ ์์ง๊ธ ํ ์ด๋ธ
- deleted : ์ญ์ ์ฌ๋ถ
- created_date_time : ์์ฑ ์๊ฐ
- member_id : ์ฌ์ฉ์ id
- updated_date_time : ์์ ์๊ฐ
- money_amount : ์์ง๊ธ
- money_limit : ์์ง๊ธ ํ๋
- payment_info : ๊ฒฐ์ ์ ๋ณด
- payment_method : ๊ฒฐ์ ์๋จ
์ก๊ธ ๊ธฐ๋ก ํ ์ด๋ธ
- deleted : ์ญ์ ์ฌ๋ถ
- created_date_time : ์์ฑ ์๊ฐ
- receiver_id : ์์ ์ id
- sender_id : ์ก์ ์ id
- updated_date_time : ์์ ์๊ฐ
- sender_phone_number : ์ก์ ์ ์ ํ๋ฒํธ
- ์ฌ์ฉ์์ ์ ํ๋ฒํธ๊ฐ ๋ฐ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ํ ์ด๋ธ์์ joinํ์ง ์์
- sender_ip_address : ์ก์ ์ ip ์ฃผ์
- sender_email : ์ก์ ์ ์ด๋ฉ์ผ
- ์ฌ์ฉ์์ ์ด๋ฉ์ผ ์ฃผ์๊ฐ ๋ฐ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ํ ์ด๋ธ์์ joinํ์ง ์์
- receiver_remain_amount : ์์ ์ ์์ก
- send_amount : ์ก๊ธ ๊ธ์ก
- send_payment_info : ์ก๊ธ ๊ฒฐ์ ์ ๋ณด
- send_payment_method : ์ก๊ธ ๊ฒฐ์ ์๋จ
- sender_remain_amount : ์ก์ ์ ์์ก
- sender_serial_number : ์ก์ ์ ๊ณ ์ ๋ฒํธ
์ถฉ์ ๊ธฐ๋ก ํ ์ด๋ธ
- deleted : ์ญ์ ์ฌ๋ถ
- created_date_time : ์์ฑ ์๊ฐ
- member_id : ์ฌ์ฉ์ id
- updated_date_time : ์์ ์๊ฐ
- member_phone_number : ์ฌ์ฉ์ ์ ํ๋ฒํธ
- ์ฌ์ฉ์์ ์ ํ๋ฒํธ๊ฐ ๋ฐ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ํ ์ด๋ธ์์ joinํ์ง ์์
- member_ip_address : ์ฌ์ฉ์ ip ์ฃผ์
- member_email : ์ฌ์ฉ์ ์ด๋ฉ์ผ
- ์ฌ์ฉ์์ ์ด๋ฉ์ผ์ฃผ์๊ฐ ๋ฐ๋ ์๋ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉ์ ํ ์ด๋ธ์์ joinํ์ง ์์
- member_payment_info : ์ฌ์ฉ์ ๊ฒฐ์ ์ ๋ณด
- member_payment_method : ์ฌ์ฉ์ ๊ฒฐ์ ์๋จ
- recharge_amount : ์ถฉ์ ๊ธ์ก
- remain_amount : ์ถฉ์ ํ ์์ก
์ก๊ธ ๊ธ์ก / ์ถฉ์ ๊ธ์ก์ ๊ฒฝ์ฐ 1ํ ์ถฉ์ / ์ก๊ธ ํ๋๊ฐ ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ varchar(255)๊ฐ ์๋ ๋ค๋ฅธ ๊ฐ์ผ๋ก ์ค์ ํ ๊น ๊ณ ๋ฏผํ์ผ๋, ์ ์ฑ ์ด ๋ฐ๋ ์ ์๋ค๋ ์ ์ ๊ฐ์ํด varchar(255)๋ก ์ค์ ํ์ต๋๋ค.
request
POST http://localhost:8080/api/v1/transfer
Content-Type: application/json
Bearer: senderId
{
"receiverId": number, // ์์ ์ id
"sendAmount": number // ์ก๊ธ ๊ธ์ก
}
response
{
"senderName": string, // ์ก์ ์ ์ด๋ฆ
"receiverName": string, // ์์ ์ ์ด๋ฆ
"transferHistoryId": number, // ์ก๊ธ ๊ธฐ๋ก id
"transferredMoneyAmount": number, // ์ก๊ธ ๊ธ์ก
"senderRemainMoneyAmount": number, // ์ก์ ์ ์์ก
"timestamp": string, // ๊ฑฐ๋ ์๊ฐ
"status": string // ๊ฑฐ๋ ์ฑ๊ณต ์ ๋ฌด
}
request
GET http://localhost:8080/api/v1/transfer/histories?cursorId=number
Content-Type: application/json
Bearer: memberId
response
"data": [{ // ์ก๊ธ ๋ชฉ๋ก
"transferHistoryId": number, // ์ก๊ธ ๊ธฐ๋ก id
"senderId": number, // ์ก์ ์ id
"receiverId": number, // ์์ ์ id
"senderName": string, // ์ก์ ์ ์ด๋ฆ
"receiverName": string, // ์์ ์ ์ด๋ฆ
"sendAmount": number, // ์ก๊ธ ๊ธ์ก
"senderRemainMoneyAmount": number, // ์ก์ ์ ์์ก
"createdDateTime": string, // ์ก๊ธ ์๊ฐ
}],
"isEmpty": boolean, // ํ์ฌ ํ์ด์ง๊ฐ ๋น์๋์ง์ ๋ํ ์ฌ๋ถ
"cursorId": number, // ๋ค์ ํ์ด์ง๋ฅผ ์ํ ์ปค์
}
request
POST http://localhost:8080/api/v1/recharge
Content-Type: application/json
Bearer: memberId
{
"rechargeAmount": number // ์ถฉ์ ๊ธ์ก
}
response
{
"rechargeHistoryId": number, // ์ถฉ์ ๊ธฐ๋ก id
"memberId": number, // ์ฌ์ฉ์ id
"memberName": string, // ์ฌ์ฉ์ ์ด๋ฆ
"currentMoneyAmount": number, // ์ถฉ์ ํ ์์ก
"rechargedMoneyAmount": number, // ์ถฉ์ ํ ๊ธ์ก
"timestamp": string, // ์ถฉ์ ์๊ฐ
"status": string // ์ถฉ์ ์ฑ๊ณต ์ ๋ฌด
}
- ์ก๊ธ / ์ถฉ์ ์ ์์๋ฃ๋ ์๋ค๊ณ ๊ฐ์ ํ๋ค.
- ํ๋๊ฐ 50,000์์ด๋ผ๋ฉด 50,000์๊น์ง ์์งํ ์ ์๋ค.
- 1ํ ์ต๋ ์ก๊ธ ๊ฐ๋ฅ ๊ธ์ก๊ณผ 1์ผ ์ต๋ ์ก๊ธ ํ๋๋ 199๋ง์์ด๋ค.
- ์ง๋ถ์ ์์ง๊ธ์๋จ์ด๋ผ๊ณ ๊ฐ์ ํ๋ค
- ์นด์นด์คํ์ด, ์ ์๊ธ์ต๊ฐ๋ ๊ท์ ํด์ค์(2017.5, 10.์ ์์ง๊ธ์๋จ์ ์ด์ฉํ๋-๋ค.์ง๋ถ์ ์์ง๊ธ์๋จ ์ด์ฉํ๋) ์ฐธ๊ณ
- 1ํ ์ต๋ ์ถฉ์ ๊ฐ๋ฅ ๊ธ์ก์ 599๋ง์ / 1์ผ ํ๋๋ 2999๋ง์์ด๋ค
- ์ ์์๊ธ์ด์ฒดํ๋๋ผ๊ณ ๊ฐ์ ํ๋ค
- ์ ์๊ธ์ต๊ฐ๋ ๊ท์ ํด์ค์(2017.5, 10.์ ์์ง๊ธ์๋จ์ ์ด์ฉํ๋-๋.์ ์์๊ธ์ด์ฒดํ๋(์ง๊ธ์ด์ฒด์ ๊ฒฝ์ฐ))
- ๋ณธ์ธ ์๋ณ ๋ ์ฝ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ๋จ์ํ๋ฅผ ์ํด ์๋ตํ๋ค
- ๋ง์ด๋์ค ๊ธ์ก ์ก๊ธ / ์ถฉ์ ์ด ๋๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ๊ฐ์ ํ๋ค
- default ์์ก ํ๋๋ 200๋ง์์ผ๋ก ํ๋ค (์นด์นด์คํ์ด ์ฐธ์กฐ)
- ๊ฑฐ๋์ ๋ค์๊ณผ ๊ฐ์ ์ ๋ณด๋ฅผ ์์งํด์ผ ํ๋ค
- ์ด์ฉ์์ ๊ณ ์ ์๋ณ๋ฒํธ
- ์ด์ฉ์์ ์ ์ฉ์นด๋ ์ ๋ณด ๋๋ ์ง๋ถํ๊ณ ์ ํ๋ ๊ธ์ต๊ธฐ๊ด ๊ณ์ข ์ ๋ณด
- ์ด์ฉ์์ ํด๋ํฐ ๋๋ ์ ์ ์ ํ ๋ฒํธ ๋ฐ ๊ฐ์
ํต์ ์ฌ
- ํ๋ก์ ํธ ๋จ์ํ๋ฅผ ์ํด ํต์ ์ฌ ์๋ต
- ์ด์ฉ์์ ์ํ๊ถ ๋ฒํธ ๋ฐ ์ํ๊ถ ํ์ ์์ด๋, ๋น๋ฐ๋ฒํธ ๋ฑ
- ์ํ๊ถ์ด ์๋ค๊ณ ๊ฐ์ ํ๋ค
- ์ด์ฉ์์ ๊ฒฐ์ ํ๊ณ ์ ํ๋ ํฌ์ธํธ ์นด๋ ์ ๋ณด
- ํฌ์ธํธ ์นด๋๊ฐ ์๋ค๊ณ ๊ฐ์ ํ๋ค
- ์ด์ฉ์์ ์ ์์ง๊ฐ ์ด์ฉ์๋ฒํธ ๋ฑ ๊ฒฐ์ ์ ๋ณด
- ์ด์ฉ์์ ์ ์ IP
- ์ด์ฉ์์ ์ด๋ฉ์ผ
- ์ด์ฉ์์ ์ํ ๋๋ ์ฉ์ญ ๊ฑฐ๋ ์ ๋ณด
- ์ฐธ์กฐ : KG์ด๋์์ค ๊ฐ์ธ์ ๋ณด ์ทจ๊ธ๋ฐฉ์นจ
- role์๋ ๋ณดํธ์, ์ฒญ์๋
, ๊ด๋ฆฌ์๊ฐ ์์ ์ ์๋ค.
- ๋ณดํธ์๋ ์ฒญ์๋ ์๊ฒ ์ก๊ธํ ์ ์๋ค.
- ์ฒญ์๋ ์ ๋ณดํธ์์๊ฒ ์ก๊ธํ ์ ์๋ค.
- ์ฒญ์๋ ํ์์ ๊ฐ์ ์ ๋ฒ์ ๋๋ฆฌ์ธ ์ ๋ณด, ๊ฐ์ ์ธ์ฆ์ ๋ณด๋ฅผ ์ถ๊ฐ์ ์ผ๋ก ํ์๋ก ํ๋ค.
- ์ธ๊ตญ์ธ์ ๊ฒฝ์ฐ ์ธ๊ตญ์ธ๋ฑ๋ก๋ฒํธ๋ฅผ ํ์๋ก ํ๋ค.
- ์์ก์ด ๋จ์์์ผ๋ฉด ํ์ ํํด๊ฐ ๋ถ๊ฐ๋ฅํ๋ค.
- ์์ก์ ๋จผ์ ํ๊ธ๋ฐ์์ผ ํ๋ค. (์นด์นด์คํ์ด ์ฐธ์กฐ)
- ํ๋๋ ๋ณ๊ฒฝ๋ ์ ์์ผ๋ฉฐ, ํ์ฌ ์๊ณ ๋ณด๋ค ์ ์ด์ง ์ ์๋ค.
- ๊ฑด๋น 1๋ง์ ์ดํ ๊ฑฐ๋ ๊ธฐ๋ก์ 1๋ ์ด์ ์ ์ฅํด์ผ ํ๋ค(์ ์๊ธ์ต๊ฑฐ๋๋ฒ)
- ๊ฑด๋น 1๋ง์ ์ด๊ณผ ๊ฑฐ๋ ๊ธฐ๋ก์ 5๋ ์ด์ ์ ์ฅํด์ผ ํ๋ค(์ ์๊ธ์ต๊ฑฐ๋๋ฒ)
ํ์ฌ ๋๋ฉ์ธ์ ๋ํ ์ดํด๋๊ฐ ๋ถ์กฑํ๊ธฐ ๋๋ฌธ์ ์ฌ๋ฌ ๋ฌธ์๋ค์ ์ฐธ๊ณ ํ๊ณ , ๋๋ฆ๋๋ก ์ดํดํ ๋ด์ฉ์ ๋ฐํ์ผ๋ก ์์ธํ ๋ด์ฉ์ ๋ค๋ฅธ ํ์๋ค์๊ฒ ํ์ธ๋ฐ์๋ค๊ณ ๊ฐ์ ๋ฐ์ ์ํฉ์์ ํ๋ก์ ํธ๋ฅผ ์งํํ์ต๋๋ค.
- ์ ์๊ธ์ต๊ฐ๋ ๊ท์ ํด์ค์ 2017.5
- KG์ด๋์์ค ๊ฐ์ธ์ ๋ณด ์ทจ๊ธ๋ฐฉ์นจ
- ํ ์ค(๊ธ์ต)/๋ ผ๋ ๋ฐ ์ฌ๊ฑด ์ฌ๊ณ ๋๋ฌด์ํค
- ์นด์นด์คํ์ด ๋๋ฌด์ํค
์ด ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ฐ์ฅ ์ค์ํ ์ฌํญ์ ์ก๊ธ ๊ธฐ๋ฅ์ ์ํํ์ ๋ ์ผ๋ง๋ ์ ํํ๊ฒ ์์ฒญ์ด ์ ๋ฌ๋๋์ง๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๋์ ์ฐ๊ธฐ ํ์์ ๋ง๋ ๊ฒ์ด ๊ฐ์ฅ ์ค์ํ๋ค๊ณ ์๊ฐํด ๊ธ์ก์ ๊ณ์ฐํ๊ธฐ ์ ์ ๋ฝ์ ๊ฑธ์ด ๋์ ์ฐ๊ธฐ ํ์์ ๋ง์์ผ ํ๋ค๊ณ ์๊ฐํ๊ณ , ์ด๋ ํ ๋ฐฉ์์ผ๋ก ๋ง์์ง ๊ณ ๋ฏผํด ๋ณด์์ต๋๋ค.
๋์์ ๋๊ด์ ๋ฝ
๊ณผ ๋น๊ด์ ๋ฝ
์ด์์ต๋๋ค. ํ์ฌ ์์ฒญ์ด ํ๋ฃจ ์์ฒ ~ ์๋ง ๊ฑด์ด๊ณ , ๋น์ฆ๋์ค ํน์ฑ ์ ์ก๊ธํ๋ ์ฃผ์ฒด๋ ๋ถ๋ชจ๋ ํน์ ๋ณดํธ์๋ค์ด๊ณ ์๊ธ ์ฃผ์ฒด์ ๋ํด ์ฆ์ ์์ฒญ์ด ๋ฐ์ํ์ง ์์ ๊ฒ ๊ฐ์, DB ๋จ์ ๊ฒฝํฉ์ด ํฌ๊ฒ ๋ฐ์ํ์ง ์์ ๊ฒ์ด๋ผ ํ๋จํด ๋ถ์ฐ ๋ฝ
์ ๋์์ ๋ฃ์ง ์์์ต๋๋ค.
๋ํ ๋ถ์ฐ DB ํ๊ฒฝ์ผ๋ก ๊ฐ์ง ์์๋ ๊ฒฌ๋ ์ ์๋ค๋ ํ๋จ์ด ๋ค์ ๊ฒ๋ ๊ทธ ์ด์ ์์ต๋๋ค.
๊ทธ์ค ๋น๊ด์ ๋ฝ์ ์ ํํ์ต๋๋ค. ์ด์ ๋ ๋๊ด์ ๋ฝ์ ์ ํํ๋ฉด ํ์ฌ ์ ํฉ์ฑ์ ์ด์ ๋ก REPEATABLE_READ
๊ฒฉ๋ฆฌ ์์ค์ ์ฌ์ฉํ๊ณ ์์ด ๋กค๋ฐฑ ๋ฑ์ด ๋ฐ์ํด ๋ฒ์ ์ด ๊ผฌ์ด๋ ์ผ์์ ์์ ํ ๊ฒ ๊ฐ์ง๋ง, ํธ๋์ญ์
์ด ๋์์ ์์๋์ด version column์ด ๋ณ๊ฒฝ๋๊ธฐ ์ ์ ๋์์ ์ฝ๋๋ค๋ฉด ํน์ฌ๋ผ๋ ๋์์ฑ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค.
๊ธ์ ๊ด๋ จํ ๋๋ฉ์ธ์์ ์ ํฉ์ฑ์ด ๊ต์ฅํ ์ค์ํ์ฌ ๋์ ์ ๊ทผ ๋น๋๋ฅผ ๋ณด์์ ๋ ์ฑ๋ฅ์ ์ํด ๋ณด๋๋ผ๋ ์ ํฉ์ฑ์ ๋ณด์ฅํ๋ ํธ์ด ๋ซ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ก๊ทธ์ธ ๊ณผ์ ์ ์๋ตํ๋ผ๊ณ ํ์ จ์ง๋ง, id ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ด๋ค ๋ฐฉ์์ผ๋ก ๋ก๊ทธ์ธ ํ ์ง ๊ฐ์ ํ๊ณ ์ค๊ณํ๋ ๊ฒ์ด ํ์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
ํ ํฐ
๋ฐฉ์๊ณผ ์ธ์
๋ฐฉ์ ์ค ์ด๋ค ๊ฒ์ผ๋ก ๊ตฌํํ ์ง ๊ณ ๋ฏผํ๊ณ , jwt ํ ํฐ ๋ฐฉ์์ด๋ผ๊ณ ๊ฐ์ ํ์ต๋๋ค.
๊ทธ ์ด์ ๋ ํ์ฌ ํผํ ์ฑ์ด ๋ชจ๋ฐ์ผ only ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๊ณ ๊ฐ์ ํด ๋ธ๋ผ์ฐ์ ์์ ์ ๊ทผํ ์ผ์ด ์๋ค๊ณ ์๊ฐํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ ์ธ์ ์ฌ์ฉ์ ์ฟ ํค๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฏ๋ก ์ธ์ ์ฌ์ฉ์ฑ์ด ๋จ์ด์ง๊ณ , ์ธ์ ์ ๋ณด์์ ์ฝ์ ์ธ local storage ํ์ทจ ์ํ์ด ์๊ธฐ ๋๋ฌธ์ ๋ณด์์ ๋จ์ ์ด ์ ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ํ, statefulํ๊ธฐ ๋๋ฌธ์ ์ถํ ํ์ฅ์ ์ ๋ฆฌํ ๊ฒ์ด๊ณ ์์ฐ์ฑ๋ ๋ฐ์ด๋ ํ ํฐ ๋ฐฉ์์ ์ ํํ์ต๋๋ค.
ํ ์ค ์ฑ์ ์ฐธ๊ณ ํ์ฌ ๋ฌดํ ์คํฌ๋กค ๋ฐฉ์์ ์ ํํ์ต๋๋ค. ์ค๋งํธํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋ฌดํ ์คํฌ๋กค์ ์ฌ์ฉํ๋ ํธ์ด ์ฌ์ฉ์ ๊ฒฝํ์์ ๋ ์ข๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ํ ๋ฌดํ ์คํฌ๋กค ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ปค์ ๊ธฐ๋ฐ ํ์ด์ง๋ค์ด์ ์ผ๋ก ๊ตฌํํ๊ฒ ๋๋, ์ก๊ธ ๋ด์ญ ๋ชฉ๋ก์ ์บ์ฑํ ๋๋ ๋ ํจ์จ์ ์ผ๋ก ํ์ฉ์ด ๊ฐ๋ฅํ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค.
๋ง์ฝ ์ก๊ธ ํน์ ์ถฉ์ ํ ๋ก๊ทธ ์ ์ฌ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ์๊ฒจ ๋กค๋ฐฑํ๊ฒ ๋๋ฉด ์ฌ์ฉ์ ํธ์์ฑ์ ๋ฌธ์ ๊ฐ ์๊ธธ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ์ต๋๋ค.
๊ฑฐ๊ธฐ์๋ค ๋ก๊ทธ ์ ์ฌ ๊ณผ์ ์ ๋ํ ํธ๋์ญ์ ์ ๋ถ๋ฆฌํ๋ฉด, ๋ฝ์ ์ก๋ ํธ๋์ญ์ ์ด ์งง์์ง๊ธฐ ๋๋ฌธ์ ๋ฐ๋๋ฝ์ ์ํ์ด๋ ๋ฝ ๊ฒฝํฉ์ด ์ค์ด๋ค์ด ์ฌ์ฉ์ ์ฌ์ฉ์ฑ ์ธก๋ฉด์์ ๋์์ด ๋์ง ์์๊น ์๊ฐํ์ต๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ ํน์๋ผ๋ ๊ฑฐ๋๋ ์ด๋ฃจ์ด์ก์ผ๋, ์๋ฒ ํผ์ก์ผ๋ก ์ธํด ํน์ฌ๋ ๋ก๊ทธ ์ ์ฌ ๊ณผ์ ์ค ์์ฒญ์ด ์ํ๋์ง ์๊ฒ ๋๋ค๋ฉด ์ฌ์ฉ์๊ฐ ํ๋ถ์ ์ ์ฒญํ๊ฑฐ๋, ๋ก๊ทธ๊ฐ ์์ผ๋ฏ๋ก ๊ธ์ต ๊ฐ๋ ๋ฑ ์ฌ๋ฌ ๊ณณ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์ด ๋ถ๋ฆฌํ์ง ์๊ธฐ๋ก ํ์ต๋๋ค.
๋ง์ฝ ์ ๋ง ๋ถ๋ฆฌํ๊ณ ์ถ๋ค๋ฉด MQ ๋ฑ์ผ๋ก ์์ฒญ์ ์ ์ฅํ๊ณ ๋น๋๊ธฐ๋ก ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ ํํ ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค.
์ก๊ธ ๊ธฐ๋ฅ๊ณผ ์ถฉ์ ๊ธฐ๋ฅ์ ๊ตฌํํ ๋, lock์ ์ก๋ ๋ก์ง์ ์ต๋ํ ๋ค์ ๋์ด lock ๊ฒฝํฉ์ ์ค์ด๋ ค๊ณ ๋ ธ๋ ฅํ์ต๋๋ค.
๊ทธ๋ฌ๋ค๊ฐ ๋ฐ๋๋ฝ์ด ๋ฐ์ํ์ฌ ํธ๋์ญ์ ์ ๋ฐ์ํ๋ SQL๋ค์ ์ง์ ๋ฐ๋ผ๊ฐ ๋ณด๋ฉฐ ์กํ๋ lock๋ค์ ํ์ธํ์ต๋๋ค.
1์ผ ํ๋๋ฅผ ์ฒดํฌํ๋ ๊ธฐ๋ฅ ํ์ member_money๋ฅผ ์ฐพ๋ ๊ณผ์ ์ lock์ ๊ฑธ์์ต๋๋ค. ์ด๋ member์ ๋ํด ์ธ๋ํค๋ฅผ ๊ฐ๊ธฐ ๋๋ฌธ์, member๋ก lock์ด ํ์ฅ๋์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋ฐ๋ผ์ lock์ ์ก๋ ๋ก์ง์ member_id๋ฅผ ํ์ฉํด์ transfer_history ํ ์ด๋ธ์ ์กฐํํ๋ ๊ณผ์ ์ดํ๋ก ๋ฐฐ์นํ๋๋ ๋ฐ๋๋ฝ์ ํด๊ฒฐํ ์ ์์์ต๋๋ค.
์ก๊ธ ๋ด์ญ ๋ชฉ๋ก์ ๋ณํ์ง ์๋ ๋ฐ์ดํฐ ์ ๋ณด์ด๊ธฐ ๋๋ฌธ์ ์บ์ฑํ๊ธฐ ์ข๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ํ, Redis์ ๊ฒฝ์ฐ SortedSet์ ์ง์ํ๊ธฐ ๋๋ฌธ์ ๋ ์ง ์ต์ ์์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ผ๋ฉด ์บ์ฑ๊ณผ ๋์์ ์ ๋ ฌ์ ์ํํ ์ ์์ต๋๋ค.
๋ฐ๋ผ์ ์ก๊ธ ๋ด์ญ ๋ชฉ๋ก์ ์กด์ฌํ๋ ์ ๋ ฌ์ ์ํ index๋ฅผ ๋บ ์๋ ์์ ๊ฑฐ๋ ์๊ฐ์ด ๋ค์ด ์ด๋์ ๋ง์ด ๋ณผ ์ ์์ ๊ฑฐ๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
์ก๊ธ ๋ด์ญ ๋ชฉ๋ก์ ์ก๊ธ๋ง๋ค ์ ์ฌ๋๊ธฐ ๋๋ฌธ์ ์ฐ๊ธฐ ์ฑ๋ฅ์ด ์ข์ผ๋ฉด ์ด๋์ด ๋ง์ ๊ฑฐ๋ผ๋ ์๊ฐ์ด ๋ค์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์บ์ฑ ์ค์ ์, ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ๋ฃ์ ๊ฒ์ด๋ฉฐ TTL์ ์ด๋ป๊ฒ ๊ฑธ ๊ฒ์ธ์ง์ ๋ํด ๊ณ ๋ฏผํ์ต๋๋ค.
์ก๊ธ ๋ชฉ๋ก์ ํ์ธํ๋ ์ฌ์ฉ์์ ๊ฒฝ์ฐ ๋๋ถ๋ถ ์ต๊ทผ ๋ชฉ๋ก์ ํ์ธํ๋ ๊ฒฝ์ฐ๊ฐ ์ฆ์ ๊ฒ์ผ๋ก ํ๋จํด, 30์ผ ๊ฐ์ ์ก๊ธ ๋ด์ญ์ ์บ์ฑํ๋ฉด ์ถฉ๋ถํ ๊ฒ์ด๋ผ ํ๋จํ์ต๋๋ค.
ํ์ฌ TransferHistoryResponse์ ๊ฒฝ์ฐ 3๊ฐ์ bigInt, 4๊ฐ์ varchar, 1๊ฐ์ datetime์ผ๋ก ์ด๋ฃจ์ด์ ธ ์์ต๋๋ค.
๋จ์ ๊ณ์ฐํ์ ๋ ์ด ํฌ๊ธฐ๋ (8 * 3) + (30 + 30 + 255 + 255) + 8 = 570 + 32 = 602 byte์ ๋๋ค.
๋ค๋ฅธ ๋ฐ์ดํฐ๊ฐ ์ถ๊ฐ๋์์ ๋ ๋ ์ฝ๋ ํ๋์ ํฌ๊ธฐ๋ฅผ ์ฝ 1kb ์ ๋๋ผ๊ณ ๊ฐ์ ํ๊ณ , ๋งค์ผ 3๋ง ๊ฑด์ ์ก๊ธ์ด ๋ฐ์ํ๋ค๊ณ ๊ฐ์ ํ๋ค๋ฉด 30์ผ์น๋ฅผ ์ ์ฌํ์ ๋ ์ฉ๋์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
30 * 30000 * 1kb = 900000kb = 900mb
900mb๋ฉด redis๊ฐ ์ถฉ๋ถํ ๊ฐ๋นํ ์ ์๋ ์ ์ด๋ผ๊ณ ์๊ฐํด 30์ผ์น๋ฅผ ์บ์ฑํ๊ธฐ๋ก ํ์ต๋๋ค.
TTL์ 30์ผ๋ก ์ค์ ํ๊ณ , ๋งค์ผ 00์์ ์ค์ผ์ค๋ฌ๋ฅผ ๋๋ ค 30์ผ์ด ์ง๋ ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๋๋ก ์ค์ ํ๋ฉด ๋ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค.
์ถ๊ฐ์ ์ธ ์ก๊ธ์ด ๋ฐ์ํ๋ฉด ์บ์์ ์ ๋ฐ์ดํธํ๊ณ db์ ์ ๋ฐ์ดํธํ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ฉด ๋ ๊ฒ์ด๋ผ ์๊ฐํ์ต๋๋ค. (cache์์ updateํ๋ ๊ฒ ์๋๋ผ WAS์์ ์ ๋ฐ์ดํธ ํ๋ฏ๋ก write through๋ ์๋๋๋ค.)
write through๋ฅผ ์ ํํ์ง ์์ ์ด์ ๋ ์ฌ์ฉ์์๊ฒ ํ์ํ ์ ๋ณด์ history column์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค.
history ๋ด์ฉ์ ๋ชจ๋ ์บ์ฑํ๋ฉด ํ์ํ์ง ์์ ๋ฐ์ดํฐ๋ฅผ ๋ชจ๋ ์ฌ๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋๋ฌด ๋ง์ด ์ฐจ์งํ ์ ์์ ๊ฑฐ๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
์ด๋ ๋ฐ์ํ ์ ์๋ ๋ฌธ์ ์ ์ ์ปค์ ๊ธฐ๋ฐ ์บ์ฑ์ด๊ธฐ ๋๋ฌธ์ ์บ์ฑ๋์ง ์์ ๊ฒฝ์ฐ ์ฌ๋ฌ ๋ฒ ์ง์ํ๋ ๋ฌธ์ ์ ์ด ์๊ธธ ๊ฒ ๊ฐ์ต๋๋ค.
์๋ฅผ ๋ค์ด, 30์ผ ๊ฐ ๊ธฐ๋ก์ด ํ๋๋ง ์๋ค๋ฉด ์บ์์ ์กด์ฌํ๋ ์ฒซ ๋ฒ์งธ ์์ฒญ์์๋ 1๊ฐ๋ง ์ฝ์ด์ค๊ธฐ ๋๋ฌธ์ client์ธก์์๋ ๋ฌด์กฐ๊ฑด 2๋ฒ ์ด์ ์์ฒญ์ ํด์ผํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋, ์บ์ฑ์ ํ์ ๋์ ์ด์ ์ด ๋ ํฌ๋ค๊ณ ์๊ฐํด ์บ์ฑ์ ์ ํํ์ต๋๋ค.
๋ฐ์ํ ์ ์๋ ๋๋ค๋ฅธ ๋ฌธ์ ์ ์, ์ถ๊ฐ์ ์ธ ์ก๊ธ ๋ฐ์์ ํ์ฌ ๋ณด๊ณ ์๋ ํ๋ฉด์๋ ๊ทธ ๋ฐ์ํ ๋ด์ฉ์ด ๋ฐ์๋์ง๋ ์์ ๊ฒ์ด๋ผ๋ ์ ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ฌ์ฉ์๊ฐ ํ๋ฉด์ ๋ณด๋ฉด์ ๋ค๋ฅธ ๊ธฐ๊ธฐ๋ก ์ก๊ธํ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ง๋ ์์ ๊ฒ์ด๊ณ , ์ก๊ธ ๋ด์ญ ๋ชฉ๋ก ํ์ด์ง์ ๋ค์ ์ ์ํ๋ฉด ๊ทธ๋๋ ์บ์ฑ๋ ๋ด์ฉ์ด ๋ฐ์๋ ๊ฒ์ด๋ฏ๋ก ๊ด์ฐฎ์ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
๋์ผํ ์์ฒญ์ด ์ฌ๋ฌ ๋ฒ ์ ์ก๋๋ ๊ฒฝ์ฐ ์ด๋ป๊ฒ ๋ง์ ์ ์์๊น? (ํต์นญ : ๋ฐ๋ฅ)
ํ์ฌ ์ด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋ฐ๋ฅ์ ๋ํ ์ฒ๋ฆฌ๊ฐ ๋์ด์์ง ์๊ธฐ ๋๋ฌธ์ ๋ชจ์ข ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํด์ ๊ฐ์ ์์ฒญ์ด ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๋ฉด ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์๋ฅผ ๋ค์ด ์ฌ์ฉ์๋ ์ก๊ธ ์์ฒญ์ 1๋ฒ๋ง ๋ณด๋ด๊ณ ์ถ๊ฑฐ๋ ์ถฉ์ ์์ฒญ์ 1๋ฒ๋ง ๋ณด๋ด๊ณ ์ถ์์์๋ ๋ถ๊ตฌํ๊ณ ๋ชจ์ข ์ ์ด์ ๋ก ์ฌ๋ฌ ๋ฒ ๋ฐ์ํ๊ฑฐ๋, ๋๊ตฐ๊ฐ ์ ์์ ์ผ๋ก ์์ฒญ์ ํ๋ค๋ฉด ์ด๋ ์๋น์ค ์ ๋ขฐ์ฑ์ ํฐ ๋ฌธ์ ๊ฐ ์๊ฒจ ์ฌ์ฉ์ ๊ฒฝํ์ ํฐ ์ํฅ์ ๋ฏธ์น ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
์ด๋ฅผ ๋๋นํ๊ธฐ ์ํด LB ๋จ์์ ์ด๋ฅผ ๋ง์ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ง์ฝ AWS๋ฅผ ์ฌ์ฉํ๋ฉด ALB์์ ์ด๋ฌํ ์ค์ ์ ํ ์ ์์ ๊ฒ์ ๋๋ค.
์ก๊ธ ๋ด์ญ ๋ชฉ๋ก์ ๊ฒฝ์ฐ ์ ๋ ฌ์ด ๋ค์ด๊ฐ๋ฏ๋ก ์ธ๋ฑ์ค๊ฐ ํ์๋ก ํ์ํ๋ค๊ณ ์๊ฐํ์ต๋๋ค.
๋ฐ๋ผ์ ์ด๋ฅผ ์ํด index๋ฅผ ๊ฑธ์ด์ผ ํ๋๋ฐ, ์ด๋ค index๋ฅผ ๊ฑธ์ด์ผ ํ ์ง ๊ณ ๋ฏผํ๊ณ ํ๋ณด๊ตฐ์ ๋ค์๊ณผ ๊ฐ์์ต๋๋ค.
(created_date_time, sender_id, id, deleted), (created_date_time, sender_id), (created_date_time, id)
๊ทธ ์ค ์ฒซ๋ฒ์งธ๋ฅผ ํํ์ต๋๋ค. ๊ทธ ์ด์ ๋ ์ปค๋ฒ๋ง ์ธ๋ฑ์ค๋ฅผ ํ์ธ ์ ์์ด ์ฑ๋ฅ์ด ํจ์ฌ ์ข์ ๊ฒ์ด๋ผ ํ๋จํ๊ธฐ ๋๋ฌธ์ ๋๋ค.
๊ทธ๋ฌ๋, ๋ค๋ฅธ ๋์๋ค์ ํ๋ณด์ ์ฌ๋ ธ๋ ์ด์ ๋ ์ธ๋ฑ์ค์ ์ปฌ๋ผ์ด ๋ง์์ง ์๋ก ์ธ๋ฑ์ค ํฌ๊ธฐ๊ฐ ๋์ด๋ ์ฐ๊ธฐ ์ฑ๋ฅ์ ์ข์ง ์์ ์ํฅ์ ๋ฏธ์น ์ ์๊ฒ ๋ค๋ ์๊ฐ์ด ๋ค์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ค๊ณ ์์ผ๋ก๋ ์ก๊ธ ๋ด์ญ ๋ชฉ๋ก์ ๋ํด ์ด๋ฏธ ์บ์ฑ์ ํ ์์ ์ด์๊ธฐ ๋๋ฌธ์ created_date_time๋ฅผ ํฌํจํด ์นด๋๋๋ฆฌํฐ๊ฐ ๋์ sender_id ํน์ id๋ง ๊ฑธ์ด๋ ์ถฉ๋ถํ์ง ์์๊น ํ๋ ์๊ฐ๋ ๋ค์์ต๋๋ค.
+) ํ์ฌ ์ํํธ ๋๋ฆฌํธ๋ฅผ ์ฌ์ฉํ๊ณ ์๊ธฐ ๋๋ฌธ์, ๋ชจ๋ ํ ์ด๋ธ์ (pk, deleted) ํํ๋ก ์ธ๋ฑ์ค๊ฐ ๊ฑธ๋ ค ์์ต๋๋ค.
=== ๊ณผ์ ์ ์ถ ์ดํ ์ถ๊ฐ๋ ๋ด์ฉ ===
redis๋ฅผ ํ์ฉํด์ cache๋ฅผ ์ ์ฉํ ๋, sorted set์ ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ ๊ธฐ์ค์ด ํ์ํ์ต๋๋ค.
์ด๋ ๊ณ ๋ฏผํ๋ ํค๋ pk์ created_date ์ค ์ด๋ค ๊ฒ์ ์ก์์ผ ์ต์ ์์ผ๋ก ์ ๋ ฌํ ์ ์์๊น? ์์ต๋๋ค.
created_date์ ๊ฒฝ์ฐ "์ต์ "์์ ๋ณด์ฅํ ์ ์์ผ๋, ๊ฒฝ์ฐ์ ๋ฐ๋ผ ์ค๋ณต์ด ๋ฐ์ํ ์๋ ์์ ๊ฑฐ๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๋ง์ ํ๋ ์ค๋ณต์ด ๋ฐ์ํด ๊ธฐ๋ก์ด ๋๋ฝ๋์ด ์ ์ฅ๋ ๊ฒฝ์ฐ ์ฌ์ฉ์ ์ ์ฅ์์ ์ค์ํ ์ก๊ธ ๊ธฐ๋ก์ ๋ํด ํ์ธํ ์ ์์ผ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ขฐํ ์ ์๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ ๊ฑฐ๋ผ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
pk์ ๊ฒฝ์ฐ sequence๋ฅผ ์ฌ์ฉํ๊ฑฐ๋, UUID์ ๊ฐ์ด PK๊ฐ ์์๋๋ก ์์ฑ๋์ง ์์ ๊ฒฝ์ฐ๋ก ์ด์ ํ ๊ฒฝ์ฐ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ต๋๋ค.
ํ์ง๋ง, ์บ์์ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฐ์์ ์ธ์ ๋ ์ง ์ ๊ฑฐํ ์ ์์ ๊ฒ์ด๋ผ ํ๋จํ์ฌ pk๋ฅผ score key๋ก ๋์์ต๋๋ค.
๋ง์ฝ ์ก๊ธ ๋ก์ง์ด ์คํจํ๊ฒ ๋๋ฉด ์ก๊ธ ๋ด์ญ์๋ ์ถ๊ฐ๋์ง ์์์ผ ํ๋ฏ๋ก cache์ ์ฌ๋ฆฌ๋ ๋ก์ง์๋ transaction์ ์ ์ฉํ์์ต๋๋ค.
lettuce์ ๊ฒฝ์ฐ transaction์ ์ฌ์ฉํ๊ธฐ ์ํด session callback๊ณผ @Transactional์ ํ์ฉํ ์ ์ด๊ฐ ๊ฐ๋ฅํฉ๋๋ค.
session callback์ ๊ฒฝ์ฐ ๊ตฌํ์ด ๊ฐ๋จํ๋, Spring์ ํธ๋์ญ์ ๊ณผ ๋ฒ์๊ฐ ๋ค๋ฅด๋ค๋ ์ ์ด ๋ฌธ์ ๊ฐ ๋ ์ ์์ ๊ฒ ๊ฐ์์ต๋๋ค.
session callback ๋ก์ง์ ๋ฉ์๋ ๋งจ ๋์ ๋ณด๋ด๋๋ผ๋, ๋ง์ ํ๋ RDBMS timeout ๋ฑ์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ฌ cache์๋ commit์ด ๋๋ db์ ์ ์ฅํ๋ ๋ก์ง์์๋ rollback์ด ์ํ๋๋ ์ํฉ์ด ๋ฐ์ํ ์๋ ์์ ๊ฒ ๊ฐ์ ๋ฌธ์ ๊ฐ ๋ ์ ์๋ค๊ณ ํ๋จํ์ต๋๋ค.
๋ฐ๋ผ์ ํธ๋์ญ์ ์๋ช ์ฃผ๊ธฐ๋ฅผ Spring๊ณผ ๋ง์ถ๊ธฐ ์ํ์ฌ @Transactional์ ์ฌ์ฉํ๋ ํธ์ด ๋ซ๋ค๊ณ ํ๋จํ์ต๋๋ค.
Connection Pool์ ๋ง๋ค์ง ์๋๋ผ๋ ์ปค๋ฅ์ ๊ณต์ ๋ก ์ธํ ํธ๋์ญ์ ๊ฐ์ญ ๋ฌธ์ ๊ฐ ๋ฐ์ํ์ง ์๋์ง?
lettuce๋ connection pool์ default connection ์๊ฐ 1๊ฐ์ ๋๋ค.
๋ํ, spring-data-redis๋ฅผ ๋ณด๋ฉด "Singleton-connection sharing for non-blocking commands"๋ผ๊ณ ํํํ๊ณ ์์ต๋๋ค.
ํธ๋์ญ์ ์ ์ฌ์ฉํ ๋ ๊ฐ์ฅ ์ฃผ์ํด์ผ ํ ์ ์ค ํ๋๋ ํธ๋์ญ์ ์ ์ปค๋ฅ์ ๋น ์ํ๋์ด์ผ ํ๋ค๋ ๊ฒ์ ๋๋ค.
๋ง์ฝ Single-connection sharing ๋ฐฉ์์ด๋ผ๋ฉด ์ก๊ธ ์์ฒญ A๊ฐ ์ํ๋๋ ๋์ค์ ์ก๊ธ ์์ฒญ B๊ฐ ์ํ๋ ๊ฒฝ์ฐ A์ B๊ฐ ์ปค๋ฅ์ ์ ๊ณต์ ํ๊ธฐ ๋๋ฌธ์ ํธ๋์ญ์ ๊ณผ์ ์์ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์์ ๊ฒ์ด๋ผ ํ๋จํ์ต๋๋ค.
๋ช๊ฐ์ง์ ํ์ตํ ์คํธ์, ๊ณต์๋ฌธ์๋ฅผ ์ฐธ๊ณ ํ์ฌ setEnableTransactionSupport ์ต์ ์ ํ์ฉํ๋ฉด ์ปค๋ฅ์ ์ ํธ๋์ญ์ ์ด ๋ฐ์ธ๋ฉ๋ ์ ์์์ ํ์ธํ์ต๋๋ค.
connection pool์ connection์ด 1๊ฐ๋ผ๋ฉด ์ก๊ธ ์์ฒญ์ด ์ฌ๋ฟ ๋ฐ์ํ์ ๋ redis connection์ด block๋๊ธฐ ๋๋ฌธ์ ์ฑ๋ฅ์ ๋ฌธ์ ๊ฐ ๋ ์ ์์๊ฑฐ๋ผ ํ๋จํด connection pool์ ์์์ ๊ฐ 4๋ก ์ค์ ํ์ต๋๋ค.
๋ก๊ทธ ์ ์ฅ / ๋ก๊ทธ Cache์ ์ฐ๊ธฐ ์์ ์ ์คํจํ๋ค๊ณ ํด์ rollback ์ํค๋๊ฒ ๋ง๋์ง?
ํ์ฌ TransactionService์์๋ ๋ก๊ทธ๋ฅผ cache์ ์ฐ๊ธฐ ์์ ์ ์คํจํ๊ฑฐ๋ ๋ก๊ทธ ์ ์ฅ ์์ ์ด ์คํจํ๋ฉด rollback์ ์ํํ๊ณ ์์ต๋๋ค.
ํ์ง๋ง ์ด ๋ ๊ณผ์ ์ ์ค์ ์ก๊ธ์ ๋ํ ์ฃผ์ ๊ด์ฌ์ฌ๊ฐ ์๋๋ผ๊ณ ๋ณผ ์๋ ์์ต๋๋ค.
๊ทธ๋ฌํ ์ฃผ์ ๊ด์ฌ์ฌ๊ฐ ์๋ ๋ก์ง์ด ์คํจํ๋ค๊ณ ํด์ ์ฑ๊ณตํ ์ฃผ์ ๊ด์ฌ์ฌ ๋ก์ง์ ์ํฅ์ ์ฃผ๋ฉด ์ฌ์ฉ์ ์ฌ์ฉ์ฑ์ ์ํฅ์ ์ฃผ๋ ๊ฑด ์๋๊น ํ๋ ์๊ฐ์ด ๋ค์์ต๋๋ค.
๊ทธ๋ฌ๋, ๊ทธ๋๋ก ๋๊ธฐ๋ก ๊ฒฐ์ ํ๋๋ฐ ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
-
๋ง์ผ ์ก๊ธ๊ณผ ๋์์ ์ก๊ธ ๋ชฉ๋ก์ ๋ํด ์กฐํ ์์ฒญํ์ ๊ฒฝ์ฐ, ์ค์ ๋ก๋ ์ก๊ธํ์์๋ ๋ถ๊ตฌํ๊ณ ์ก๊ธ ๋ชฉ๋ก์ ์กฐํํ์ง ๋ชปํ ์๋ ์๋ค.
-
๋ง์ฝ ์ก๊ธ์ ์ฒ๋ฆฌ๋์์๋ ๋ชจ์ข ์ ์ด์ ๋ก ์ก๊ธ ๋ก๊ทธ ์ ์ฅ์ ์คํจํ๋ค๋ฉด, ๊ฑฐ๋ ๊ธฐ๋ก์ ์ ์ฅํด์ผ ํ๋ค๋ ๋ฒ์ ์๋ฐํ ์๋ ์๋ค.
์ ๋ ๋ฌธ์ ์์ ๋ฐ์ํ ์ ์๋ ์ฌ์ฉ์ ๊ด์ ์์์ ์ฌ์ฉ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ขฐ๋๊ฐ ๋ ํด ๊ฒ์ด๋ผ๋ ํ๋จ์ด ๋ค์ด ํ ํธ๋์ญ์ ์ผ๋ก ๋ฌถ๊ธฐ๋ก ๊ฒฐ์ ํ์ต๋๋ค.
- OS : Windows 10 Education
- CPU : Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz 2.90 GHz
- 6 ์ฝ์ด, 12 ์ค๋ ๋
- RAM : 16.0GB
- CPU : Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz 2.90 GHz
์ด ํ๊ฒฝ์ ์ฐธ๊ณ ํด์ min heap / max heap size๋ฅผ 4GB, MySQL container๋ฅผ 4GB๋ก ์ค์ ํ์ต๋๋ค.
- ์๋ฒ์ฉ ์ปดํจํฐ๊ฐ ์๋๊ธฐ ๋๋ฌธ์ ๋๋จธ์ง ์ ๋ฐ์ ๋ค๋ฅธ ํ๋ก์ธ์ค์ ์ฌ์ฉ๋์ด CPU์ RAM ํฌ๊ธฐ๋ฅผ ์ ๋ฐ์ด๋ผ๊ณ ๊ฐ์ ํ์ต๋๋ค.