Skip to content

Latest commit

ย 

History

History
440 lines (324 loc) ยท 26.1 KB

README.md

File metadata and controls

440 lines (324 loc) ยท 26.1 KB

Mini Firfin

์‹คํ–‰ ๋ฐฉ๋ฒ•

  1. docker ์‹คํ–‰
docker-compose up -d
  1. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋นŒ๋“œ
./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
        • ๋กœ๊ทธ์ธํ•œ ์‚ฌ์šฉ์ž๊ฐ€ ์ž์‹ ์˜ ๊ธˆ์•ก์„ ์ถฉ์ „ํ•  ์ˆ˜ ์žˆ๋‹ค.
    • ์„ค๊ณ„/๊ตฌํ˜„/๋ฌธ์„œํ™”์— ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์™€ ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋ฌธ์„œํ™”๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  • ํ•˜๋ฃจ์— ๋ช‡์ฒœ๊ฑด์—์„œ ๋ช‡๋งŒ๊ฑด ์ •๋„๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค.

  • ์‹ค์ œ ํƒ€์ผ“์‚ฌ์šฉ์ž๋Š” ์‚ฌ์šฉ์ž ์ „์ฒด์ด๋‹ค.

  • ๋‹จ์ˆœํ•œ ์ผ€์ด์Šค๊ฐ€ ์•„๋‹ˆ๋ผ, ์‹ค์ œ๋กœ ์‹ฌ๊ฐํ•œ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์ผ€์ด์Šค๋„ ๊ณ ๋ฏผํ•ด์•ผ ํ•œ๋‹ค.

๊ณผ์ œ๊ธฐ๊ฐ„

  • ์ผ์ฃผ์ผ
    • 27์ผ 00 ์‹œ ๊นŒ์ง€ ์ œ์ถœํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ๊ณผ์ œ ์ผ์ •์˜ ์กฐ์ ˆ์ด ํ•„์š”ํ•˜๋ฉด ์—ฐ๋ฝ์ฃผ์‹œ๋ฉด๋ฉ๋‹ˆ๋‹ค.

์š”๊ตฌ์‚ฌํ•ญ

  • ๊ฐœ๋ฐœ์–ธ์–ด๋Š” Java/Kotlin ์ž…๋‹ˆ๋‹ค.
  • ๊ฐ ์œ ์ €๋Š” ํ˜„์žฌ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ธˆ์•ก์„ ์ €์žฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  • ํ˜„์žฌ ์œ ์ €๋Š” ๊ฐ€์ž…์ƒํƒœ๊ฑฐ๋‚˜ ํƒˆํ‡ด์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์œ ์ €๋งˆ๋‹ค ๋ณด์œ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋Œ€ ํ•œ๋„๊ฐ€ ์žˆ๊ณ , ์„œ๋กœ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ•œ๋„๊ฐ€ ๋„˜์„ ๊ฒฝ์šฐ ํ•ด๋‹น ์†ก๊ธˆ์€ ์‹คํŒจํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • DB Schema ๋ฅผ mysql ๊ธฐ์ค€์œผ๋กœ ์ฒจ๋ถ€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค.
  • ์†ก๊ธˆ์˜ ์ทจ์†Œ๋Š” ๋ฐœ์ƒํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž์˜ ์ธ์ฆ ๋ถ€๋ถ„ ์ž์ฒด๋Š” ๋”ฐ๋กœ ๊ณ ๋ คํ•˜์ง€ ์•Š๊ณ  ํŒŒ๋ผ๋ฏธํ„ฐ ์œ ์ € id๋กœ ๋Œ€์ฒดํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ถ€๋ถ„๋“ค์„ ๊ณ ๋ คํ•ด ์ฃผ์„ธ์š”.

  • ์–ด๋–ค ์ƒํ™ฉ์—์„œ๋“  ์ตœ๋Œ€ํ•œ ์‹œ์Šคํ…œ์˜ ์†ก๊ธˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ผ์น˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์‹คํŒจํ•œ๋‹ค๋ฉด ์–ด๋Š ์‹œ์ ์—์„œ ํ‹€์–ด์ง€๋Š”์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • 100% ์™„์„ฑ๋˜์ง€ ์•Š์€ ๊ฒฝ์šฐ, ๊ณ ๋ฏผ๊ฑฐ๋ฆฌ์™€ ์ด์— ๋Œ€ํ•œ ๋ถ€๋ถ„์„ ๋ฌธ์„œ์— ์ž˜ ๋‚จ๊ฒจ์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.
  • ์†ก๊ธˆ๊ณผ ์†ก๊ธˆ๊ธฐ๋ก ๋ถ€๋ถ„์— ์ง‘์ค‘ํ•ด์ฃผ์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

ํ•„์š” ๊ฒฐ๊ณผ๋ฌผ

  • ๋ณธ์ธ์ด ํ•ด๋‹น ํ”„๋กœ์ ํŠธ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์š”์†Œ, ๊ทธ๋ฆฌ๊ณ  ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ•ด๊ฒฐํ• ์ง€์— ๋Œ€ํ•ด์„œ ์ •๋ฆฌํ•œ ๋ฌธ์„œ
  • ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์™€ ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…(๋น„์šฉ์ธก๋ฉด ๋˜๋Š” ์„ฑ๋Šฅ ์ธก๋ฉด๋“ฑ)
  • ๊ตฌํ˜„ ์ฝ”๋“œ

Schema

mini-firfin-diagram

member

์‚ฌ์šฉ์ž ํ…Œ์ด๋ธ”

  • birth_date : ์ƒ๋…„์›”์ผ
  • deleted : ์‚ญ์ œ ์—ฌ๋ถ€
  • created_date_time : ์ƒ์„ฑ ์‹œ๊ฐ„
  • updated_date_time : ์ˆ˜์ • ์‹œ๊ฐ„
  • phone_number : ์ „ํ™”๋ฒˆํ˜ธ
    • ํ”„๋กœ์ ํŠธ ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ๊ตญ์ œ ๋ฒˆํ˜ธ ๋“ฑ์˜ ๊ฒฝ์šฐ๋Š” ์ œ์™ธํ•˜๊ณ  11์ž๋กœ ๊ณ ์ •
    • ํ”„๋กœ์ ํŠธ ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ํ†ต์‹ ์‚ฌ๋Š” ๋”ฐ๋กœ ์ €์žฅํ•˜์ง€ ์•Š์Œ
  • name : ์ด๋ฆ„
    • ๊ตญ๋‚ด์—์„œ ์ด๋ฆ„ ๊ฐ€์žฅ ๊ธด ์‚ฌ๋žŒ (ํ•œ๊ธ€ ๊ธฐ์ค€) : 30์ž
    • ์•ŒํŒŒ๋ฒณ ๊ธฐ์ค€ ๊ฐ€์žฅ ๊ธด ์‚ฌ๋žŒ (์•ŒํŒŒ๋ฒณ ๊ธฐ์ค€) : 747์ž
    • ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‹จ์ˆœํ™”๋ฅผ ์œ„ํ•ด ํ•œ๊ธ€ ๊ธฐ์ค€์œผ๋กœ 30์ž๋กœ ์„ค์ •
  • email : ์ด๋ฉ”์ผ
  • serial_number : ์‚ฌ์šฉ์ž ๊ณ ์œ  ๋ฒˆํ˜ธ

member_money

์‚ฌ์šฉ์ž ์†Œ์ง€๊ธˆ ํ…Œ์ด๋ธ”

  • deleted : ์‚ญ์ œ ์—ฌ๋ถ€
  • created_date_time : ์ƒ์„ฑ ์‹œ๊ฐ„
  • member_id : ์‚ฌ์šฉ์ž id
  • updated_date_time : ์ˆ˜์ • ์‹œ๊ฐ„
  • money_amount : ์†Œ์ง€๊ธˆ
  • money_limit : ์†Œ์ง€๊ธˆ ํ•œ๋„
  • payment_info : ๊ฒฐ์ œ ์ •๋ณด
  • payment_method : ๊ฒฐ์ œ ์ˆ˜๋‹จ

transfer_history

์†ก๊ธˆ ๊ธฐ๋ก ํ…Œ์ด๋ธ”

  • 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 : ์†ก์‹ ์ž ๊ณ ์œ  ๋ฒˆํ˜ธ

recharge_history

์ถฉ์ „ ๊ธฐ๋ก ํ…Œ์ด๋ธ”

  • 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)๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

API

์†ก๊ธˆ API

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                    // ๊ฑฐ๋ž˜ ์„ฑ๊ณต ์œ ๋ฌด
}

์†ก๊ธˆ ๋ชฉ๋ก API

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,                    // ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ์œ„ํ•œ ์ปค์„œ

}

์ถฉ์ „ API

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) ํ˜•ํƒœ๋กœ ์ธ๋ฑ์Šค๊ฐ€ ๊ฑธ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค.

=== ๊ณผ์ œ ์ œ์ถœ ์ดํ›„ ์ถ”๊ฐ€๋œ ๋‚ด์šฉ ===

score๋Š” pk vs date

redis๋ฅผ ํ™œ์šฉํ•ด์„œ cache๋ฅผ ์ ์šฉํ•  ๋•Œ, sorted set์„ ์‚ฌ์šฉํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ •๋ ฌ ๊ธฐ์ค€์ด ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ ๊ณ ๋ฏผํ–ˆ๋˜ ํ‚ค๋Š” pk์™€ created_date ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ์žก์•„์•ผ ์ตœ์‹  ์ˆœ์œผ๋กœ ์ •๋ ฌํ•  ์ˆ˜ ์žˆ์„๊นŒ? ์˜€์Šต๋‹ˆ๋‹ค.

created_date์˜ ๊ฒฝ์šฐ "์ตœ์‹ "์ž„์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์œผ๋‚˜, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•  ์ˆ˜๋„ ์žˆ์„ ๊ฑฐ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๋งŒ์— ํ•˜๋‚˜ ์ค‘๋ณต์ด ๋ฐœ์ƒํ•ด ๊ธฐ๋ก์ด ๋ˆ„๋ฝ๋˜์–ด ์ €์žฅ๋  ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž ์ž…์žฅ์—์„œ ์ค‘์š”ํ•œ ์†ก๊ธˆ ๊ธฐ๋ก์— ๋Œ€ํ•ด ํ™•์ธํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์„ ๊ฑฐ๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

pk์˜ ๊ฒฝ์šฐ sequence๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜, UUID์™€ ๊ฐ™์ด PK๊ฐ€ ์ˆœ์„œ๋Œ€๋กœ ์ƒ์„ฑ๋˜์ง€ ์•Š์„ ๊ฒฝ์šฐ๋กœ ์ด์ „ํ•  ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ, ์บ์‹œ์˜ ๊ฒฝ์šฐ ๋ฌธ์ œ ๋ฐœ์ƒ์‹œ ์–ธ์ œ๋“ ์ง€ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ด๋ผ ํŒ๋‹จํ•˜์—ฌ pk๋ฅผ score key๋กœ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค.

ํŠธ๋žœ์žญ์…˜์€ session callback? @Transactional?

๋งŒ์•ฝ ์†ก๊ธˆ ๋กœ์ง์ด ์‹คํŒจํ•˜๊ฒŒ ๋˜๋ฉด ์†ก๊ธˆ ๋‚ด์—ญ์—๋„ ์ถ”๊ฐ€๋˜์ง€ ์•Š์•„์•ผ ํ•˜๋ฏ€๋กœ 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์„ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด ๋‘ ๊ณผ์ •์€ ์‹ค์ œ ์†ก๊ธˆ์— ๋Œ€ํ•œ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์•„๋‹ˆ๋ผ๊ณ  ๋ณผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌํ•œ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ๊ฐ€ ์•„๋‹Œ ๋กœ์ง์ด ์‹คํŒจํ–ˆ๋‹ค๊ณ  ํ•ด์„œ ์„ฑ๊ณตํ•œ ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ ๋กœ์ง์— ์˜ํ–ฅ์„ ์ฃผ๋ฉด ์‚ฌ์šฉ์ž ์‚ฌ์šฉ์„ฑ์— ์˜ํ–ฅ์„ ์ฃผ๋Š” ๊ฑด ์•„๋‹๊นŒ ํ•˜๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜, ๊ทธ๋Œ€๋กœ ๋‘๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ๋Š”๋ฐ ๊ทธ ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋งŒ์ผ ์†ก๊ธˆ๊ณผ ๋™์‹œ์— ์†ก๊ธˆ ๋ชฉ๋ก์— ๋Œ€ํ•ด ์กฐํšŒ ์š”์ฒญํ–ˆ์„ ๊ฒฝ์šฐ, ์‹ค์ œ๋กœ๋Š” ์†ก๊ธˆํ–ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์†ก๊ธˆ ๋ชฉ๋ก์„ ์กฐํšŒํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

  2. ๋งŒ์•ฝ ์†ก๊ธˆ์€ ์ฒ˜๋ฆฌ๋์Œ์—๋„ ๋ชจ์ข…์˜ ์ด์œ ๋กœ ์†ก๊ธˆ ๋กœ๊ทธ ์ €์žฅ์— ์‹คํŒจํ•œ๋‹ค๋ฉด, ๊ฑฐ๋ž˜ ๊ธฐ๋ก์„ ์ €์žฅํ•ด์•ผ ํ•œ๋‹ค๋Š” ๋ฒ•์„ ์œ„๋ฐ˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค.

์œ„ ๋‘ ๋ฌธ์ œ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์šฉ์ž ๊ด€์ ์—์„œ์˜ ์‚ฌ์šฉ์„ฑ์˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹ ๋ขฐ๋„๊ฐ€ ๋” ํด ๊ฒƒ์ด๋ผ๋Š” ํŒ๋‹จ์ด ๋“ค์–ด ํ•œ ํŠธ๋žœ์žญ์…˜์œผ๋กœ ๋ฌถ๊ธฐ๋กœ ๊ฒฐ์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ž‘์„ฑ ํ™˜๊ฒฝ

  • OS : Windows 10 Education
    • CPU : Intel(R) Core(TM) i5-10400F CPU @ 2.90GHz 2.90 GHz
      • 6 ์ฝ”์–ด, 12 ์Šค๋ ˆ๋“œ
      • RAM : 16.0GB

์ด ํ™˜๊ฒฝ์„ ์ฐธ๊ณ ํ•ด์„œ min heap / max heap size๋ฅผ 4GB, MySQL container๋ฅผ 4GB๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • ์„œ๋ฒ„์šฉ ์ปดํ“จํ„ฐ๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋จธ์ง€ ์ ˆ๋ฐ˜์€ ๋‹ค๋ฅธ ํ”„๋กœ์„ธ์Šค์— ์‚ฌ์šฉ๋˜์–ด CPU์™€ RAM ํฌ๊ธฐ๋ฅผ ์ ˆ๋ฐ˜์ด๋ผ๊ณ  ๊ฐ€์ •ํ–ˆ์Šต๋‹ˆ๋‹ค.