๐ŸŽ‰ Thank You For ___ ! ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์ฐฝ์ž‘์ž๋ฅผ ์‘์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„ํŽธ ๋„๋„ค์ด์…˜ ์„œ๋น„์Šค!

Related tags

Spring Boot 2021-tyf
Overview

2021-tyf

๐ŸŽ Thank you for _ _ _

  • ๋ˆ„๊ตฌ๋‚˜ ์‰ฝ๊ฒŒ ์ฐฝ์ž‘์ž๋ฅผ ์‘์›ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„ํŽธ ๋„๋„ค์ด์…˜ ๋ชจ๋“ˆ ์„œ๋น„์Šค

๐Ÿ’ป ์ปค๋ฐ‹ ๋ฉ”์„ธ์ง€ ์ปจ๋ฒค์…˜

  • ์•ต๊ทค๋Ÿฌ ์ปค๋ฐ‹ ์ปจ๋ฒค์…˜์„ ๋”ฐ๋ฆ…๋‹ˆ๋‹ค.
    • (#[์ด์Šˆ๋ฒˆํ˜ธ]) ์ด์Šˆ ์ œ๋ชฉ
    • feat : ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    • fix : ๋ฒ„๊ทธ ์ˆ˜์ •
    • docs : ๋ฌธ์„œ ๊ด€๋ จ
    • style : ์Šคํƒ€์ผ ๋ณ€๊ฒฝ (ํฌ๋งคํŒ… ์ˆ˜์ •, ๋“ค์—ฌ์“ฐ๊ธฐ ์ถ”๊ฐ€, โ€ฆ)
    • refactor : ์ฝ”๋“œ ๋ฆฌํŒฉํ† ๋ง
    • test : ํ…Œ์ŠคํŠธ ๊ด€๋ จ ์ฝ”๋“œ
    • build : ๋นŒ๋“œ ๊ด€๋ จ ํŒŒ์ผ ์ˆ˜์ •
    • ci : CI ์„ค์ • ํŒŒ์ผ ์ˆ˜์ •
    • perf : ์„ฑ๋Šฅ ๊ฐœ์„ 
    • chore : ๊ทธ ์™ธ ์ž์ž˜ํ•œ ์ˆ˜์ •

Pull Request ์ปจ๋ฒค์…˜

  • [#์ด์Šˆ๋ฒˆํ˜ธ] ์ด์Šˆ์— ๋Œ€ํ•œ ๋‚ด์šฉ
    • ์ด์Šˆ์— ๋Œ€ํ•œ ๋‚ด์šฉ
      • ๊น”๋”ํ•˜๊ฒŒ ์ •๋ฆฌํ•ด์„œ ์“ฐ๊ธฐ (๋ฌธ์žฅํ˜•์‹ ์•„๋‹˜)
    • ๋ผ๋ฒจ ๊ผผ๊ผผํžˆ ๋ถ™ํžˆ๊ธฐ
    • Assignee ํ• ๋‹น ์ž˜ํ•˜๊ธฐ
    • ๊ด€๋ จ ์ด์Šˆ ํ• ๋‹น ์ž˜ํ•˜๊ธฐ

Branch ์ปจ๋ฒค์…˜

  • feature/{feature-name}
  • ๋ณธ์ธ fork ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ์œ„์™€ ๊ฐ™์ด ๋ธŒ๋žœ์น˜๋ฅผ ๋งŒ๋“ค์–ด ์ž‘์—…ํ•œ๋‹ค.
  • ์™„๋ฃŒ๋˜๋ฉด upstream์˜ develop-server develop-client๋กœ pr ์š”์ฒญ
Comments
  • [#326] ํ›„์› ๋ฐ ํ™˜๋ถˆ api ๋ฆฌํŒฉํ† ๋ง ๋ฐ ๊ตฌํ˜„

    [#326] ํ›„์› ๋ฐ ํ™˜๋ถˆ api ๋ฆฌํŒฉํ† ๋ง ๋ฐ ๊ตฌํ˜„

    ํฌ์ธํŠธ ์ถฉ์ „ api ์ ˆ์ฐจ

    /payments/charge/ready

    request: itemId response : merchantUid, itemName, amount, email

    /payments/charge

    request : impUid, merchantUid
    response : point


    ํ›„์› ์ ˆ์ฐจ

    /donations

    request : pageName, point
    response : donationId, name, message, amount, createdAt

    /donations/{donationId}/message

    request : name, message, secret
    response : -

    ํ™˜๋ถˆ์€ ๋‚ด๋ถ€๋กœ์ง๋งŒ ๋ฐ”๋€Œ๊ณ  ์—”๋“œํฌ์ธํŠธ ๋ฐ”๋€ ๊ฒƒ ์—†์Œ


    ๋ณธ์ธ์ด ๋ณด๋‚ธ ํ›„์›์„ ๋‚˜์ค‘์— ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•˜๊ธฐ์œ„ํ•ด์„œ Donation์— DonationType ์ด๋ผ๋Š” enum ํƒ€์ž… ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•ด์ฃผ๊ณ ,
    ํ›„์› ์š”์ฒญ ์‹œ์— 2๊ฐœ์˜ Donation์„ ๊ฐ๊ฐ ๋งŒ๋“ค์–ด์„œ creator์™€ donator๊ฐ€ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” List์— ์ง‘์–ด๋„ฃ์–ด์คฌ์„ ๊ฒฝ์šฐ,
    /donations/{donationId}/message ํ˜ธ์ถœ ์‹œ์— ํ•˜๋‚˜์˜ donationId ๋งŒ ๋“ค์–ด์˜ฌํ…๋ฐ ๋‘ ๋„๋„ค์ด์…˜์˜ Message๋ฅผ ๋‹ค ์—…๋ฐ์ดํŠธ ํ•˜๊ธฐ๊ฐ€ ์• ๋งคํ•œ ๊ฒƒ ๊ฐ™์Œ!
    ํ›„์›์ž๊ฐ€ ๋ณธ์ธ์ด ๋ณด๋‚ธ ํ›„์› ๋ฉ”์„ธ์ง€์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ defaultMessage ์—ฌ๋„ ์ƒ๊ด€์—†๋‹ค๋ฉด ๊ดœ์ฐฎ์ง€๋งŒ... ์•„๋‹ˆ๋ฉด ํ”„๋ก ํŠธํ•œํ…Œ /donations ์ดํ›„์— response ๋กœ donationId๋ฅผ 2๊ฐœ๋ฅผ response ํ•ด์ฃผ๊ณ  message API ์—์„œ 2๊ฐœ์˜ id๋ฅผ ๋ชจ๋‘ ๋ฐ›๋Š” ๋ฐฉ๋ฒ•๋„ ์žˆ๊ธดํ•˜์ง€๋งŒ!


    1. ์ด์ œ ๊ฑฐ์˜ ๋ชจ๋“  API๊ฐ€ ํ† ํฐ์ด ํ•„์š”ํ• ํ…๋ฐ (๋‹ค ์ธ๊ฐ€??) ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์งœ๋Š” ๋‹ด๋‹น์ด ์ด๊ฑฐ path ์ข€ config์— ์ถ”๊ฐ€ํ•ด์ค„๋ ˆ?
    2. Payment ํ™˜๋ถˆ ์‹œ์— ํ™˜๋ถˆ ๊ธฐ๊ฐ„ ์ง€๋‚ฌ๋Š”์ง€์— ๋Œ€ํ•œ ๋กœ์ง์„
      image
      ์ด๊ฑธ๋กœ ์งฐ๋Š”๋ฐ ํ…Œ์ŠคํŠธ ์žŠ์œผ๋ฉด ์•ˆ๋‘!
    3. ์ด์ „์—๋Š” ํ›„์›ํ•˜๋Š” ์ ˆ์ฐจ์—์„œ ๊ฒฐ์ œ๋ฅผ ํ–ˆ์–ด์„œ ๊ทธ๋•Œ ๋ฉ”์ผ์ด ๋ฐœ์†ก๋๋Š”๋ฐ, ํ›„์›์‹œ์—๋Š” ๋ฐœ์†ก์•ˆํ•˜๊ณ  ํฌ์ธํŠธ ์ถฉ์ „ํ•˜๋ฉด ๋ฐœ์†กํ•˜๊ฒŒ๋” ํ•ด๋†จ์–ด
    4. Donation์— ๋“ค์–ด๊ฐ€๋Š” Message ๋กœ์ง์„ ์ข€ ๋ฐ”๊ฟ”๋†จ์–ด! ์ด์ œ defaultName์ด ํ›„์›์ž์˜ nickname์ด๋‹ˆ๊น ์ด ๋ถ€๋ถ„ ๋•Œ๋ฌธ์— ์ƒ์„ฑ์ž๊ฐ€ ๋ฐ”๋€Œ์—ˆ์„๊ฑฐ์•ผ !!

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

    feature server refactor 
    opened by Be-poz 17
  • [#63]Prod-Server์˜ ์„ค์ •ํŒŒ์ผ์„ ์ƒ์„ฑ

    [#63]Prod-Server์˜ ์„ค์ •ํŒŒ์ผ์„ ์ƒ์„ฑ

    ๊ตฌํ˜„์‚ฌํ•ญ

    • prod ํ™˜๊ฒฝ ํ”„๋กœํผํ‹ฐ ์ƒ์„ฑ
    • jasypt์œผ๋กœ ์ค‘์š” ์ •๋ณด ์•”ํ˜ธํ™”
    • ๋ฐฐํฌ ์‰˜ ์Šคํฌ๋ฆฝํŠธ ์ˆ˜์ •
    java -jar -Djasypt.encryptor.password={jasypt ์•”ํ˜ธ} -Dspring.profiles.active=dev
    

    ์ด์Šˆ์‚ฌํ•ญ

    • ์Šคํ”„๋ง ๋ถ€ํŠธ 2.4 ๋ณ€๊ฒฝ์‚ฌํ•ญ ์œผ๋กœ include๋กœ ํ”„๋กœํผํ‹ฐ๊ฐ€ ์•ˆ ๋ถˆ๋Ÿฌ์™€์ง€๋Š” ์ด์Šˆ
    • ์•„๋ž˜ ์„ค์ •์„ ์ถ”๊ฐ€ํ•˜๋ฉด ์ •์ƒ๋™์ž‘
    config:
        use-legacy-processing: true
    
    • ์–ดํ”Œ๋ฆฌ์ผ€์ด์…˜ ํ”„๋กœํผํ‹ฐ ์ˆ˜์ •๋ฌธ์ œ๋Š” ์ƒ์˜ ํ›„ ์ด์Šˆ๋ฅผ ์ƒˆ๋กœ ์ƒ์„ฑํ•ด์„œ ์ฒ˜๋ฆฌํ•˜๋ฉด ์ข‹์„๋“ฏ

    ์ฐธ๊ณ 

    • ์Šคํ”„๋ง ๋ถ€ํŠธ 2.4 ํ”„๋กœํ•„ ๊ด€๋ จ
      • https://github.com/kwon37xi/research-spring-boot-2.4
    feature server 
    opened by DWL5 15
  • feat(server): ๋ฉ”์ผ์ „์†ก์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    feat(server): ๋ฉ”์ผ์ „์†ก์„ ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.

    ๋ฉ”์ผ์ „์†ก ๋น„๋™๊ธฐ๋กœ ์ฒ˜๋ฆฌํ•˜๋„๋ก Async ์ถ”๊ฐ€ํ–ˆ์–ด! Async์„ค์ •์„ ํ•ด์ฃผ๋Š” ๋ถ€๋ถ„์ด ์žˆ๋Š”๋ฐ, ์ด ๋ถ€๋ถ„์„ ์ผ๋‹จ ์ž„์˜๋กœ ์„ค์ •ํ–ˆ์–ด! ์šฐ๋ฆฌ ์„œ๋น„์Šค๊ฐ€ ์•„์ง ๊ทธ๋ ‡๊ฒŒ ๋งŽ์€ ์š”์ฒญ์ด ๋“ค์–ด์˜ค์ง€ ์•Š์•„์„œ ์ž‘๊ฒŒ ์žก์•„๋ดค์–ด!

    ๋น„๋™๊ธฐ ํ…Œ์ŠคํŠธ๋ฅผ ์–ด๋–ป๊ฒŒ ํ• ์ง€ ๋ชฐ๋ผ์„œ ์ผ๋‹จ ์ง์ ‘ํ•ด๋ณด๋Š” ์‹์œผ๋กœ ์ง„ํ–‰ํ–ˆ๋Š”๋ฐ, ๊ฐœ์„  ๋œ ๊ฒƒ ํ™•์ธํ–ˆ์–ด! ๋ฉ”์ผ ์ „๋‹ฌ ๋‚ด์šฉ์—๋„ ๋ฌธ์ œ๊ฐ€ ์—†๋”๋ผ๊ตฌ!

    PR์˜ฌ๋ ค๋ณผ๊ฒŒ!

    ๋ณ€๊ฒฝ์‚ฌํ•ญ

    • AsyncConfig ์ถ”๊ฐ€ ๋ฐ ๋ฉ”์ผ์ „์†ก ๋ฉ”์†Œ๋“œ์— @async ์ถ”๊ฐ€

      • CorePoolSize : ๊ธฐ๋ณธ์ ์œผ๋กœ ์‹คํ–‰์„ ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋Š” Thread์˜ ๊ฐœ์ˆ˜
      • MaxPoolSize : ๋™์‹œ ๋™์ž‘ํ•˜๋Š”, ์ตœ๋Œ€ Thread ๊ฐœ์ˆ˜
      • QueueCapacity : CorePoolSize๋ฅผ ์ดˆ๊ณผํ•˜๋Š” ์š”์ฒญ์ด Thread ์ƒ์„ฑ ์š”์ฒญ์‹œ ํ•ด๋‹น ๋‚ด์šฉ์„ Queue์— ์ €์žฅํ•˜๊ฒŒ ๋˜๊ณ , ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Thread ์—ฌ์œ  ์ž๋ฆฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ•˜๋‚˜์”ฉ ๊บผ๋‚ด์„œ ๋™์ž‘
      • ThreadNamePrefix : Spring์ด ์ƒ์„ฑํ•˜๋Š” ์“ฐ๋ ˆ๋“œ์˜ ์ ‘๋‘์‚ฌ๋ฅผ ์ง€์ •
      • ์ฐธ๊ณ 
    • PaymentInfo NoArgsContructor ์ถ”๊ฐ€

      • ์ด์ œ dev ์„œ๋ฒ„ DB๊ฐ€ h2๊ฐ€ ์•„๋‹ˆ๋ผ์„œ ๋กœ์ปฌ์—์„œ ๋Œ๋ฆฌ๊ธฐ๊ฐ€ ํž˜๋“ค์—ˆ์œผ..
      • ๊ทธ๋ž˜์„œ Performance ํ™˜๊ฒฝ์œผ๋กœ ๋Œ๋ ค์„œ ํ…Œ์ŠคํŠธ ํ•ด๋ณด์•˜๋Š”๋ฐ, Mock ๊ฒฐ์ œ ๋ชจ๋“ˆ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋„์ค‘ PaymentInfo๋ฅผ ํŒŒ์‹ฑํ•˜์ง€ ๋ชปํ•˜๋Š” ์—๋Ÿฌ ๋ฐœ์ƒํ•ด์„œ ์ถ”๊ฐ€ํ•ด์คฌ์–ด!
    • index.html

      • ๋ณ€๊ฒฝ๋œ ๊ฒฐ์ œ ๋กœ์ง์— ๋งž์ถฐ์„œ ์ˆ˜์ •ํ•ด๋†จ์–ด!

    ps. ์ถ”๊ฐ€๋กœ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์—์„œ ๋‹ค๋ฅธ Async ์„ค์ •์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ๋Š” ์–ด๋–ป๊ฒŒ ํ• ๊นŒ ์ฐพ์•„๋ดค๋Š”๋ฐ ์ด๋•Œ๋Š” @Overide๋ง๊ณ  @Qualifier๋ฅผ ์„ ์–ธํ•ด์„œ ์‚ฌ์šฉํ•œ๋Œ€!

    feature server refactor 
    opened by DWL5 8
  • feat(client): ์ •์‚ฐ ์ˆ˜์ˆ˜๋ฃŒ ํŽ˜์ด์ง€ ๋งˆํฌ์—…

    feat(client): ์ •์‚ฐ ์ˆ˜์ˆ˜๋ฃŒ ํŽ˜์ด์ง€ ๋งˆํฌ์—…

    1. ์ •์‚ฐ ์ˆ˜์ˆ˜๋ฃŒ ํŽ˜์ด์ง€์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ”์ธํŽ˜์ด์ง€์˜ ํ”Œ๋กœํŒ…๋ฒ„ํŠผ์„ ํ•˜๋‚˜ ๋งŒ๋“ค์—ˆ์–ด
    • ๋ฐ์Šคํฌํƒ‘ ํ•ด์ƒ๋„์—์„œ๋Š” innerTemplate์„ ๋ฒ—์–ด๋‚˜์„œ ๋ฐฐ์น˜๋ฅผ ํ•ด์•ผ๋ผ์„œ, ์—ฌ๋ฐฑ ๋•Œ๋ฌธ์— fixed ์ฒ˜๋ฆฌํ–ˆ๊ตฌ image

    • ๊ทธ ์ดํ•˜ ํ•ด์ƒ๋„์—์„œ๋Š” sticky๋กœ footer๋ฅผ ์•ˆ๊ฐ€๋ฆฌ๋„๋ก ์ฒ˜๋ฆฌํ–ˆ์–ด image

    1. footer์— ๋งํฌ๋ฅผ ์ถ”๊ฐ€ํ•ด์„œ ๋‹ค๋ฅธ ํŽ˜์ด์ง€์—์„œ๋Š” ์ด ๋งํฌ๋กœ ์ ‘๊ทผ๊ฐ€๋Šฅ image

    2. ์ •์‚ฐ ์ˆ˜์ˆ˜๋ฃŒ ํŽ˜์ด์ง€ image

    client 
    opened by jho2301 8
  • [#335] ํŽ˜์ด๋จผ์ธ  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, (Service, Controller) ์Šฌ๋ผ์ด์‹ฑ ํ…Œ์ŠคํŠธ ์ˆ˜์ • ๋ฐ ๋ณด์™„

    [#335] ํŽ˜์ด๋จผ์ธ  ๋‹จ์œ„ ํ…Œ์ŠคํŠธ, (Service, Controller) ์Šฌ๋ผ์ด์‹ฑ ํ…Œ์ŠคํŠธ ์ˆ˜์ • ๋ฐ ๋ณด์™„

    ๊ณ ๋ฏผํ•  ์ 

    Payment ๋ถ€๋ถ„

    • ํ•„๋“œ๋กœ member๋ฅผ ๊ฐ€์ง€๋Š”๋ฐ, ์ด์ „์— Donation์˜ ๊ฒฝ์šฐ ์ƒ์„ฑ์ž ํŒŒ๋ผ๋ฏธํ„ฐ๋กœ member๋ฅผ ๋ฐ”๋กœ ์ „๋‹ฌํ•˜์ง€ ์•Š๊ณ , ์ผ๋‹จ member๊ฐ€ null์ธ Donation์„ ์ƒ์„ฑํ•˜๊ณ  ์ดํ›„์— donation.to(member) ๋กœ Donation์˜ member๋ฅผ ์ง€์ •ํ•œ๋‹ค.
    • ์ˆ˜์š”์ผ ์ฝ”๋“œ ํ•ฉ์น˜๊ธฐ ์ง„ํ–‰ํ•  ๋•Œ, Payment ๋˜ํ•œ payment.to(member) ์ฝ”๋“œ๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์ผ๋‹จ์€ .to(member)๋ฅผ ํ•˜๋Š” ๋ฐฉํ–ฅ์œผ๋กœ ๋ณ€๊ฒฝํ•˜์˜€์Œ
    • ๋Œ€์‹  .to(...) ๋ฉ”์„œ๋“œ์˜ ๊ฒฝ์šฐ payment์˜ member ํ•„๋“œ์™€ email ํ•„๋“œ(Embedded type)๋ฅผ ๋‘˜ ๋‹ค ์ดˆ๊ธฐํ™”ํ•˜๋„๋ก ํ•˜์˜€๋‹ค.

    PaymentPendingReqeust

    28E7A520-B18B-4A0B-8DD9-A04909E5DE2A

    • itemId ๋ฅผ Item์˜ ๊ฐ ์ƒ์ˆ˜๊ฐ’ ์ด๋ผ๊ณ  ๋ณด๋ฉด ๋˜๋Š”๊ฑด์ง€? ์•„๋‹ˆ๋ฉด ๋ณ„๊ฐœ์˜ ๊ฒƒ์œผ๋กœ ๋ณด๋ฉด ๋˜๋Š”๊ฑฐ์ง€? โ€”> ์ด ๋ถ€๋ถ„ ๋ฐฑ์—”๋“œ ์ธก์€ enum๊ณผ ๋™์ผํ•œ value๋ฅผ ์ฃผ๋ฉด๋˜๊ฒ ๋„ค~ ๋ผ๊ณ  ํ–ˆ๋Š”๋ฐ ํŒŒ๋…ธ๊ฐ€ ์™„์ „ ๋ณ„๊ฐœ์˜ ๊ฐ’์„ ์ฃผ๋Š”๊ฒŒ ๋” ์•ˆ์ „ํ•˜์ง€ ์•Š์„๊นŒ? ๋ผ๋Š” ์˜๊ฒฌ์„ ์คฌ๋˜๊ฑฐ ๊ฐ™์Œ.
    • ์ด๋ถ€๋ถ„ ํ™•์‹คํ•˜๊ฒŒ ์ •ํ•ด์ง„๊ฒŒ ์—†๋Š”๊ฑฐ ๊ฐ™์•„์„œ ์ž„์‹œ์ ์œผ๋กœ enum์— ์ผ์น˜์‹œํ‚ค๋Š” ๊ฒƒ์œผ๋กœ ํ•จ

    Payment API ํšŒ์˜๋ก์— ์•„๋ž˜์™€ ๊ฐ™์ด ์ ํ˜€์žˆ๊ธฐ๋Š” ํ•จ

    34B26DD8-C6D6-4B5E-B099-8DFE82317E3C

    MockTimeEntity (@CreateAt ํ•„๋“œ ๊ฐ’์„ ํ•„์š”๋กœํ•˜๋Š” ํ…Œ์ŠคํŠธ ์šฉ)

    ๊ฐœ์ธ์ทจํ–ฅ JPA ์‚ฌ์šฉ๊ธฐ 2ํŽธ โ€” Entity with Getter,Setter and Test | by Gemini Kim | Medium ๋‚ด์šฉ ์ฐธ๊ณ ํ•ด์„œ MockTimeEntity ํด๋ž˜์Šค๋ฅผ ์ƒ์„ฑํ•จ

    • protected ํ•„๋“œ์— ์ ‘๊ทผ ๋ชปํ•œ๋‹ค๊ณ  ์—๋Ÿฌ ๋œธ

    MockTimeEntity class

    public class MockTimeEntity extends BaseTimeEntity {
    
        public static <T extends BaseTimeEntity> T mock(Class<T> clazz, LocalDateTime localDateTime) {
            try {
                T mock = clazz.getDeclaredConstructor().newInstance();
                mock.createdAt = localDateTime; // /todo: ์ด ๋ถ€๋ถ„ protected๋ฉด ์ ‘๊ทผ์ด ๋ผ์•ผํ•˜๋Š”๋ฐโ€ฆ ์™œ ์•ˆ๋ ๊นŒโ€ฆ? (์ž„์‹œ๋กœ public)์œผ๋กœ ๋‘ /
    return mock;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
        }
    
    }
    

    ์—๋Ÿฌ ๋‚ด์šฉ

    45E1EB4B-64CD-4872-A7F3-F2E1306B6126

    ๋ณ€๊ฒฝ๋‚ด์šฉ

    Item Enum ์• ๋„ˆํ…Œ์ด์…˜์œผ๋กœ Custom Validator ๋งŒ๋“ค๊ธฐ

    ์ฐธ๊ณ ์ž๋ฃŒ: Annotation์œผ๋กœ Enum ๊ฒ€์ฆํ•˜๊ธฐ

    Payment- util ํŒจํ‚ค์ง€์— Enum ์–ด๋…ธํ…Œ์ด์…˜, ItemValidator ํด๋ž˜์Šค ์ฐธ์กฐ! ์‚ฌ์šฉํ•œ ์œ„์น˜: PaymentPendingRequest (์š”์ฒญ ํ•„๋“œ๊ฐ€ ๋งŽ์ด ๋ฐ”๋€Œ์—ˆ๋Š”๋ฐ, ํ•ด๋‹น ํ•„๋“œ์— ๋Œ€ํ•œ ์—๋Ÿฌ๋ฅผ BindingResult์— ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด CustomValidator ๊ตฌํ˜„ <- ๊ธฐ์กด ๋ฐฉ์‹) 194A60E4-5404-42EC-8BDC-916D7BB0448C

    PaymentInfo์˜ ํ•„๋“œ ๊ฐ’ ๋ณ€๊ฒฝ

    ๊ธฐ์กด์—๋Š” ์•„์ž„ํฌํŠธ๊ฐ€ ์ €์žฅํ•˜๊ณ  ์ „๋‹ฌํ•˜๋Š” ๊ฒฐ์ œ ๊ฒฐ๊ณผ ์ค‘ name ํ•„๋“œ๋ฅผ ์šฐ๋ฆฌ ์„œ๋น„์Šค์—์„œ๋Š” pageName์œผ๋กœ ์ €์žฅํ–ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ์˜ ์„œ๋น„์Šค๊ฐ€ ๋ณ€๊ฒฝ๋๊ธฐ ๋•Œ๋ฌธ์—โ€ฆ pageName ๋ณด๋‹ค๋Š” itemName (or itemCodeโ€ฆ etc)์ด ๋” ์ ์ ˆํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์—ฌ, ๋ณ€๊ฒฝํ•จ.
    10E76A8A-44E6-4D6E-AA02-76FE077E46CF

    Payment ๊ด€๋ จ API๋“ค ์ธํ„ฐ์…‰ํ„ฐ ๋“ฑ๋ก

    • /payments/** ์ธํ„ฐ์…‰ํ„ฐ์— ๋“ฑ๋กํ•˜์˜€์Œ
    • ์ด ๋ถ€๋ถ„์€ ์ˆ˜๋ฆฌ๋„ ๋™์ผํ•œ ์ž‘์—…์„ ํ•œ ๊ฒƒ ๊ฐ™์€๋ฐ.... ๐Ÿค” ์ถฉ๋Œ๋‚  ์ˆ˜๋„ ์žˆ์„๋“ฏ.. ๐Ÿฅฒ

    closed 335

    server test 
    opened by Rok93 8
  • [#229] ํ™˜๋ถˆ ํ”„๋กœ์„ธ์Šค

    [#229] ํ™˜๋ถˆ ํ”„๋กœ์„ธ์Šค

    ํ™˜๋ถˆ ๊ด€๋ จ ์ธ์ˆ˜ํ…Œ์ŠคํŠธ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์–ด๋ ค์›€์ด ์žˆ์–ด์„œ, ๋ฆฌ๋ทฐ๋ฅผ ๋จผ์ € ๋ฐ›์œผ๋ ค๊ณ ํ•ฉ๋‹ˆ๋‹ค.

    PaymentAcceptanceTest ์— ์ฃผ์„์œผ๋กœ ๊ฐ ํ…Œ์ŠคํŠธ์— ๋Œ€ํ•œ ๋ฌธ์ œ์ ์„ ๊ฐ„๋žตํžˆ ์ ์–ด๋†จ์œผ๋‹ˆ ๊ฐ™์ด ์ฐธ๊ณ ํ•ด์ฃผ์‹œ๋ฉด ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    ๋ฌธ์ œ์ƒํ™ฉ

    ํ…Œ์ŠคํŠธ๋ฅผ ํ•  ๋ฐฉ๋ฒ•์„ ์ œ์‹œ์ข€ ๋ถ€ํƒ๋“œ๋ฆฝ๋‹ˆ๋‹ค ๐Ÿ™

    1. refundVerificationNotExistRemainTryCount
      • 10๋ฒˆ์˜ ์‹œ๋„ํšŸ์ˆ˜๋ฅผ ์ฐจ๊ฐ์‹œ์ผœ์„œ 0์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ• (์ด ๋ฐฉ์‹๋„ ์ ์šฉ์ด ์•ˆ๋Œ, refundFailure๊ฐ€ ๋งค๋ฒˆ ์ดˆ๊ธฐํ™”๋˜๋Š” ๊ฒƒ ๊ฐ™์Œ..)
      • ์ด ๋ถ€๋ถ„์€ ๋กœ์ง์˜ ๋ฌธ์ œ์ธ์ง€ ํšŸ์ˆ˜๊ฐ€ ์ฐจ๊ฐ์ด ์•ˆ๋Œ... (10๋ฒˆ ๋ฐ˜๋ณตํ•˜๋ฉด, 10์œผ๋กœ ์ดˆ๊ธฐํ™” ๋œ ๋’ค, 1์”ฉ ์ฐจ๊ฐํ•˜์—ฌ 9๋ผ๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ด)
      • ์• ์ดˆ์— 10๋ฒˆ์ด๋ผ๊ณ ํ•ด์„œ for๋ฌธ์œผ๋กœ 10๋ฒˆ ์ธ์ฆ์„ ๋ฐ˜๋ณตํ•˜๋Š” ํ–‰์œ„๋„ ์ข‹์€ ๋ฐฉ์‹์€ ์•„๋‹Œ ๊ฒƒ ๊ฐ™์Œ.
    2. refundPaymentCreatorNotHaveEnoughPoint
      • ์˜ˆ์™ธ 1: Member๊ฐ€ ๊ฐ€์ง„ Point๊ฐ€ donation ๊ธˆ์•ก๋ณด๋‹ค ์ ์œผ๋ฉด ์˜ˆ์™ธ!
      • paymentService#refundPayment์˜ ์˜ˆ์™ธ1 ๋ถ€๋ถ„, ์ด ๊ฒฝ์šฐ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผํ• ๊นŒ ?
      • member์˜ point๋ฅผ ์ฐจ๊ฐ์‹œํ‚ฌ ๋ฐฉ๋ฒ•์ด ์—†์„๊นŒ?
    3. refundPaymentNotMatchingRefundInfo
      • ์•„์ž„ํฌํŠธ์—์„œ ์กฐํšŒํ•œ ๊ฒฐ์ œ ์ •๋ณด์™€ ์šฐ๋ฆฌ ์„œ๋ฒ„์— ์ €์žฅ๋œ ์ •๋ณด๊ฐ€ ์ผ์น˜ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์˜ˆ์™ธ!
      • ํ˜„์žฌ AcceptanceTest์—์„œ @BeforeEach๋กœ mocking์„ ํ†ตํ•ด ์•„์ž„ํฌํŠธ์—์„œ ์กฐํšŒํ•œ ์ •๋ณด๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ ์žˆ์Œ. (๋ถ€๋ถ„ ๋ชจํ‚น์„ ํ•˜๋ ค๋ฉด ํ•ด๋‹น ๋ถ€๋ถ„์—์„œ ์ง„ํ–‰ํ•ด์•ผํ•œ๋‹ค)

    ๊ทธ ์™ธ

    PaymentAcceptanceTest ํด๋ž˜์Šค ํ•˜๋‹จ์— ๋ณด๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ private ๋ฉ”์„œ๋“œ๊ฐ€ ์žˆ์Œ.

    image

    ์ด ๊ฒฝ์šฐ repository๋ฅผ ๋ชจํ‚นํ•ด์•ผํ•ด์„œ, ๋ถ€๋“์ดํ•˜๊ฒŒ public static ํ˜•์‹์œผ๋กœ ๋งŒ๋“ค ์ˆ˜๊ฐ€ ์—†์–ด ์ผ๋‹จ private ๋ฉ”์„œ๋“œ๋กœ ๋งŒ๋“ค์—ˆ๋Š”๋ฐ, ์ด๋ ‡๊ฒŒ ์ง„ํ–‰์„ ํ•ด๋„ ๊ดœ์ฐฎ์€์ง€? ์˜๊ฒฌ์„ ์ฃผ์…จ์œผ๋ฉด ํ•ฉ๋‹ˆ๋‹ค.

    ํ˜น์‹œ๋‚˜ ์™œ public static ์–˜๊ธฐ๊ฐ€ ๋‚˜์™”๋Š”์ง€ ๊ถ๊ธˆํ•ดํ• ๊นŒ๋ด ์•„๋ž˜์— ์‚ฌ์ง„ ์ฒจ๋ถ€!

    image

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

    ์‹œ๊ฐ„ ๋˜์‹ค ๋•Œ, ํ”ผ๋“œ๋ฐฑ์ข€ ๋ถ€ํƒ๋“œ๋ ค์š” ๐Ÿ˜…

    feature server 
    opened by Rok93 7
  • [#199, #198] ํ™˜๋ถˆ API ์ž‘์„ฑ, Payment ๋„๋ฉ”์ธ ์ˆ˜์ •

    [#199, #198] ํ™˜๋ถˆ API ์ž‘์„ฑ, Payment ๋„๋ฉ”์ธ ์ˆ˜์ •

    ์•„๋ž˜๋Š” ์•„์ž„ํฌํŠธ ํ™˜๋ถˆ ํ”Œ๋กœ์šฐ์•ผ.

    แ„‰แ…ณแ„แ…ณแ„…แ…ตแ†ซแ„‰แ…ฃแ†บ 2021-07-29 แ„‹แ…ฉแ„’แ…ฎ 7 33 40
    1. ํด๋ผ์ด์–ธํŠธ์—์„œ ์šฐ๋ฆฌ ์„œ๋ฒ„๋กœ ํ™˜๋ถˆ์š”์ฒญ์„ ํ•ด.
      • ์ด๋•Œ imp_id, merchant_uid, ํ™˜๋ถˆ์‚ฌ์œ , ํ™˜๋ถˆ๊ธˆ์•ก ๋“ฑ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š”๋ฐ ์ง€๊ธˆ์€ merchantUid๋งŒ ๋ฐ›๋„๋ก ํ–ˆ์–ด.
      • ์˜์ˆ˜์ฆ์— imp_id ๋ฐ–์— ์—†์–ด์„œ merchant_uid๋ฅผ ํ›„์›์ž๊ฐ€ ์•Œ ์ˆ˜ ์—†๋‹ค๋ฉด imp_id๋กœ ๋ณ€๊ฒฝํ•  ์ˆ˜๋„ ์žˆ์–ด. ์•„์ž„ํฌํŠธ์— ํ™˜๋ถˆAPI ์  ๋•Œ๋Š” merchant_uid, imp_id ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์ค˜๋„ ์ž˜ ๋™์ž‘ํ•ด.
    2. DB์—์„œ ๊ฒฐ์ œ ์ •๋ณด ์กฐํšŒ.
      • ๊ทธ๋ฆผ์—์„  2๋ฒˆ์ด ์ธ์ฆ ํ† ํฐ ๋ฐœ๊ธ‰์ธ๋ฐ ์ฝ”๋“œ์ƒ์—์„  3๋ฒˆ์˜ ๊ฒฐ์ œ ์ •๋ณด ์กฐํšŒ๋ฅผ ๋จผ์ €ํ–ˆ์–ด.
    3. ์ธ์ฆํ† ํฐ ๋ฐœ๊ธ‰.
    4. ์•„์ž„ํฌํŠธ์— ํ™˜๋ถˆ ์š”์ฒญ
    5. ํ™˜๋ถˆ๊ฒฐ๊ณผ ๋™๊ธฐํ™”
      • ๊ฒฐ์ œ ์„ฑ๊ณต ๋กœ์ง๊ณผ ๋น„์Šทํ•˜๊ฒŒ ์ž‘์„ฑํ–ˆ์–ด.
    6. ํ™˜๋ถˆ์‘๋‹ต
      • ์ง€๊ธˆ์€ merchant_uid๋งŒ ์‘๋‹ต์ค‘.

    PaymentSaveResponse -> PaymentPendingResponse Save๋ณด๋‹จ Pending์ด ์ ์ ˆํ•œ๊ฒƒ ๊ฐ™์•„์„œ ์ด๋ฆ„์„ ๋ฐ”๊ฟ”๋ดค์–ด.

    feature server 
    opened by Joyykim 6
  • fix(server): ์ €์žฅ fileName ๋ฐ path ๋ณ€๊ฒฝ

    fix(server): ์ €์žฅ fileName ๋ฐ path ๋ณ€๊ฒฝ

    close #508

    as is: users/{memberId}/profiles or bankbook

    to be: users/profiles or bankbook/{hashedInfo}

    image image

    ๋ฆฌ๋ˆ…์Šค ๋””๋ ‰ํ† ๋ฆฌ ๊ฐœ์ˆ˜ ์ œํ•œ

    ํ•ด์‹ฑ์€ ๋ณ„๋„์˜ ํ•ด์‹ฑ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์จ์•ผํ•˜๋‚˜ ์‹ถ์—ˆ๋Š”๋ฐ, ๊ฐœ์ธ์ •๋ณด ์ €์žฅํ•  ๋•Œ์— AES๋กœ ์ผ๊ธธ๋ ˆ ๊ทธ๋ƒฅ ์ด๊ฑฐ ๊ฐ€์ ธ๋‹ค๊ฐ€ ์”€
    ์ฐธ๊ณ ํ•œ ๋งํฌ

    server refactor 
    opened by Be-poz 4
  • feat(server) : ์ •์‚ฐ๊ธˆ์•ก์„ ๊ณ„์‚ฐํ•ด์„œ ๊ฐฑ์‹ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์Šค์ผ€์ค„๋Ÿฌ์— ๋“ฑ๋กํ•œ๋‹ค. (#439)

    feat(server) : ์ •์‚ฐ๊ธˆ์•ก์„ ๊ณ„์‚ฐํ•ด์„œ ๊ฐฑ์‹ ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ์Šค์ผ€์ค„๋Ÿฌ์— ๋“ฑ๋กํ•œ๋‹ค. (#439)

    • ๋งค์›” 1์ผ 00:00์‹œ์— ์Šค์ผ€์ค„๋Ÿฌ๋ฅผ ๋“ฑ๋ก
    • ์ •์‚ฐ ๊ธˆ์•ก์„ ๊ณ„์‚ฐํ•˜๋Š” SQL์ถ”๊ฐ€
    • AdminService์— calculateExchangeAmount์— ํ•ด๋‹น ๋กœ์ง์ด ๋“ค์–ด์žˆ์Œ!

    ์ œ์•ˆ

    • MemberService์˜ exchange()๋ฅผ requestExchange๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ์–ด๋–ค์ง€,,

    close #440

    feature server 
    opened by DWL5 3
  • refactor(server): Donation Status๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค

    refactor(server): Donation Status๋ฅผ ๋ณ€๊ฒฝํ•œ๋‹ค

    ์ž‘์—…๋‚ด์šฉ

    • DonationStatus ๋ฅผ ๊ธฐ์กด 4๊ฐœ(โ€˜ํ™˜๋ถˆ๊ฐ€๋Šฅโ€™, โ€˜์ •์‚ฐ๊ฐ€๋Šฅโ€™, โ€˜์ •์‚ฐ์™„๋ฃŒโ€™, โ€˜์ทจ์†Œ๋จโ€™)์—์„œ 2๊ฐœ๋กœ (WAITING_FOR_EXCHANGE, EXCHANGED) ๋ณ€๊ฒฝ
    • Donation์˜ DonationStatus๋ฅผ CANCELLED, EXCHANGEABLE๋กœ ๋ณ€๊ฒฝํ•˜๋Š” ๊ธฐ๋Šฅ
    • Donation.toCancelled() , Donation.toExchangeable() ๊ธฐ๋Šฅ ์ œ๊ฑฐ
      • ๊ด€๋ จ ํ…Œ์ŠคํŠธ๋„ ๋ชจ๋‘ ์‚ญ์ œ
    • Donation์„ ์ฒ˜์Œ ์ƒ์„ฑํ–ˆ์„ ๋•Œ ์ฒ˜์Œ DonationStatus๋ฅผ WAITING_FOR_EXCHANGE๋กœ ์ดˆ๊ธฐํ™”
    • ๊ณต๊ฐœ ๋„๋„ค์ด์…˜
      • findFirst5ByMemberAndStatusNotOrderByCreatedAtDesc() ๊ธฐ๋Šฅ status๋กœ ํ•„ํ„ฐ๋งํ•˜์ง€ ์•Š๋„๋ก ๋ณ€๊ฒฝ
    • DonationRepositoryTest์— ๋ถˆํ•„์š”ํ•œ PaymentRepository ํ•„๋“œ ์ œ๊ฑฐ

    ๊ณ ๋ฏผ๋˜๋Š” ๋ถ€๋ถ„

    DonationRepositoryImpl ํด๋ž˜์Šค

    ๋ณ€๊ฒฝ์ „

    BE823B94-70A6-4DFA-B0F0-208747378469

    DonationStatus๊ฐ€ 2๊ฐœ๋กœ ๋ณ€๊ฒฝ๋˜๋ฉด์„œ QueryDsl๋กœ ์ž‘์„ฑํ•œ exchangeablePoint ์™€ currentPoint ๊ฐ€ ๋™์ผํ•œ ๋กœ์ง์œผ๋กœ ๋ณด์ž„

    ๋ณ€๊ฒฝํ›„

    D3344F5C-80B3-48D3-A91B-4324C9EB0875

    • currentPoint์˜ ์˜๋ฏธ๋Š” ์ •์‚ฐ ๊ฐ€๋Šฅ + ์ •์‚ฐ ๋ถˆ๊ฐ€ ๋ฅผ ํ•ฉํ•œ ์ด ํฌ์ธํŠธ
      • But ์ •์‚ฐ ๋ถˆ๊ฐ€๋Šฅํ•œ ํฌ์ธํŠธ๋Š” ์—†๋‹ค.
      • currentPoint ๊ธฐ๋Šฅ์€ ์—†์–ด์ ธ์•ผํ•  ๊ฒƒ ๊ฐ™์Œ. (ํ…Œ์ŠคํŠธ๋„ ๊ฐ™์ด)
      • ์ผ๋‹จ์€ ์•ˆ ์ง€์šฐ๊ณ  ๊ทธ๋Œ€๋กœ ๋’€๋Š”๋ฐโ€ฆ ํ˜น์‹œ๋‚˜ ์ง€์šฐ๋ฉด ์•ˆ๋ ๊นŒ๋ด ์ผ๋‹จ ๋’€๋Š”๋ฐ ์ง€์›Œ๋„ ๋ ์ง€ ์•ˆ๋ ์ง€ ์ฝ”๋ฉ˜ํŠธ ์ฃผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์Œ 53F47E5E-4B5B-4C0C-B6EB-664A48FC4B22

    MemberService#validateExchangeable ๋ฉ”์„œ๋“œ

    • ์ •์‚ฐ ๊ธˆ์•ก์ด 10,000์› ์ดํ•˜์ธ ๊ฒฝ์šฐ ์˜ˆ์™ธ ๋ฐœ์ƒํ•˜๋„๋ก ๋˜์–ด์žˆ๋Š” ๋กœ์ง์ด ์ด ์ฝ”๋“œ์ธ๋ฐโ€ฆ
    • 10,000 ๋ฏธ๋งŒ์ธ ๊ฒฝ์šฐ์—๋งŒ ์ •์‚ฐ ๋ถˆ๊ฐ€๋Šฅํ•˜๋„๋ก ๋ณ€๊ฒฝ (์ด๊ฑฐ ๋‚ด๊ฐ€ ํ•ด๋„ ๋˜๋Š”๊ฑฐ์ง€โ€ฆ?) 9A3407BC-D714-4E33-B2D0-DF95561196E0

    ๊ฒฐ๋ก 

    DonationRepositoryImpl ํด๋ž˜์Šค์— currentPoint(...) ์‚ญ์ œํ•ด๋„ ๋˜๋Š”์ง€...? ๐Ÿค” (์‚ญ์ œํ•ด๋„ ๋œ๋‹ค๊ณ  ํ•˜๋ฉด ๋ฉ”์„œ๋“œ ์‚ญ์ œ + ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ์‚ญ์ œํ•  ์˜ˆ์ •)

    ๋ฒˆ์™ธโ€ฆ

    ์—ฌ๋Ÿฌ๋ถ„ โ€ฆ DonationType ์ด๊ฑฐ๋Š” ๋ญ์ฃ โ€ฆ?
    ์ด๊ฑฐ ํ”„๋ก ํŠธ ํฌ๋ฃจ๋“ค์ด ๋งŒ๋“ ๊ฑฐ๊ฐ™์€๋ฐ ์ด๊ฒŒ ๋ญ์ง€โ€ฆ? ์šฐ๋ฆฌ ๋„๋ฉ”์ธ์— ์“ฐ์ด๋Š” ๊ณณ ์—†์Œ. ํ•„์š”์—†๋Š”๊ฑฐ๋ฉด ์‚ญ์ œํ•˜๋ฉด ๋  ๋“ฏ Releaseํ•  ๋•Œ ์ƒ๊ธด๊ฑธ๋กœ ๋ดค์„ ๋•Œ๋Š” force push ํ•˜๋‹ค๊ฐ€ ์ƒ๊ธด๊ฒŒ ์•„๋‹๊นŒโ€ฆ?

    91B6B411-5882-4661-BBE3-036B80095B64

    Closes #397

    server refactor 
    opened by Rok93 3
  • refactor(server): ํŽ˜์ด์ง• ์ฟผ๋ฆฌ ๊ฐœ์„ 

    refactor(server): ํŽ˜์ด์ง• ์ฟผ๋ฆฌ ๊ฐœ์„ 

    DonationRepository#findDonationByCreatorOrderByCreatedAtDesc()

    1. OrderBy ๊ฐœ์„ 

    workbench ์—์„œ ํผํฌ๋จผ์Šคdb๋กœ ์ฟผ๋ฆฌ์‹œ ํ‰๊ท  7์ดˆ๋Œ€ ๊ฑธ๋ฆผ (์˜คํ”„์…‹์—†์ด). creator_id=1 ์ผ ๋•Œ 7-9s, creator_id=2 ์ผ ๋•Œ 3-4s. creator_id ๊ฐ€ 1์ธ donation์€ row 1,000,000 ๊ฐœ, 2๋Š” row 618,338 ๊ฐœ์•ผ.

    ๋Œ€์•ˆ

    1. id๋กœ ์ •๋ ฌ -> 6ms
    2. created_at desc ์ธ๋ฑ์Šค -> creator_id๊ฐ€ 1์ด๋ฉด 2s, 2๋ฉด 6ms
      • created_at์œผ๋กœ ์ธ๋ฑ์Šค๋ฅผ ๊ฑธ๋ฉด creator_id ์— ๋”ฐ๋ผ Duration์ด ๋‹ฌ๋ผ์ ธ.
      • 1,2 ๋ชจ๋‘ ์‹คํ–‰๊ณ„ํš์€ ๋™์ผํ•จ.

    ์ผ๋‹จ id ์ •๋ ฌ๋กœ ํ•ด๋†จ๋Š”๋ฐ ๊ผญ createdAt์œผ๋กœ ์ •๋ ฌํ•ด์•ผํ•˜๋Š” ์ด์œ ๊ฐ€ ์žˆ๋‹ค๋ฉด ์ฝ”๋ฉ˜ํŠธ๋กœ ์•Œ๋ ค์ค˜.

    2. paging ์ฟผ๋ฆฌ ๊ฐœ์„ 

    limit offset ๋ฐฉ์‹์„ ๊ฐœ์„  ๊ธฐ์กด์—๋Š” ํผํฌ๋จผ์Šคdb ๊ธฐ์ค€ offset 40,000๋ถ€ํ„ฐ 0.1s, 280,000๋ถ€ํ„ฐ 1s ๋„˜์–ด๊ฐ. (์ •๋ ฌ์„ id๋กœ ๊ฑธ์—ˆ์„ ๋•Œ ๊ธฐ์ค€)

    ๋‹ค๋“ค ์•„๋Š” ๋‚ด์šฉ์ด๊ฒ ์ง€๋งŒ offset์€ ์•ž์˜ row ๊ฒฐ๊ณผ๋ฅผ ๋ชจ๋‘ ์ฝ์€ํ›„์— ๋ฒ„๋ฆฌ๊ธฐ ๋•Œ๋ฌธ์— ํ•„์š”์—†๋Š” ์ฟผ๋ฆฌ์ž‘์—…์ด ์ปค์„œ ์„ฑ๋Šฅ์ด ์ข‹์ง€ ์•Š์•„. ๊ทธ๋ž˜์„œ offset ๋Œ€์‹  where ๋กœ id๋กœ ์กฐ๊ฑด์„ ๊ฑธ์–ด์„œ ์ฟผ๋ฆฌ ํ•˜๋„๋ก ๊ฐœ์„ ํ–ˆ์–ด. ์•ž์œผ๋กœ ์ด๊ฑธ no offset ๋ฐฉ์‹์ด๋ผ๊ณ  ๋งํ• ๊ฒŒ. no offset ๋ฐฉ์‹์€ ๋”๋ณด๊ธฐ ๋ฐฉ์‹์œผ๋กœ๋งŒ ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•ด. ์ผ๋ฐ˜์ ์ธ ํŽ˜์ด์ง•()์— ์ ์šฉํ•  ์ˆ˜ ์—†๋‚˜ ์ •๋ง ๋งŽ์ด ์ƒ๊ฐํ•ด๋ดค๋Š”๋ฐ, ๊ฒฐ๋ก ์€ ๋ถˆ๊ฐ€๋Šฅํ•œ๊ฑธ๋กœ ๋‚˜์™”์–ด. ์šฐ๋ฆฌ ํŽ˜์ด์ง•์€ ๋”๋ณด๊ธฐ ๋ฐฉ์‹์ด๋‹ˆ๊นŒ ๊ทธ๋Œ€๋กœ ์ง„ํ–‰ํ•˜๋ฉด ๋  ๋“ฏ. ๋Œ€์‹  API ์ˆ˜์ •์ด ํ•„์š”ํ•ด (/donations/me).

    API ๋ณ€๊ฒฝ์ 

    AS-IS

    # ์š”์ฒญ url
    /donations/me?size=2&page=1 
    
    # ์‘๋‹ต json
    [
        {
            "donationId" : 1,
            "name" : "name1",
            "message" : "message1",
            "pageName" : "pagename",
            "amount" : 1000,
            "createdAt" : "2021-10-21T10:47:44.620008"
        },
        {
              ...
        }
    ]
    

    TO-BE ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ lastPageId = ์ „ ํŽ˜์ด์ง€์˜ ๋งˆ์ง€๋ง‰ ๋„๋„ค์ด์…˜์˜ id. ๋‹ค๋ฅธ์ด๋ฆ„๋„ ์ถ”์ฒœ๋ฐ›์Œ lastPageId๊ฐ€ 0์ด๋ฉด ๊ฐ€์žฅ ์ตœ์‹ , 0์ด ์•„๋‹๊ฒฝ์šฐ์—” where id < lastPageId๋กœ ์กฐ๊ฑด์„ ๊ฑธ์–ด ํ•ด๋‹น ๋„๋„ค์ด์…˜๋ถ€ํ„ฐ ์กฐํšŒ.

    • 1์•ˆ: ์‘๋‹ตjson์— "lastPageId" ํ•„๋“œ๋ฅผ ๋”ฐ๋กœ ์ค˜์„œ ํ”„๋ก ํŠธ๊ฐ€ ๋‹ค์Œ ์š”์ฒญํ•  ๋•Œ ์ฟผ๋ฆฌํŒŒ๋ผ๋ฏธํ„ฐ๋กœ ์ „๋‹ฌ. ์‘๋‹ตjson ํ˜•์‹์ด ๋ฐ”๋€๋‹ค๋Š” ๋‹จ์ .
    • 2์•ˆ: ์‘๋‹ตjson ๊ธฐ์กด๊ณผ ๋™์ผ. JS์—์„œ ๋งˆ์ง€๋ง‰ ์›์†Œ์˜ donatioId๋ฅผ ๋นผ์„œ ์š”์ฒญ.

    ์š”์ฒญ url (1,2์•ˆ ๋™์ผ) /donations/me?lastPageId=1

    ์‘๋‹ต json

    # 1์•ˆ
    {
        "lastPageId": 5
        "result": [
            {
                "donationId" : 1,
                "name" : "name1",
                "message" : "message1",
                "pageName" : "pagename",
                "amount" : 1000,
                "createdAt" : "2021-10-21T10:47:44.620008"
            },
            {
                  ...
            }
        ]
    }
    
    # 2์•ˆ
    # AS-IS ์™€ ๊ฐ™์Œ
    

    ์กฐ์กธ๋‘๋‹˜์˜ ํŽ˜์ด์ง• ์„ฑ๋Šฅ ๊ฐœ์„  ์•„ํ‹ฐํด์„ ์ฐธ๊ณ ํ–ˆ์–ด.

    3. ์ด๋ฆ„ ๋ณ€๊ฒฝ: find5NewestDonationsPage()

    ์ด๋ฆ„์—๋Š” paging ์ฟผ๋ฆฌ๋ผ๋Š” ๋œป, ์ตœ์‹ ๊ฒƒ๋ถ€ํ„ฐ 5๊ฐœ์”ฉ ๊ฐ€์ ธ์˜จ๋‹ค๋Š” ๋œป์ด ์žˆ์—ˆ์œผ๋ฉด ์ข‹๊ฒ ์–ด์„œ ์ผ๋‹จ ์ด๋ ‡๊ฒŒ ์ง€์—ˆ๋Š”๋ฐ ๋” ์ข‹์€ ์˜๊ฒฌ์žˆ์œผ๋ฉด ์–˜๊ธฐํ•ด์ค˜!

    ๊ธฐํƒ€

    1. DonationRepository ์˜ donationOwner() -> donationReceiver() ํ”„๋กœ์ ํŠธ์—์„œ DonationOwner๋ผ๋Š” ํ‘œํ˜„์ด ๋‘ ๊ณณ์—์„œ ์“ฐ์ด๋Š”๋ฐ, ์„œ๋กœ ์˜๋ฏธ๊ฐ€ ๋‹ฌ๋ผ. ๊ทธ๋ž˜์„œ ํ›„์›์„ ๋ฐ›๋Š” ์ฐฝ์ž‘์ž์ชฝ์€ Receiver๋กœ ๋ฐ”๊ฟจ์–ด
      1. WrongDonationOwnerException์€ ํ›„์›์ž์ธ์ง€ ๊ฒ€์‚ฌ
      2. ๋ ˆํฌ์ง€ํ† ๋ฆฌ์ชฝ์˜ donationOwner()๋Š” ์ฐฝ์ž‘์ž์ธ์ง€ ๊ฒ€์‚ฌ.
    2. MemberRepository#findCurations() ์„ฑ๋Šฅ ์ด์Šˆ ํผํฌ๋จผ์Šคdb ๊ธฐ์ค€ ํ‰๊ท  14sec์ด ๊ฑธ๋ ธ์–ด. ๋‹จ๋ฐœ์„ฑ ์ฟผ๋ฆฌ๋กœ ๊ฐ™์€ ๊ฒฐ๊ณผ์— ๋‚ด์ง€๋งŒ ์„ฑ๋Šฅ์ข‹์€ ์ฟผ๋ฆฌ๋ฅผ ์งœ๊ธด ํž˜๋“ค๊ฒƒ๊ฐ™๊ณ , ์•„๋งˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์•„.
    3. DonationRepository#calculateExchangeAmountFromDonation() ์ œ๊ฑฐ
    feature server 
    opened by Joyykim 2
  • ์Šค์ผ€์ค„๋ง ์ž‘์—…์— ShedLock์„ ์ ์šฉํ•œ๋‹ค.

    ์Šค์ผ€์ค„๋ง ์ž‘์—…์— ShedLock์„ ์ ์šฉํ•œ๋‹ค.

    ์ •์‚ฐ๊ธˆ์•ก ์ž‘์—… ์ค‘๋ณต ์‹คํ–‰ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ShedLock๋ฅผ ์ ์šฉ

    • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ์œผ๋กœ WAS๊ฐ€ 2๋Œ€ ๋™์ž‘ ์ค‘์ด๋‹ค.
    • ์ •์‚ฐ ๊ธˆ์•ก ๊ณ„์‚ฐ ๋กœ์ง์€ ์Šค์ผ€์ค„๋ง์„ ํ†ตํ•ด ๋งค๋‹ฌ 1์ผ ๋™์ž‘ํ•˜๋„๋ก ์„ค์ •๋˜์–ด ์žˆ๋‹ค.
    • WAS 2๋Œ€์—์„œ ํ•ด๋‹น ๋กœ์ง์ด ๋ชจ๋‘ ๋™์ž‘ํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ 1๋Œ€๋งŒ ๋Œ์•„๊ฐ€๋ฉด ๋จ

    https://velog.io/@recordsbeat/%EB%A9%80%ED%8B%B0-%EC%84%9C%EB%B2%84%EC%97%90%EC%84%9C-%EC%8A%A4%EC%BC%80%EC%A4%84-%EC%B2%98%EB%A6%AC%ED%95%98%EA%B8%B0-ShedLock

    server refactor 
    opened by DWL5 0
  • ๋‚ด ํ›„์›๋ชฉ๋ก ์กฐํšŒ API ๋ณ€๊ฒฝ์  `/donations/me`

    ๋‚ด ํ›„์›๋ชฉ๋ก ์กฐํšŒ API ๋ณ€๊ฒฝ์  `/donations/me`

    ์š”์ฒญ url ๋ณ€๊ฒฝ

    AS-IS: /donations/me?size=2&page=1 TO-BE: /donations/me?cursorId=0

    cursorId

    • **์ฒซ ํŽ˜์ด์ง€๋Š” 0**์œผ๋กœ ์š”์ฒญ
    • ๊ทธ ํ›„๋Š” ์ €๋ฒˆ ์‘๋‹ต์—์„œ ๋งˆ์ง€๋ง‰ ์›์†Œ(๋„๋„ค์ด์…˜)์˜ donationId ๋กœ ์š”์ฒญ

    ์‘๋‹ต json ์˜ˆ์‹œ

    [
        {
              ...
        },
        {
              ...
        },
        {
              ...
        },
        {
              ...
        },
        {
            "donationId" : 5, // <- 5, 10, 15 ๋‹จ์œ„๋กœ ์˜ค์ง€ ์•Š์Œ!!! ๋งˆ์ง€๋ง‰ ๋„๋„ค์ด์…˜id์— ๋ญ๊ฐ€ ์˜ฌ์ง€๋Š” ํ•ญ์ƒ ๋‹ค๋ฆ„
            "name" : "name1",
            "message" : "message1",
            "pageName" : "pagename",
            "amount" : 1000,
            "createdAt" : "2021-10-21T10:47:44.620008"
        },
    ]
    

    ๋งŒ์•ฝ ์ด๋ ‡๊ฒŒ ์˜จ๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ๋„๋„ค์ด์…˜์˜ donationId๋Š” 5๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค์Œ ์š”์ฒญ์‹œ cursorId๋ฅผ 5๋กœ ์š”์ฒญ

    client 
    opened by Joyykim 0
Releases(v2.1.2)
  • v2.1.2(Aug 7, 2022)

    • ์„œ๋น„์Šค ์ข…๋ฃŒ ์•ˆ๋‚ด ์ปดํฌ๋„ŒํŠธ ๊ตฌํ˜„ ๋ฐ ์ ์šฉ (#547) by @hchayan in https://github.com/woowacourse-teams/2021-tyf/pull/548
    Source code(tar.gz)
    Source code(zip)
  • v2.1.0(Oct 29, 2021)

    ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ

    1. ์ผ๋ถ€ ๋ฒ„๊ทธ์„ฑ ์ด์Šˆ๋ฅผ ํ•ด๊ฒฐํ–ˆ์Šต๋‹ˆ๋‹ค.

    • ์ •์‚ฐ ๊ด€๋ฆฌ ์•ˆ๋‚ด ๋ฌธ๊ตฌ ๊ฐœ์„ 
    • ์ •์‚ฐ ๊ด€๋ฆฌ ์ผ๋ถ€ '์›'์œผ๋กœ ํ‘œ์‹œ๋˜๋˜ ์ •๋ณด 'tp' ๋กœ ๋ณ€๊ฒฝ
    • ํ›„์› ํ”Œ๋กœ์šฐ ๋ฒ„๊ทธ์„ฑ ํ๋ฆ„ ๊ฐœ์„ 
    • ๊ทธ์™ธ ์‚ฌ์šฉ์„ฑ ๊ฐœ์„ 

    2. ์„œ๋ฒ„ ์„ฑ๋Šฅ์„ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

    • ๋กœ๋“œ๋ฐธ๋Ÿฐ์‹ฑ ์ ์šฉ
    • Redis was ๋ถ„๋ฆฌ
    • ๊ทธ์™ธ ์ผ๋ถ€ ์„ฑ๋Šฅ ๊ฐœ์„ 
    Source code(tar.gz)
    Source code(zip)
  • v2.0.0(Oct 19, 2021)

    release v2.0.0

    ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ

    1. ์ •์‹ ๊ฒฐ์ œ ๋ชจ๋“ˆ์„ ์—ฐ๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ๋ถ€ํ„ฐ ์‹ค์ œ ๋ˆ์œผ๋กœ ํฌ์ธํŠธ ์ถฉ์ „์ด ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

    2. ์‚ฌ์šฉ์„ฑ ๋ฐ ์„ฑ๋Šฅ ๊ฐœ์„ 

    Source code(tar.gz)
    Source code(zip)
  • v1.2.0(Aug 30, 2021)

    release v.1.2.0

    ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ

    1. ์ •์‚ฐ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ›„์› ๋ฐ›์€ ์ง€ 7์ผ์ด ์ง€๋‚œ ๊ธˆ์•ก์€ ์ •์‚ฐ ์‹ ์ฒญ์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ •์‚ฐ ์‹ ์ฒญ์ด ๋˜๋ฉด ๋งค๋‹ฌ ?์ผ ์ผ๊ด„๋กœ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค.

    2. ์ •์‚ฐ ๊ณ„์ขŒ ๋“ฑ๋ก ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ •์‚ฐ์„ ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ ์ •์‚ฐ ๊ณ„์ขŒ ๋“ฑ๋ก์„ ์ง„ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ •์‚ฐ ๊ณ„์ขŒ ๋“ฑ๋ก์ด ์™„๋ฃŒ ๋˜๋ฉด, ์ •์‚ฐ ์š”์ฒญ์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‹ ์ฒญ ๊ณ„์ขŒ๋กœ ์ •์‚ฐ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    3. ํ™˜๋ถˆ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ›„์› ์‹œ ๋ฉ”์ผ๋กœ ์ƒํ’ˆ ID๊ฐ€ ์ „๋‹ฌ ๋ฉ๋‹ˆ๋‹ค. ํ•ด๋‹น ์ƒํ’ˆ ID๋กœ ํ™˜๋ถˆ์„ ์‹ ์ฒญ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Source code(tar.gz)
    Source code(zip)
  • v.1.3.0(Sep 15, 2021)

    release v1.3.0

    ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ

    1. ํฌ์ธํŠธ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋„๋„ค์ด์…˜ ๋ฐฉ์‹์ด ํฌ์ธํŠธ ์ถฉ์ „ํ›„, ํ•ด๋‹น ํฌ์ธํŠธ๋ฅผ ์ฐฝ์ž‘์ž์—๊ฒŒ ์ฃผ๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ณ€๊ฒฝ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

    2. ์›น์‚ฌ์ดํŠธ ์„ฑ๋Šฅ์ด ๊ฐœ์„ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋” ๋น ๋ฅด๊ณ  ์ตœ์ ํ™”๋œ ์›น์‚ฌ์ดํŠธ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Source code(tar.gz)
    Source code(zip)
  • v1.1.1(Aug 2, 2021)

    release v.1.1.1

    ๋ฆด๋ฆฌ์ฆˆ ๋…ธํŠธ

    1. ํ›„์› url ์ด๋ฏธ์ง€ ๋ฐฐ๋„ˆ ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค ์ด์ œ ์ž์‹ ์˜ ํ›„์› ๋งํฌ๋ฅผ ์—ฌ๋Ÿฌ ์ด๋ฏธ์ง€ ํ”„๋ฆฌ์…‹ ๋ฐฐ๋„ˆ๋ฅผ ์ด์šฉํ•ด ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    2. ์ด์ œ ๋ฐ์Šคํฌํƒ‘ ํ•ด์ƒ๋„๋„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค ๊ธฐ์กด ๋ชจ๋ฐ”์ผ ํ•ด์ƒ๋„์— ๋ฐ์Šคํฌํƒ‘ ํ•ด์ƒ๋„๊ฐ€ ์ถ”๊ฐ€๋˜์–ด ๋ฐ˜์‘ํ˜• ์›น ํ˜•ํƒœ๋กœ ๊ฐœ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

    3. ํ…Œ์ŠคํŠธ ๊ฒฐ์ œ ๋ชจ๋“ˆ์„ ์—ฐ๋™ํ–ˆ์Šต๋‹ˆ๋‹ค ์นด์นด์˜คํŽ˜์ด ํ…Œ์ŠคํŠธ ๊ฒฐ์ œ ๋ชจ๋“ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PG์‚ฌ์˜ ์Šน์ธ ์ดํ›„ ์ •์ƒ ๊ฒฐ์ œ ๋ชจ๋“ˆ๋กœ ๋ณ€๊ฒฝ๋ฉ๋‹ˆ๋‹ค.

    4. ์‚ฌ์šฉ์ž ์ •๋ณด ์„ค์ • ํŽ˜์ด์ง€๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ ์ž์‹ ์˜ ํ”„๋กœํ•„ ์ด๋ฏธ์ง€, ๋‹‰๋„ค์ž„, ์ž๊ธฐ์†Œ๊ฐœ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

    Source code(tar.gz)
    Source code(zip)
  • v1.0.1(Jul 20, 2021)

    release v1.0.1

    ๋ชฉํ‘œ

    • ์ตœ์†Œํ•œ์˜ ๊ธฐ๋Šฅ ํ๋ฆ„ ๊ตฌํ˜„

    ์„ธ๋ถ€์‚ฌํ•ญ

    • ํ™˜๊ฒฝ์„ค์ •
    • ํšŒ์›๊ฐ€์ž… ๋ฐ ๋กœ๊ทธ์ธ
    • ํ›„์› ์ˆ˜๋‹จ ๊ด€๋ฆฌ (Point)
    • URL ๊ณต์œ 
    • ํ›„์›ํ•˜๊ธฐ
    Source code(tar.gz)
    Source code(zip)
Owner
null
A minecraft minigame where you have to defend your bed and destroy the others. Once your bed is destroyed, you cannot respawn.

As from November 1st 2021 BedWars1058 by Andrei Dascฤƒlu becomes open source under GNU GPL 3.0 license. If you are a developer I would really appreciat

Andrei Dascฤƒlu 182 Dec 26, 2022
Facsimile - Copy Your Most Used Text to Clipboard Easily with Facsimile!. It Helps You to Store You Most Used Text as a Key, Value Pair and Copy it to Clipboard with a Shortcut.

Facsimile An exact copy of Your Information ! Report Bug ยท Request Feature Table of Contents About The Project Built With Getting Started Installation

Sri lakshmi kanthan P 1 Sep 12, 2022
COMPortNotifier - Smol utility to send you a notification every time you connect, or disconnect a COM port.

COMPortNotifier A smol utility that sends you a notification every time a COM port is connected, or disconnected on your computer. Useful for electric

Matt Foulks 1 Sep 7, 2022
A Java agent that disables platform features you don't use, before an attacker uses them against you.

aegis4j Avoid the NEXT Log4Shell vulnerability! The Java platform has accrued a number of features over the years. Some of these features are no longe

Daniel Gredler 14 Jan 11, 2022
Shows Image you select on Top of every Window by holding the button you choose

ImageOnTop What it does? Shows Image you select on Top of every Window by holding the button you choose. How to use it? Press a keyboard key you want

null 1 Jan 23, 2022
An app which will never give you up and never let you down

rickroll-android-edition An app which will never give you up and never let you down How to install On your phone, Turn on Install apps from unknown so

null 1 Feb 3, 2022
A Pomodoro Timer that allows you to collect Pokemon as you work.

Pomodoro: The Pokรฉmon Collecting Game! A fun take on the Pomodoro Technique So, what does this application do? This application utilizes the famous Po

Kevin Wong 2 Jan 29, 2022
A custom minimap that displays resources all around you while you adventure through Aeternum!

New-World-MiniMap A custom minimap that displays resources all around you while you adventure through Aeternum! Download Download Page Minimap.rar Oth

Mal Ball 7 Dec 9, 2021
You want to go to a cafe but don't know where to go. Let cafe hub support you. Ok let's go

cafe-hub You want to go to a cafe but don't know where to go. Let cafe hub support you. Ok let's go Architecture: Domain Driven Design (DDD) LDM Insta

Khoa 1 Nov 12, 2022
AlarmManager (Wobble) is a time management application that helps you wake up

AlarmManager AlarmManager (Wobble) is a time management application that helps you wake up | | | The app has following features: Alarm: Vocal message

Piyush Shrivastava 1 Jan 8, 2022
Allows you to use the MongoDB query syntax to query your relational database.

Spring Data JPA MongoDB Expressions How it works: Customize JPA Repository base class: @SpringBootApplication @EnableJpaRepositories(repositoryBaseCla

Muhammad Hewedy 86 Dec 27, 2022
Create your Java crypto trading bot in minutes. Our Spring boot starter takes care of exchange connections, accounts, orders, trades, and positions so you can focus on building your strategies.

Quick Start | Documentation | Discord | Twitter Create and run your java crypto trading bot in minutes Our Spring boot starter takes care of exchange

Cassandre 442 Jan 3, 2023
A plugin to help you easily edit Swagger and OpenAPI specification files inside IntelliJ IDEA

Swagger Plugin Swagger Plugin makes it easy to edit Swagger and OpenAPI specification files inside IntelliJ IDEA. You can find it on JetBrains' plugin

Zalando SE 1.1k Dec 15, 2022
Swerve control, simulation, and trajectory generation / following. Everything you need for swerve.

BearSwerve BearSwerve is intended to be an all in one swerve solution including: teleop driving, simulation, trajectory following and more. It combine

null 7 Dec 28, 2022
Wake up, you need to hack a CPU

Sleep as CPU Hacker An addon for Sleep as Android which adds an additional CAPTCHA module which requires you to execute simple x86 assembly instructio

Wakacyjne Warsztaty Wielodyscyplinarne 2 Jan 3, 2022
A boilerplate project designed to work as a template for new microservices and help you get in touch with various useful concepts.

Microservice Reference Project This project is inspired by the idea to quickly create a production ready project with all the required infrastructure

Innovation & Tech 4 Dec 17, 2022
Some anti afk bot which prevents you from getting punished for going afk in games. Way of stopping the bot is slightly flawed but we'll ignore that.

AntiAFK Some anti afk bot which prevents you from getting punished for going afk in games. Gui mode coming soon... Installation Install Java 17. Downl

flasky 1 Jan 13, 2022
DM Movie is an app with several movies catalogued through a database, you enter your email and your rating of the movie

DM Movie is an app with several movies catalogued through a database, you enter your email and your rating of the movie

Davi M. G. de Almeida 5 Jan 28, 2022
With this template, you are ste to deploy your application to Heroku

Template for deployment With this template, you are ste to deploy your application to Heroku. Iยดm using a Spring backend, React JS Frontend with Mongo

Thomas Kittlaus 4 Jun 23, 2022