Skip to content

๐Ÿถ ๋ธ”๋ก์ฒด์ธ์„ ํ™œ์šฉํ•œ ๋™๋ฌผ ์˜๋ฃŒ ๊ธฐ๋ก ๊ด€๋ฆฌ ๋ฐ ๊ถŒ๋ฆฌ ๋ณดํ˜ธ ํ”Œ๋žซํผ

Notifications You must be signed in to change notification settings

wnsdk/for-paw-chain

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 
ย 

Repository files navigation

๐Ÿถ ํฌํฌ์ฒด์ธ ๐Ÿถ - ๋ฏฟ์„ ์ˆ˜ ์žˆ๋Š” ๋™๋ฌผ ์˜๋ฃŒ ๊ธฐ๋ก ์ถ”์  ์„œ๋น„์Šค

๐Ÿ‘‡[ํฌํฌ์ฒด์ธ ์†Œ๊ฐœ ๋ฐ ์‹œ์—ฐ ์˜์ƒ]๐Ÿ‘‡
https://youtu.be/9AmmoUADeQM

  1. ์„œ๋น„์Šค ์†Œ๊ฐœ
  2. ๊ธฐ์ˆ  ์Šคํƒ
  3. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ
  4. ํ”„๋กœ์ ํŠธ ์ง„ํ–‰
  5. ํ”„๋กœ์ ํŠธ ์‚ฐ์ถœ๋ฌผ
  6. ํŒ€์› ์†Œ๊ฐœ

โ… . ์„œ๋น„์Šค ์†Œ๊ฐœ

1. ์„œ๋น„์Šค ์„ค๋ช…

๐Ÿพ ํฌํฌ์ฒด์ธ ๊ฐœ์š”

  • ํ•œ์ค„ ์†Œ๊ฐœ : ๋ธ”๋ก์ฒด์ธ์„ ํ™œ์šฉํ•œ ๋™๋ฌผ ์˜๋ฃŒ ๊ธฐ๋ก ๊ด€๋ฆฌ ๋ฐ ๊ถŒ๋ฆฌ ๋ณดํ˜ธ ํ”Œ๋žซํผ
  • ์„œ๋น„์Šค ๋ช… : ํฌํฌ์ฒด์ธ
    • For Paw Chain, ๋ฐœ๋ฐ”๋‹ฅ์„ ๊ฐ€์ง„ ๋™๋ฌผ๋“ค์„ ์œ„ํ•œ ๋ธ”๋ก์ฒด์ธ ๊ธฐ๋ฐ˜ ์„œ๋น„์Šค๋ผ๋Š” ์˜๋ฏธ

2. ๊ธฐํš ๋ฐฐ๊ฒฝ


1) ํ˜„ํ–‰๋ฒ•์ƒ ๋ฒ•์ ์œผ๋กœ ์ง„๋ฃŒ๊ธฐ๋ก์„ ๋ฐœ๊ธ‰ํ•  ์˜๋ฌด๊ฐ€ ์—†์Œ
2) ์œ ๊ธฐ๋™๋ฌผ์ด ๊ณผ๊ฑฐ์— ์–ด๋–ค ์น˜๋ฃŒ๋ฅผ ๋ฐ›์•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์Œ
3) ์ฃผ์ธ์ด ๋ฐ˜๋ ค๋™๋ฌผ์˜ ์ง„๋ฃŒ๊ธฐ๋ก์„ ์•Œ ์ˆ˜ ์—†์Œ
4) ๋™๋ฌผ๋“ฑ๋ก์ œ(์ธ์‹์นฉ)์˜ ์˜๋ฌดํ™”
5) ์ค‘๋ณต ์น˜๋ฃŒ๋กœ ์ธํ•œ ์œ ๊ธฐ๋™๋ฌผ ๋™๋ฌผ๊ถŒ ์นจํ•ด
6) ์˜๋ฃŒ์‚ฌ๊ณ  ๋ฐœ์ƒ ์‹œ ์›์ธ ํŒŒ์•… ๋ถˆ๊ฐ€๋Šฅ
7) ๋ณ‘์› ์ด๋™ ์‹œ ๋ถˆํ•„์š”ํ•œ ๊ฒ€์‚ฌ ํ•„์š”

โค ๊ธฐํš ์˜๋„

  • ๋™๋ฌผ๊ถŒ ๋ณด์žฅ
    ์ ํ•ฉํ•œ ์น˜๋ฃŒ๋ฅผ ๋ฐ›๊ธฐ ์–ด๋ ค์šด ์œ ๊ธฐ๋™๋ฌผ์„ ์œ„ํ•ด ๊ฑด๊ฐ• ์ƒํƒœ๋ฅผ ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ ํŒŒ์•…ํ•˜์—ฌ ๋™๋ฌผ๊ถŒ์„ ๋ณด์žฅ
  • ๋™๋ฌผ๋ณดํ˜ธ์ž์˜ ํŽธ์˜์„ฑ ์ฆ์ง„
    ๋ณ‘์›์— ๊ฐ€์ง€ ์•Š์•„๋„ ๋ชจ๋“  ๋ณดํ˜ธ์ž๊ฐ€ ๋ฐ˜๋ ค๋™๋ฌผ์˜ ์ง„๋ฃŒ ๊ธฐ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋Š” ํŽธ์˜์„ฑ ์ œ๊ณต
    ๋ณ‘์›์„ ์˜ฎ๊ธธ ์‹œ ์ด์ „์˜ ์ง„๋ฃŒ๊ธฐ๋ก ํ™•์ธ ๊ฐ€๋Šฅ
  • ํˆฌ๋ช…ํ•œ ์˜๋ฃŒ๊ธฐ๋ก
    ๋™๋ฌผ์˜ ์˜๋ฃŒ ๊ธฐ๋ก ํˆฌ๋ช…์„ฑ์„ ๋ณด์žฅํ•˜์—ฌ ๋™๋ฌผ๋ณ‘์›์— ์˜ํ•œ ํ”ผํ•ด๋ฅผ ์ค„์ด๊ณ , ์ž…์–‘/๋ถ„์–‘ ์‹œ ๊ฑฐ์ง“ ๊ฑด๊ฐ•์ƒํƒœ๋กœ ์ธํ•œ ํŒŒ์–‘๋ฅ ์„ ์ค„์ž„

๐Ÿงก๊ธฐ๋Œ€ํšจ๊ณผ

๋™๋ฌผ๋ณดํ˜ธ์ž

  • ๋ฐ˜๋ฃŒ ๋™๋ฌผ์˜ ์˜๋ฃŒ ๊ธฐ๋ก ํŒŒ์•… ๊ฐ€๋Šฅ
  • ์˜๋ฃŒ ์‚ฌ๊ณ  ์ธ์ง€ ๊ฐ€๋Šฅ
  • ๋ฐ˜๋ ค ๋™๋ฌผ์„ ์žƒ์–ด๋ฒ„๋ฆฐ ๊ฒฝ์šฐ, ์ž์‹ ์˜ ์ •๋ณด ๊ณต๊ฐœ ๊ฐ€๋Šฅ

์˜์‚ฌ

  • ๋‹ค๋ฅธ ๋ณ‘์›์—์„œ ์น˜๋ฃŒํ•œ ๋™๋ฌผ์ด๋‚˜ ์œ ๊ธฐ ๋™๋ฌผ์˜ ์˜๋ฃŒ ๊ธฐ๋ก ํŒŒ์•… ๊ฐ€๋Šฅ
  • ์„ฑ์‹คํžˆ ์˜๋ฃŒ ๊ธฐ๋ก์„ ๋“ฑ๋กํ•  ๊ฒฝ์šฐ, ๊ณ ๊ฐ์œผ๋กœ๋ถ€ํ„ฐ ์‹ ๋ขฐ์„ฑ ์ฆ๊ฐ€

๋™๋ฌผ

  • ์œ ๊ธฐ ๋™๋ฌผ์˜ ์žฌ๊ฒ€์‚ฌ ๋ฐฉ์ง€ ๋ฐ ์ ํ•ฉํ•œ ์น˜๋ฃŒ ๊ฐ€๋Šฅ
  • ์ธ์‹์นฉ ์‚ฌ์šฉ๋ฅ  ์ฆ๊ฐ€
  • ๋™๋ฌผ์˜ ์œ ๊ธฐ ๋น„์œจ ๊ฐ์†Œ

์ž…์–‘ ์‹œ

  • ์˜ˆ๋ฐฉ ์ ‘์ข… ๋“ฑ ์‚ฌ๊ธฐ ๋ฐฉ์ง€
  • ์œ ๊ธฐ ๋™๋ฌผ์˜ ์ž…์–‘ ์žฅ๋ ค
  • ํŽซ์ƒต ์ด์šฉ๋ฅ  ๊ฐ์†Œ

3. ์„œ๋น„์Šค ํ™”๋ฉด

๐Ÿค ๋กœ๊ทธ์ธ

  • ๋ณ„๋„ ํšŒ์›๊ฐ€์ž… ์—†์ด ์นด์นด์˜ค ๊ณ„์ •์„ ํ†ตํ•ด ๋กœ๊ทธ์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์ดํ›„ ๋ฉ”์ธํŽ˜์ด์ง€๋กœ ์ด๋™ํ•œ๋‹ค.

๐Ÿ’œ ๋ฉ”์ธํŽ˜์ด์ง€

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

๐Ÿ’œ ๋‚˜์˜ ๋ฐ˜๋ ค๋™๋ฌผ ๋ชฉ๋ก

  • ๊ธฐ๋ณธ์ ์œผ๋กœ๋Š” ์˜์‚ฌ ๋˜๋Š” ํ•ด๋‹น ๋™๋ฌผ์˜ ์ฃผ์ธ๋งŒ์ด ๋™๋ฌผ ์˜๋ฃŒ ๊ธฐ๋ก์„ ์—ด๋žŒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ํ•˜์ง€๋งŒ ํ•ด๋‹น ๋™๋ฌผ์˜ ์ฃผ์ธ์ด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ๋„ ์˜๋ฃŒ ๊ธฐ๋ก์„ ๋ณด์—ฌ์ฃผ๊ณ  ์‹ถ์€ ๊ฒฝ์šฐ, ์—ด๋žŒ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ์—ด๋žŒ ๊ถŒํ•œ์„ ๋‹ค์‹œ ๋บ์„ ์ˆ˜๋„ ์žˆ๋‹ค.
  • ํ‚ค์šฐ๋˜ ์• ์™„ ๋™๋ฌผ์„ ๋‹ค๋ฅธ ์‚ฌ๋žŒ์—๊ฒŒ ๋ถ„์–‘ ๋ณด๋‚ผ ๊ฒฝ์šฐ, ๋ถ„์–‘ํ•˜๊ธฐ ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์ฃผ์ธ์„ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’œ ๋™๋ฌผ ๋“ฑ๋ก ์ •๋ณด

  • ํ•ด๋‹น ๋™๋ฌผ์˜ ์ฃผ์ธ์ด๋ผ๋ฉด, ๋™๋ฌผ์˜ ์ถ”๊ฐ€์ ์ธ ์ •๋ณด๋ฅผ ์ง์ ‘ ์ž…๋ ฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’œ ์˜๋ฃŒ ๊ธฐ๋ก ์กฐํšŒ

  • ์˜์‚ฌ์ด๊ฑฐ๋‚˜, ํ•ด๋‹น ๋™๋ฌผ์˜ ์ฃผ์ธ์ด๊ฑฐ๋‚˜, ๊ทธ ๋ฐ–์— ์—ด๋žŒ ๊ถŒํ•œ์„ ๋”ฐ๋กœ ๋ถ€์—ฌ๋ฐ›์€ ์‚ฌ๋žŒ์ด๋ผ๋ฉด, ํ•ด๋‹น ๋™๋ฌผ์˜ ์˜๋ฃŒ ๊ธฐ๋ก๋“ค์„ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.
  • ๋™๋ฌผ๋งˆ๋‹ค 1๊ฐœ์˜ ์ปจํŠธ๋ž™ํŠธ๊ฐ€ ๋ธ”๋ก์ฒด์ธ ๋„คํŠธ์›Œํฌ์— ๋ฐฐํฌ๋œ๋‹ค.
  • ์˜๋ฃŒ ๊ธฐ๋ก์€ ํ•ด๋‹น ๋™๋ฌผ์˜ ์ปจํŠธ๋ž™ํŠธ์— ์ €์žฅ๋œ๋‹ค.
  • ์ปจํŠธ๋ž™ํŠธ์˜ ๋ฐฐํฌ ๋ฐ ์กฐํšŒ, ์ž‘์„ฑ์€ ๋ชจ๋‘ Web3j๋ฅผ ํ†ตํ•ด ์ด๋ฃจ์–ด์ง„๋‹ค.

๐Ÿ’œ QR์ฝ”๋“œ ์ƒ์„ฑ

  • 10์ž๋ฆฌ๊ฐ€ ๋„˜๋Š” ๊ธด ๋™๋ฌผ๋“ฑ๋ก๋ฒˆํ˜ธ๋ฅผ ๋งค๋ฒˆ ๊ธฐ์–ตํ•˜๊ธฐ ์–ด๋ ค์šด ์‚ฌ์šฉ์ž๋“ค์„ ์œ„ํ•ด, QR ์ด๋ฏธ์ง€๋ฅผ ์ œ๊ณตํ•œ๋‹ค.
  • QR ์ด๋ฏธ์ง€๋Š” ํœด๋Œ€ํฐ ๊ฐค๋Ÿฌ๋ฆฌ์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

๐Ÿ’œ ๊ถŒํ•œ ๊ด€๋ฆฌ

๐Ÿ’œ ์ž…์–‘ ๊ณต๊ณ 

๐Ÿ’œ ์˜์‚ฌ ๋ฉดํ—ˆ ์ธ์ฆ

๐Ÿ’œ ์˜๋ฃŒ ๊ธฐ๋ก ์ž‘์„ฑ

  • ๋ณธ์ธ์ด ์˜์‚ฌ์ž„์„ ์ธ์ฆํ•˜๋ฉด, ์ˆ˜์˜์‚ฌ๋กœ์„œ ๋™๋ฌผ์˜ ์˜๋ฃŒ๋‚ด์—ญ์„ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ๋‹ค.
  • ๋ณธ์ธ์ด ์˜์‚ฌ์ž„์„ ์ธ์ฆํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋ณด๊ฑด๋ณต์ง€๋ถ€์˜ ์˜๋ฃŒ์ธ๋ฉดํ—ˆ์ •๋ณด์กฐํšŒ api๋ฅผ ์ด์šฉํ•œ๋‹ค.


โ…ก. ๊ธฐ์ˆ  ์Šคํƒ

1. ๋ธ”๋ก์ฒด์ธ ๋„คํŠธ์›Œํฌ

  • ๊ธฐ๋Šฅ: ์ง€๊ฐ‘ ์ƒ์„ฑ, ์ปจํŠธ๋ž™ํŠธ ๋ฐฐํฌ, ํŠธ๋žœ์žญ์…˜ ์ „์†ก
  • ๊ตฌํ˜„: EC2 ์„œ๋ฒ„์—์„œ geth๋ฅผ ์ด์šฉํ•˜์—ฌ gensis.json์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๊ฐ€๋Šฅํ•œ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ

2. IPFS

  • ๊ธฐ๋Šฅ: ์ด๋ฏธ์ง€๋ฅผ ๋ถ„์‚ฐ ๋„คํŠธ์›Œํฌ์— ์ €์žฅํ•˜๊ณ , ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•ด์‰ฌ๊ฐ’์„ ์ด์šฉํ•˜์—ฌ ์ด๋ฏธ์ง€๋ฅผ ์กฐํšŒ
  • EC2 ์„œ๋ฒ„์— ์กด์žฌํ•˜๋Š” Docker ์œ„์— kudo ipfs ์‹คํ–‰

3. Android

  • ์–ธ์ œ ์–ด๋””์„œ๋‚˜ ์˜๋ฃŒ๊ธฐ๋ก์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ชจ๋ฐ”์ผ ํ™˜๊ฒฝ์—์„œ์˜ ์„œ๋น„์Šค ์„ ํƒ
  • ํŽธํ•˜๊ฒŒ ๋“ฑ๋ก๋ฒˆํ˜ธ๋ฅผ ๊ณต์œ ํ•˜๊ธฐ ์œ„ํ•ด QR ๊ธฐ๋Šฅ์„ ์ œ๊ณต

โ…ข. ๊ฐœ๋ฐœ ํ™˜๊ฒฝ ๐Ÿ–ฅ๏ธ

๐Ÿ–ฅ Backend

IntelliJ badge Java badge spring boot badge spring-data-jpa badge spring-security badge JWT badge Web3j badge mariadb badge redis badge Google Cloud Platform badge

๐Ÿ–ฅ Frontend

Kotlin Android Studio

๐Ÿ–ฑ DevOps

AWS EC2 badge docker badge jenkins badge

๐ŸŽจ UI/UX

Figma

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘ง ํ˜‘์—… ํˆด

Git / Gitlab Jira Notion

๋ธ”๋ก์ฒด์ธ

Solidity Geth

๋ฒ„์ „ ์ •๋ณด

Server

  • Server: AWS EC2
  • Ubuntu: 20.04
  • Docker: 23.0.2
  • Nginx: 1.18.0
  • Redis: 7.0.10
  • MariaDB: 10.3.38

Back-end

  • OpenJDK: 11
  • Build Tool: Gradle
  • Spring Framework: 2.7.9
  • Spring Dependency-management: 1.0.15.RELEASE

Front-end

  • Kotlin: 1.8.0
  • Java: 11
  • Compile SDK: 33
  • Room Runtime: 2.3.0
  • Palette: 1.0.0
  • navigation-safe-args-gradle-plugin: 2.5.3
  • retrofit : 2.6.4
  • QR: 3.4.1
  • glide: 4.12.0
  • room-runtime: 2.3.0
  • kakao.sdk: '2.13.0'

๋ธ”๋ก์ฒด์ธ

  • Geth: 1.11.5
  • web3j: 4.9.7
  • Solidity: latest

IDE

  • InteliJ: 2022.3
  • Android Studio: 2022.1
  • Emulator: Pixel 2 XL

Management Tool

  • ํ˜•์ƒ ๊ด€๋ฆฌ: GitLab
  • ์ด์Šˆ ๊ด€๋ฆฌ: JIRA
  • ์ปค๋ฎค๋‹ˆ์ผ€์ด์…˜: Notion
  • ํŒŒ์ผ ์ €์žฅ: Spring Cloud GCP Storage
  • UI/UX ๋””์ž์ธ: Figma

โ…ฃ. ์‹œ์ž‘ํ•˜๊ธฐ

์•„๋ž˜ ๋ฐฉ๋ฒ•์„ ๋”ฐ๋ผ ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์„ค์น˜ํ•˜๊ธฐ

์„ค์น˜ ๊ณผ์ •

  1. Github์˜ Repository๋ฅผ cloneํ•ฉ๋‹ˆ๋‹ค.
$ git clone [์šฐ๋ฆฌ ์ฃผ์†Œ]
  1. APK ํŒŒ์ผ ์ƒ์„ฑ์„ ์ฐธ๊ณ ํ•˜์—ฌ android ํด๋”๋ฅผ APK๋กœ ์ƒ์„ฑํ•˜์—ฌ ์•ˆ๋“œ๋กœ์ด๋“œ ํ™˜๊ฒฝ์— ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

APK ํŒŒ์ผ ์ƒ์„ฑ

  1. Android Studio์˜ Build > Generate Signed Bundle / APK ...๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. Create new๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  3. Key Store Path๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
Alias: ๊ธฐ๋ณธ
Password: (6์ž) / Confirm 
Certificate: ์•ฑ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€ ๋ฐ์ดํ„ฐ ๋„ฃ๊ธฐ
  1. release ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.
  2. ์นด์นด์˜ค ๋กœ๊ทธ์ธ ๊ด€๋ จ ๋‚ด์šฉ์„ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
    1. openssl๋กœ release key์™€ debug key๋ฅผ ๋ชจ๋‘ ๋ฐœ๊ธ‰ ๋ฐ›์€ ํ›„ ์นด์นด์˜ค ๋””๋ฒจ๋กœํผ์— ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
    2. ์ฐธ๊ณ : https://ranseo.tistory.com/m/386
  3. err_unknown_url_scheme ์—๋Ÿฌ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒฝ์šฐ AndroidManifest.xml์—์„œ Native app key๋ฅผ ๋„ฃ๊ณ  ์•„๋ž˜์˜ ์„ค์ •์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
<activity
            android:name="com.kakao.sdk.auth.AuthCodeHandlerActivity"
            android:exported="true">
            <intent-filter>
                <action android:name="android.intent.action.VIEW" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />

                <!-- Redirect URI: "kakao${NATIVE_APP_KEY}://oauth" -->
                <data android:host="oauth"
                    android:scheme="kakaoa๋ณธ์ธ์นด์นด์˜คnative key" />
            </intent-filter>
</activity>

์‹คํ–‰ํ•˜๊ธฐ

  1. AWS EC2 ์„ค์ •์„ ์ฐธ๊ณ ํ•˜์—ฌ AWS EC2์— ์ ‘์†ํ•ฉ๋‹ˆ๋‹ค.
  2. Jenkins ์„ค์ •์„ ์ฐธ๊ณ ํ•˜์—ฌ Back-end ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  3. IPFS Image๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. ๋„คํŠธ์›Œํฌ ์„ค์ •์„ ์ฐธ๊ณ ํ•˜์—ฌ ๋ธ”๋ก์ฒด์ธ private ๋„คํŠธ์›Œํฌ๋ฅผ ๊ตฌ์ถ•ํ•˜๊ณ  ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  5. ์ €์žฅ์†Œ ์„ค์ •์„ ์ฐธ๊ณ ํ•˜์—ฌ MariaDB, Redis, GCP๋ฅผ ์„ค์น˜ํ•˜๊ณ  ์„œ๋ฒ„ ์ฃผ์†Œ์™€ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  6. ์ฒจ๋ถ€ํ•œ ๋คํ”„ ๋ฐ์ดํ„ฐ ํŒŒ์ผ์„ ์ด์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
  7. ์„ค์น˜ํ•œ APK๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

AWS EC2 ์„ค์ •

remote host: j8a207.p.ssafy.io
username: ubuntu
.pem: ์ฒจ๋ถ€ ํŒŒ์ผ

Jenkins ์„ค์ •

  1. Repository URL์„ ํ†ตํ•ด Git ํ”„๋กœ์ ํŠธ๋ฅผ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
  2. Git์˜ WebHook ์„ค์ •์„ ํ†ตํ•ด release branch์˜ push event๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ์ž๋™์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  3. Shell Script๋ฅผ Jenkins์˜ Build Steps์— Executeํ•˜์—ฌ ์ž๋™์œผ๋กœ ๋นŒ๋“œํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
cd backend/
chmod +x ./gradlew
./gradlew clean build
  1. Shell Script๋ฅผ Jenkins์˜ Build Steps์— Executeํ•˜์—ฌ Docker Image๋ฅผ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋„๋ก ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
docker build -t backend ./backend
if (docker ps | grep backend) then docker stop backend; fi
docker run -d --rm --name backend --network my-network -p 8080:8080 backend
docker image prune -f
  1. ํ”„๋กœ์ ํŠธ ๋‚ด๋ถ€์— Dockerfile์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
# open jdk java 11 ๋ฒ„์ „ ํ™˜๊ฒฝ
FROM openjdk:11-jdk

# gradle ๋นŒ๋“œ ์‹œ jar ํŒŒ์ผ ์ƒ์„ฑ ๊ฒฝ๋กœ
ARG JAR_FILE=./build/libs/*.jar

# JAR_FILE์„ ๋ฉ”์ธ ๋””๋ ‰ํ† ๋ฆฌ์— ๋ณต์‚ฌ
COPY ${JAR_FILE} app.jar

# 8080 port Open
EXPOSE 8080

# ์‹œ์Šคํ…œ ์ง„์ž…์ 
ENTRYPOINT ["java","-jar","app.jar"]

IPFS ์„ค์ •

  1. IPFS Docker Image๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
docker pull ipfs/go-ipfs
  1. Run ๋ช…๋ น์–ด๋ฅผ ํ†ตํ•ด IPFS Image๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
docker run \
 -d \
--restart always \
--name ipfs-node \
-v /data/ipfs:/data/ipfs \
-v /data/ipfs-staging:/staging \
-p 8001:8080 \
-p 4001:4001 \
-p 5001:5001 \
--network my-network \
ipfs/go-ipfs:latest \

docker exec ipfs-node ipfs config Addresses.API 127.0.0.1/8001

๋„คํŠธ์›Œํฌ ์„ค์ •

  1. Geth๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
sudo apt-get update
sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:ethereum/ethereum
sudo apt-get install
  1. ๋ธ”๋ก์ฒด์ธ ๋„คํŠธ์›Œํฌ ํด๋”๋ฅผ ์ƒ์„ฑ ํ›„ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
mkdir eth
cd eth
  1. ether๋ฅผ ์ฑ„๊ตดํ•  ๊ณ„์ •์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
geth --datadir . account new
  1. genesis.json ํŒŒ์ผ์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
{
	"config": {
	"chainId": 7167, 
	"homesteadBlock": 0, 
	"byzantiumBlock": 0, 
	"constantinopleBlock": 0, 
	"eip150Block": 0, 
	"eip155Block": 0, 
	"eip158Block": 0 
	},
	"difficulty": "0x10", 
	"coinbase": "์ง€๊ฐ‘์ฃผ์†Œ", 
	"gasLimit": "9999999", 
	"alloc": {}, 
	"extraData": "", 
	"nonce": "0xdeadbeefdeadbeef", 
	"mixhash": "0x0000000000000000000000000000000000000000000000000000000000000000", 
	"parentHash": "0x0000000000000000000000000000000000000000000000000000000000000000", 
	"timestamp": "0x00"
}
  1. ๋„คํŠธ์›Œํฌ๋ฅผ ์ดˆ๊ธฐํ™”ํ•ฉ๋‹ˆ๋‹ค.
geth --datadir . init genesis.json
  1. ์ดˆ๊ธฐํ™”ํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
geth --datadir . --port 30303 --http --http.addr "0.0.0.0" --http.port 8545 --http.corsdomain "*" --networkid 7167 --http.api "admin,db,eth,debug,miner,net,shh,txpool,personal,web3" --unlock 0 --allow-insecure-unlock --mine --miner.threads 1 --miner.etherbase "์ง€๊ฐ‘์ฃผ์†Œ" console 2>>./geth.log
  1. application.properties์— ๊ตฌ์ถ•ํ•œ ๋„คํŠธ์›Œํฌ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
web3.network.address=[blockchain private network address]
web3.network.chainId=[blockchain private network chain id]
web3.walletPrivateKey=[private key of server's wallet]

์ €์žฅ์†Œ ์„ค์ •

  1. AWS EC2 ํ™˜๊ฒฝ์— MariaDB๋ฅผ ์„ค์น˜ํ•˜๊ณ  MariaDB์˜ root ๊ณ„์ •์œผ๋กœ ํ”„๋กœ์ ํŠธ์˜ DB๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ํ”„๋กœ์ ํŠธ๋งŒ์˜ ๊ณ„์ •์„ ์ƒ์„ฑํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
$ sudo apt=get install mariadb-server

$ sudo systemctl start mariadb
$ sudo systemctl status mariadb

$ sudo mysql -u root

MariaDB [mysql]> CREATE DB [DB ์ด๋ฆ„]
  1. application.properties์˜ DB ์ฃผ์†Œ๋ฅผ MariaDB๊ฐ€ ์„ค์น˜๋œ AWS EC2๋กœ, JPA ์„ค์ •์„ create๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ํ”„๋กœ์ ํŠธ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
spring.datasource.url=jdbc:mariadb://[DB ์ฃผ์†Œ]/[DB ์ด๋ฆ„]
spring.datasource.username=[DB ๊ณ„์ • ์ด๋ฆ„]
spring.datasource.password=[DB ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ]

spring.datasource.driver-class-name=org.mariadb.jdbc.Driver

spring.jpa.hibernate.ddl-auto=create
spring.jpa.hibernate.naming.physical-strategy=org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
  1. application.properties์˜ JPA ์„ค์ •์„ update๋กœ ๋ณ€๊ฒฝํ•˜๊ณ  ์ฒจ๋ถ€ํ•œ ๋คํ”„๋ฐ์ดํ„ฐ sql์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
spring.jpa.hibernate.ddl-auto=update
  1. AWS EC2 ํ™˜๊ฒฝ์— Redis๋ฅผ ์„ค์น˜ํ•˜๊ณ  ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
$ sudo apt-get install redis-server

$ sudo vi /etc/redis/redis.conf
bind 0.0.0.0
daemonize yes // default == no
logfile /var/log/redis_6379.log
dir /var/redis/6379

$ sudo service redis-server start

$ redis-cli

redis 127.0.0.1:6379> CONFIG SET requirepass "๋น„๋ฐ€๋ฒˆํ˜ธ"
redis 127.0.0.1:6379> AUTH "๋น„๋ฐ€๋ฒˆํ˜ธ"

$ sudo systemctl restart mariadb
  1. application.properties์˜ Redis ์ฃผ์†Œ๋ฅผ Redis๊ฐ€ ์„ค์น˜๋œ ์ฃผ์†Œ๋กœ, ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์ง์ ‘ ์„ค์ •ํ•œ ๋น„๋ฐ€๋ฒˆํ˜ธ๋กœ ๋ณ€๊ฒฝํ•ฉ๋‹ˆ๋‹ค.
spring.redis.host=[Redis ์„ค์ • ์ฃผ์†Œ]
spring.redis.port=[Redis ์„ค์ • ํฌํŠธ]
spring.redis.password=[Redis ์„ค์ • ๋น„๋ฐ€๋ฒˆํ˜ธ]
  1. GCP ๊ณต์‹ ์‚ฌ์ดํŠธ์—์„œ ํ”„๋กœ์ ํŠธ์— ์‚ฌ์šฉํ•  Storage๋ฅผ ์ƒ์„ฑํ•˜๊ณ , Storage์˜ ์ •๋ณด๋ฅผ json ํŒŒ์ผ์„ ํ†ตํ•ด ํ”„๋กœ์ ํŠธ์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
spring.cloud.gcp.credentials.location=classpath:[json ํŒŒ์ผ ์œ„์น˜]
spring.cloud.gcp.storage.project-id=[GCP ์„ค์ • ID]
spring.cloud.gcp.storage.bucket=bucket-img-id=[GCP ์„ค์ • ID]
{
  "type": "service_account",
  "project_id": "project_id",
  "private_key_id": private_key_id",
  "private_key": "private_key",
  "client_email": "client_email",
  "client_id": "client_id",
  "auth_uri": "auth_uri",
  "token_uri": "token_uri",
  "auth_provider_x509_cert_url": "auth_provider_x509_cert_url",
  "client_x509_cert_url": "client_x509_cert_url"
}

V. ํ”„๋กœ์ ํŠธ ์ง„ํ–‰

๐Ÿ•‘ ํ”„๋กœ์ ํŠธ ์ง„ํ–‰ ๊ธฐ๊ฐ„

2023.02.20(์›”) ~ 2023.04.07(๊ธˆ) (47์ผ๊ฐ„ ์ง„ํ–‰)
SSAFY 8๊ธฐ 2ํ•™๊ธฐ ํŠนํ™” ํ”„๋กœ์ ํŠธ

1. git

git_convension gitflow

2. Jira

๋งค์ฃผ ์›”์š”์ผ ์˜ค์ „ ํšŒ์˜์—์„œ ์ฐจ์ฃผ์— ์ง„ํ–‰๋˜์–ด์•ผ ํ•  ๊ฒƒ๋“ค์„ ์ •๋ฆฌํ•˜๊ณ  ๋ฐฑ๋กœ๊ทธ์— ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ธˆ์ฃผ์— ์™„๋ฃŒํ•˜์ง€ ๋ชปํ•œ ์ด์Šˆ๋‚˜, ์•ž์œผ๋กœ ์ง„ํ–‰ํ•  ์ด์Šˆ๋“ค์„ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ํ”ฝ(epic)์€ ๊ตฌํ˜„ํ•˜๊ณ ์ž ํ•˜๋Š” ๊ธฐ๋Šฅ์„ ๊ธฐ์ค€์œผ๋กœ ๊ตฌ์„ฑํ•˜์˜€์Šต๋‹ˆ๋‹ค. (์˜ˆ: ๊ถŒํ•œ ๊ด€๋ฆฌ, ๋ธ”๋ก์ฒด์ธ ๋“ฑ)

์‹ค์งˆ์ ์ธ ์ž‘์—… ๊ฒฐ๊ณผ๋ฌผ์ด ๋‚˜์˜ค๋Š” ์—…๋ฌด๋Š” ์ž‘์—…(task)์œผ๋กœ, ๊ทธ๋ ‡์ง€ ์•Š์€ ์—…๋ฌด๋Š” ์Šคํ† ๋ฆฌ(story)๋กœ ํ• ๋‹นํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ ๋‹ด๋‹น์ž์™€ ์Šคํ† ๋ฆฌ ํฌ์ธํŠธ ์„ค์ •, ํ™œ์„ฑ ์Šคํ”„๋ฆฐํŠธ์—์„œ ํ˜„์žฌ ์—…๋ฌด์˜ ์ง„ํ–‰์— ๋”ฐ๋ผ ํ•  ์ผ, ์ง„ํ–‰์ค‘, ์™„๋ฃŒ ์‹ค์‹œ๊ฐ„์œผ๋กœ ๋ฐ˜์˜ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

image

3. Notion

ํŒ€์›๋“ค์ด ๋ชจ๋‘ ๊ณต์œ ํ•ด์•ผํ•  ์ž๋ฃŒ ๋ฐ ๋งํฌ๋ฅผ ๋…ธ์…˜์— ์ •๋ฆฌํ–ˆ์Šต๋‹ˆ๋‹ค. API ์„ค๊ณ„, ERD, ์ปจ๋ฒค์…˜์™€ ๊ฐ™์ด ์—ฌ๋Ÿฌ๋ฒˆ ๋‹ค์‹œ ๋ด์•ผํ•˜๊ณ  ์ค‘์š”ํ•œ ์ •๋ณด๋“ค์„ ๊ณต์œ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๋‹ฌ๋ ฅ์„ ๋งŒ๋“ค์–ด ํ™œ์šฉํ•จ์œผ๋กœ์จ ์ค‘์š”ํ•œ ์ผ์ •์€ ์žŠ์ง€ ์•Š๊ณ  ์ฑ™๊ธธ์ˆ˜ ์žˆ๊ฒŒ๋” ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

notion


VI. ํ”„๋กœ์ ํŠธ ์‚ฐ์ถœ๋ฌผ

๐Ÿ› ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜

์„œ๋น„์Šค์•„ํ‚คํ…์ฒ˜

๐ŸŽจ ํ™”๋ฉด ์„ค๊ณ„์„œ

๐Ÿ›ข๏ธŽ ERD

ERD

๐Ÿ“œ API ์„ค๊ณ„์„œ


VII. ํŒ€์› ์†Œ๊ฐœ

member

About

๐Ÿถ ๋ธ”๋ก์ฒด์ธ์„ ํ™œ์šฉํ•œ ๋™๋ฌผ ์˜๋ฃŒ ๊ธฐ๋ก ๊ด€๋ฆฌ ๋ฐ ๊ถŒ๋ฆฌ ๋ณดํ˜ธ ํ”Œ๋žซํผ

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages