[go: nahoru, domu]

Skip to content

MeoSeon12/egodaeyeo-backend

Folders and files

NameName
Last commit message
Last commit date

Latest commit

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

Repository files navigation

ํ”„๋กœ์ ํŠธ

Screen Shot 2022-08-05 at 6 55 15 PM

๋ฐฐํฌ ์‚ฌ์ดํŠธ : https://www.egorental.com
ํ”„๋กœ์ ํŠธ ์ผ์ • : 2022.07.07 ~ 2022.08.16

ํ”„๋ก ํŠธ์—”๋“œ ๊นƒํ—™ ๋งํฌ : https://github.com/MeoSeon12/egodaeyeo-frontend
๋ฐฑ์—”๋“œ ๊นƒํ—™ ๋งํฌ : https://github.com/MeoSeon12/egodaeyeo-backend
S.A ๋งํฌ : https://quixotic-wok-871.notion.site/S-A-3183ff7202e942099238af3effd956ea


1. ํ”„๋กœ์ ํŠธ ์ฃผ์ œ

๋‹น๊ทผ๋งˆ์ผ“ ๋ชจํ‹ฐ๋ธŒ ๊ฐœ์ธ ๊ฐ„ ๋Œ€์—ฌ ์„œ๋น„์Šค ํ”Œ๋žซํผ

์ค‘๊ณ ๋ฌผํ’ˆ์„ ์‚ฌ๊ณ  ํŒ” ์ˆ˜ ์žˆ๋Š” ํ”Œ๋žซํผ์€ ๋Œ€ํ‘œ์ ์œผ๋กœ ์ค‘๊ณ ๋‚˜๋ผ์™€ ๋‹น๊ทผ๋งˆ์ผ“์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ
์ž ๊น ๋™์•ˆ ํ•„์š”ํ•œ ๋ฌผ๊ฑด์ด๋‚˜, ๋‚ด๊ฐ€ ์‚ฌ๊ณ  ์‹ถ์—ˆ๋˜ ๋ฌผ๊ฑด์„ ๋นŒ๋ ค์„œ ์จ๋ณด๊ธฐ ์œ„ํ•œ
๋Œ€์—ฌ ์„œ๋น„์Šค๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ํ”Œ๋žซํผ์ด ์žˆ์œผ๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์ƒ๊ฐ์—์„œ ์ถœ๋ฐœํ–ˆ์Šต๋‹ˆ๋‹ค.

2. ๋จธ์„ 12์กฐ ํŒ€์› ๋ฐ ์—ญํ• 

  • ๊น€๊ทœ๋ฏผ @Roshu2

    ๋ฌผํ’ˆ ๋ชฉ๋ก ํŽ˜์ด์ง€ / ๋งˆ์ดํŽ˜์ด์ง€ / ์†Œ์…œ๋กœ๊ทธ์ธ / ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ / Contract ๊ธฐ๋Šฅ / ์ฑ„ํŒ… ๊ธฐ๋Šฅ / ๋ฐฑ์—”๋“œ ๋ฐฐํฌ

  • ๊น€์ฒ ํ˜„ @KimmyJay

    ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ / ์†Œ์…œ๋กœ๊ทธ์ธ / ๋ฆฌ๋ทฐ ๋ชจ๋‹ฌ / ์ฑ„ํŒ… ๋ชจ๋‹ฌ / ์ฑ„ํŒ… ๊ธฐ๋Šฅ / ๋‹คํฌ๋ชจ๋“œ / ์‹ ๊ณ  ๊ธฐ๋Šฅ / ๋ฐฑ์—”๋“œ ๋ฐฐํฌ

  • ์ตœ์žฌ์™„ @Jaewan-Choi

    ์ฑ„ํŒ… ๊ธฐ๋Šฅ / ์•Œ๋ฆผ ๊ธฐ๋Šฅ / ๋ฌผํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€ / ๋ฌผํ’ˆ ๋“ฑ๋ก, ์ˆ˜์ • ํŽ˜์ด์ง€ / ํ”„๋ก ํŠธ ๋ฐฐํฌ / ๋‹คํฌ๋ชจ๋“œ / ๋ฉ”์ธํŽ˜์ด์ง€ ์›ฐ์ปด ๋ฐ•์Šค


3. ํ”„๋กœ์ ํŠธ ๊ธฐ๋Šฅ

  • ํšŒ์›๊ฐ€์ž… / ๋กœ๊ทธ์ธ

    • ์ผ๋ฐ˜ ํšŒ์›๊ฐ€์ž…์‹œ ์•„์ด๋””์™€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์ •๊ทœํ‘œํ˜„์‹ ํ•„ํ„ฐ๋ง๋จ
    • ๋‹ค์Œ์ฃผ์†Œ API๋ฅผ ์‚ฌ์šฉํ•ด ๊ฐ„ํŽธํ•œ ์ฃผ์†Œ ์ž…๋ ฅ
    • ์นด์นด์˜คํ†ก ์†Œ์…œ ํšŒ์›๊ฐ€์ž…์‹œ ์ฃผ์†Œ๋ฅผ ์ถ”๊ฐ€์ ์œผ๋กœ ์ž…๋ ฅํ•˜๋„๋ก ์šฐํšŒํ•œ ํ›„ PUT์œผ๋กœ ์ˆ˜์ •
    • ๋กœ๊ทธ์ธ์‹œ JWT ํ† ํฐ ๋ฐœ๊ธ‰ ํ›„ ํ† ํฐ ํŽ˜์ด๋กœ๋“œ์—๋Š” ์œ ์ €PK๊ฐ’์ด ์ €์žฅ๋จ
  • ๋ฌผํ’ˆ ์กฐํšŒ

    • ์‚ฌ์šฉ์ž ์ฃผ์†Œ์˜ ์‹œ๊ตฐ๊ตฌ๊นŒ์ง€๋งŒ splitํ•œ ํ›„ Q๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด์„œ ์‹œ๊ตฐ๊ตฌ๊ฐ€ ํฌํ•จ๋œ ๋ฌผํ’ˆ๋งŒ __contains filterํ•˜์—ฌ ๊ฐ™์€ ์ง€์—ญ๋งŒ ์กฐํšŒ
    • ํŒŒ๋ผ๋ฏธํ„ฐ์— ์นดํ…Œ๊ณ ๋ฆฌ๋ฅผ ๋‹ด์•„์„œ request.GET.get์„ ํ†ตํ•ด ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ํ›„ Q๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด์„œ filterํ•˜์—ฌ ๋‹ค์–‘ํ•œ ์นดํ…Œ๊ณ ๋ฆฌ๋ณ„๋กœ ๊ฒŒ์‹œ๊ธ€ ์กฐํšŒ
    • ๊ฒ€์ƒ‰ ์ž…๋ ฅ๊ฐ’์„ ํŒŒ๋ผ๋ฏธํ„ฐ์— ๋‹ด์•„์„œ request.GET.get์œผ๋กœ ๊ฐ’์„ ๋ณ€์ˆ˜์— ์ €์žฅํ•œ ํ›„ Q๊ฐ์ฒด๋ฅผ ํ™œ์šฉํ•ด์„œ __icontains filterํ•˜์—ฌ ์ œ๋ชฉ์œผ๋กœ ๊ฒ€์ƒ‰
    • item์˜ id๊ฐ’์„ url์— ํฌํ•จํ•ด ItemModel์—์„œ ํ•ด๋‹น id๊ฐ’์œผ๋กœ objects.get ํ•œ ๋’ค serializer์—์„œ ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ ์ง๋ ฌํ™” ํ•œ ํ›„ returnํ•˜์—ฌ ์ƒ์„ธ ์ •๋ณด ์กฐํšŒ
  • ๋ฌผํ’ˆ ๋“ฑ๋ก / ์ˆ˜์ • / ์‚ญ์ œ

    • ์‚ฌ์šฉ์ž์˜ ์ธํ’‹๊ฐ’์„ ๋ฐ›์€ ํผ๋ฐ์ดํ„ฐ๋ฅผ POST ์š”์ฒญ์„ ํ†ตํ•ด DB์— ์ €์žฅ
    • ํ”„๋ก ํŠธ์—์„œ๋Š” ์ธํ’‹์˜ ํฌ๋งท์— ์ œํ•œ ๋‘๊ธฐ, null ์ฒดํฌ ๋“ฑ์„ ์ง„ํ–‰
    • ๋ฐฑ์—”๋“œ์—์„œ๋Š” ๋ฒจ๋ฆฌ๋ฐ์ด์…˜์„ ํ†ตํ•ด ๋ชจ๋ธ์— ์ ํ•ฉํ•œ ๋ฐ์ดํ„ฐ์ธ์ง€ ๊ฒ€์‚ฌ
    • ์ˆ˜์ • ์‹œ ๊ฒŒ์‹œ๊ธ€์˜ ID๊ฐ’์„ ํ™œ์šฉํ•˜์—ฌ GET ์š”์ฒญ์œผ๋กœ DB์— ์ €์žฅ๋œ ๋ฐ์ดํ„ฐ๋ฅผ ํ™œ์šฉ
    • ์ˆ˜์ • ์‹œ ์ตœ์ข…์ ์œผ๋กœ ์ˆ˜์ •๋œ ๋ฐ์ดํ„ฐ๋ฅผ PUT ์š”์ฒญ์„ ํ†ตํ•ด DB์— ๋ฐ˜์˜
    • ์‚ญ์ œ ์‹œ ์ž‘์„ฑ์ž ๋ณธ์ธ ์—ฌ๋ถ€๋ฅผ ํ† ํฐ์˜ payload์™€ DB์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ต์ฐจ๊ฒ€์ฆ์„ ํ†ตํ•ด ์ฒดํฌ ํ›„ ์‚ญ์ œ
  • ์‹ ๊ณ 

    • ๋ฌผํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€์—์„œ ๋ถ€์ ์ ˆํ•˜๋‹ค๊ณ  ํŒ์ •๋˜๋Š” ๋ฌผํ’ˆ ์‹ ๊ณ  ๊ฐ€๋Šฅ
    • ๋“œ๋ž๋‹ค์šด ๋ฉ”๋‰ด๋กœ ์‹ ๊ณ  ์‚ฌ์œ  ์„ ํƒ, ์ถ”๊ฐ€์ ์ธ ๋‚ด์šฉ ์ž‘์„ฑ ๊ฐ€๋Šฅ
    • ์ด๋ฏธ ์‹ ๊ณ ํ•œ ๋ฌผํ’ˆ์€ ์ค‘๋ณต์‹ ๊ณ  ๋ถˆ๊ฐ€
  • ๋ฆฌ๋ทฐ

    • ๋งˆ์ดํŽ˜์ด์ง€์™€ ์ฑ„ํŒ…๋ชจ๋‹ฌ์—์„œ ๋Œ€์—ฌ์ข…๋ฃŒ๋œ ๋ฌผํ’ˆ์˜ ๋ฆฌ๋ทฐ์“ฐ๊ธฐ ๊ฐ€๋Šฅ.
    • ๋Œ€์—ฌ์ž๋Š” ๋ณ„์ (1-5)๋ฅผ ์„ ํƒ ํ›„ ์ถ”๊ฐ€์ ์ธ ๋ฆฌ๋ทฐ ์ž‘์„ฑ ๊ฐ€๋Šฅ.
    • ๋ณ„์ ์€ 100์  ์Šค์ผ€์ผ๋กœ ์ „ํ™˜๋œ ํ›„ ์œ ์ €์ ์ˆ˜์— ๋ฐ˜์˜๋จ.
    • ๋ฆฌ๋ทฐ๋Š” ๋ฌผํ’ˆ ์ƒ์„ธํŽ˜์ด์ง€์— ์ž๋™์ ์œผ๋กœ ๋ฐ˜์˜๋จ.
  • ์ฑ„ํŒ…

    • ๊ฐœ๋ณ„ ์ฑ„ํŒ…๋ฐฉ ์˜คํ”ˆ ์‹œ ๊ฐœ๋ณ„ ์ฑ„ํŒ…๋ฐฉ์˜ ID๊ฐ’์„ ํ™œ์šฉํ•ด ์ฑ„ํŒ…๋ฐฉ ๋งˆ๋‹ค ๋‹ค๋ฅธ ์›น์†Œ์ผ“ ์ฃผ์†Œ์— ์—ฐ๊ฒฐ
    • ์ฑ„ํŒ… ์ž‘์„ฑ ํ˜น์€ ๊ฑฐ๋ž˜ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ์‹œ send()๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฐฑ์—”๋“œ์— ์ „์†ก
    • Django Channels์˜ @database_sync_to_async ๋ฐ์ฝ”๋ ˆ์ดํ„ฐ์™€ create() ๋ฉ”์†Œ๋“œ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ DB์— ์ €์žฅ
    • ์ฑ„ํŒ… ๊ทธ๋ฃน์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•˜๊ณ  sender ๊ฐ’์„ ์ฒดํฌํ•˜์—ฌ ์ž‘์„ฑ์ž์™€ ์ˆ˜์‹ ์ž์— ๋งž๊ฒŒ ๋ ˆ์ด์•„์›ƒ์„ ๋ณด์—ฌ์คŒ
    • ์ฑ„ํŒ…๋ฐฉ์„ ๋‹ซ๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ์ฑ„ํŒ…๋ฐฉ ์˜คํ”ˆ ์‹œ ๊ธฐ์กด ์ ‘์† ์ฑ„ํŒ… ์›น์†Œ์ผ“ websocket.close() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์—ฐ๊ฒฐ์„ ๋Š์Œ
  • ์ฑ„ํŒ… ์•Œ๋ฆผ

    • ๋กœ๊ทธ์ธ ์‹œ ์œ ์ € ๊ณ ์œ ์˜ ์›น์†Œ์ผ“ ์ฃผ์†Œ๋กœ ์—ฐ๊ฒฐ
    • ์ฑ„ํŒ…์„ ๋ณด๋‚ผ ๋•Œ ์ˆ˜์‹  ์œ ์ €์˜ ์›น์†Œ์ผ“ ์ฃผ์†Œ๋กœ send()
    • Django Channels๋กœ wss ํ”„๋กœํ† ์ฝœ(ASGI)์„ ์ฒ˜๋ฆฌ
    • ์ฑ„ํŒ… ๋ฉ”์‹œ์ง€ DB ๋ชจ๋ธ์— is_read ํ•„๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ ์ฝ์€ ์—ฌ๋ถ€๋ฅผ ํŒ๋‹จ ํ›„ ์•Œ๋ฆผ์„ ๋ณด๋ƒ„
    • ์ˆ˜์‹ ์ž๋Š” onmessage()๋ฅผ ํ†ตํ•ด ์‘๋‹ต ๋ฐ์ดํ„ฐ๋ฅผ ์ฒ˜๋ฆฌ
    • ์ฑ„ํŒ…์„ ์ฝ์œผ๋ฉด is_read ํ•„๋“œ๋ฅผ True๋กœ ์ˆ˜์ •
  • ๋งˆ์ดํŽ˜์ด์ง€

    • ๋งˆ์ดํŽ˜์ด์ง€์˜ ์ขŒ์ธก ํƒญ๋ณ„๋กœ html์˜ id๊ฐ’์„ ongoing, closed, bookmarks, myitems ๋กœ ์ง€์ •ํ•œ ๋’ค tab์ด๋ผ๋Š” ์ด๋ฆ„์œผ๋กœ ํŒŒ๋ผ๋ฏธํ„ฐ์— id๊ฐ’์„ GET์š”์ฒญํ• ๋•Œ ๋‹ด์•„์„œ ๋ฐฑ์—”๋“œ๋กœ ๋ณด๋‚ด๊ณ  request.GET.get์œผ๋กœ ๋ฐ›์€ ๊ฐ’์„ ์กฐ๊ฑด๋ฌธ์„ ํ†ตํ•ด ๋น„๊ตํ•ด์„œ ํ•ด๋‹น ๊ฐ’์— ํ•„์š”ํ•œ Data๋ฅผ filter ํ›„ returnํ•˜์—ฌ ๋Œ€์—ฌ ๋‚ด์—ญ, ์ฐœ ๋ชฉ๋ก, ๋‚ด๊ฐ€ ์˜ฌ๋ฆฐ ๋ฌผํ’ˆ ์กฐํšŒ
    • ํšŒ์› ์ •๋ณด๋ฅผ ํ•œ๊ฐ€์ง€๋งŒ ์ˆ˜์ •ํ•ด๋„ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์กฐ๊ฑด๋ฌธ์„ ํ™œ์šฉ, request.data๋Š” immutableํ•œ QueryDict์ด๊ธฐ ๋•Œ๋ฌธ์— request.data๋ฅผ data๋ผ๋Š” ๋ณ€์ˆ˜์— ๋‹ด๊ณ  data = data.copy()๋กœ ๋ณต์‚ฌํ•˜์—ฌ ๋ณต์‚ฌํ•œ ๋ฐ์ดํ„ฐ๋ฅผ data๋กœ ๋ฎ์–ด์”Œ์šด๋’ค data.pop(โ€์ˆ˜์ •์•ˆํ•œ ํ•ญ๋ชฉโ€) ํ•˜์—ฌ serializer๋กœ data๋ฅผ ๋ณด๋ƒ„.
    • ํšŒ์›์ •๋ณด ์ค‘ ๋น„๋ฐ€๋ฒˆํ˜ธ ์ˆ˜์ •์‹œ django์˜ ๋‚ด์žฅํ•จ์ˆ˜์ธ check_password๋ฅผ ํ™œ์šฉํ•ด์„œ ํ˜„์žฌ ๋น„๋ฐ€๋ฒˆํ˜ธ์™€ ์ž…๋ ฅํ•œ ํ˜„์žฌ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์ผ์น˜ํ•œ์ง€ check
  • ๋‹คํฌ๋ชจ๋“œ

    • ๋กœ๊ทธ์ธ ์œ ์ €์˜ ๋กœ์ปฌ ์Šคํ† ๋ฆฌ์ง€์— ๋‹คํฌ๋ชจ๋“œ ์—ฌ๋ถ€๋ฅผ ์ €์žฅ
    • ๋กœ์ปฌ์Šคํ† ๋ฆฌ์ง€์˜ ๋‹คํฌ๋ชจ๋“œ ๊ฐ’์„ if๋ฌธ์˜ ๋ถ„๊ธฐ์ ์œผ๋กœ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์„ ์ ์šฉ

4. ๊ธฐ์ˆ  ์Šคํƒ

  • ๋ฐฑ์—”๋“œ

    • Python 3.9
    • Django 4.0
    • Django Rest Framework 3.13
    • Django Rest Framework simple-jwt 5.2.0
    • Django Channels 3.0.5
    • Docker 20.10.12
    • Nginx 1.22.0
    • Gunicorn 20.1.0
    • Daphne 3.0.2
  • ํ”„๋ก ํŠธ์—”๋“œ

    • Websocket
    • HTML5
    • Javascript
    • JQuery
    • CSS
  • ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค

    • AWS RDS PostgreSQL
    • AWS S3
  • ๋ฐฐํฌ

    • AWS EC2
    • AWS Route 53
    • Github Actions
    • Netlify

4-1. ๊ธฐ์ˆ  ์Šคํƒ ์„ ์ • ์ด์œ 

  • Django / DRF

    Serializer, ์œ ์ € ๊ด€๋ฆฌ, REST API ๋“ฑ Django์—์„œ ์ œ๊ณตํ•˜๋Š” ๋‹ค์–‘ํ•œ ๊ธฐ๋Šฅ๋“ค์„ ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ์ฑ„์šฉ

  • Django Channels

    ์‹ค์‹œ๊ฐ„ ๋น„๋™๊ธฐ๋กœ ๋“ค์–ด์˜ค๋Š” ws/wss ํ”„๋กœํ† ์ฝœ์„ ์žฅ๊ณ ์—์„œ ๋Œ€์‘ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

  • Django Rest Framework simple-jwt

    ์œ ์ € ์ธ์ฆ์„ ํ† ํฐ๋ฐฉ์‹์œผ๋กœ ์•”ํ˜ธํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ

  • Websocket

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

  • Netlify

    ๊ฐ€์žฅ ๊ฐ„ํŽธํ•˜๊ณ  ๋น„์šฉ ์ง€๋ถˆ์—†์ด ์ •์  ์›น์‚ฌ์ดํŠธ ํ˜ธ์ŠคํŒ…์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ, ํŠน๋ณ„ํ•œ ์„ค์ •์—†์ด ๊นƒํ—™๊ณผ๋„ ๋™๊ธฐํ™”๋˜๋ฏ€๋กœ ์‚ฌ์šฉ

  • AWS EC2

    ์šฉ๋Ÿ‰์„ ์ค„์ด๊ฑฐ๋‚˜ ๋Š˜๋ฆด ์ˆ˜ ์žˆ๋Š” ํƒ„๋ ฅ์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ณ , ๋ณด์•ˆ ๋ฐ ๋„คํŠธ์›Œํฌ ๊ตฌ์„ฑ, ์Šคํ† ๋ฆฌ์ง€ ๊ด€๋ฆฌ์— ํšจ๊ณผ์ ์ด๋ฉฐ ๊ฐ„๋‹จํ•œ ํ”„๋กœ์ ํŠธ ๋ฐฐํฌ๋ฅผ ํ”„๋ฆฌํ‹ฐ์–ด๋กœ ๋ฌด๋ฃŒ๋กœ ์ด์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์ฑ„์šฉ

  • AWS S3

    ์„œ๋น„์Šค์—์„œ ์ด๋ฏธ์ง€๋ฅผ ์—…๋กœ๋“œ ํ• ๋•Œ, EC2์— ์ €์žฅ์„ ํ•˜๊ฒŒ๋˜๋ฉด ์šฉ๋Ÿ‰์ด ๋ถ€์กฑํ•ด์ง€๊ณ  ํŒŒ์ผ๋“ค์„ ๊ด€๋ฆฌํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํŒŒ์ผ ์ €์žฅ์— ์ตœ์ ํ™” ๋˜์–ด์žˆ๊ณ , ์ €์žฅ์šฉ๋Ÿ‰์ด ๋ฌดํ•œ๋Œ€์— ๊ฐ€๊นŒ์šด S3๋ฅผ ์‚ฌ์šฉํ•ด์„œ ์ด๋ฏธ์ง€ ํŒŒ์ผ๋“ค์„ ์ €์žฅํ•˜๊ณ  ๊ด€๋ฆฌ ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Github actions

    ํ”„๋กœ์ ํŠธ๊ฐ€ ์—…๋ฐ์ดํŠธ ๋  ๋•Œ๋งˆ๋‹ค ์ˆ˜๋™์œผ๋กœ ๋ฐฐํฌ ์„œ๋ฒ„๋ฅผ ์—…๋ฐ์ดํŠธ ํ•ด์•ผํ•˜๋Š” ๋ถˆํŽธํ•จ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ๊นƒํ—™๊ณผ ์ž๋™์œผ๋กœ ๋™๊ธฐํ™”๋ฅผ ์ง€์›ํ•˜๋Š” ๊นƒํ—™ ์•ก์…˜์„ ์ฑ„์šฉ

  • Docker

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

  • Nginx

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

  • Gunicorn

    ๋กœ์ปฌ๊ฐœ๋ฐœํ™˜๊ฒฝ์—์„œ๋Š” django์˜ runserver๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ gunicorn์ด ์—†์–ด๋„ ์œ ์šฉํ•˜๊ฒŒ ์‚ฌ์šฉ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ๋ฐฐํฌํ™˜๊ฒฝ์—์„œ๋Š” runserver๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋„๋ก django์—์„œ๋„ ๊ถŒ์žฅ๋˜์–ด์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ Python WSGI ๋Œ€ํ‘œ์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ๊ฒ€์ฆ๋œ Gunicorn์„ ํ™œ์šฉํ•ด์„œ Nginx๋กœ๋ถ€ํ„ฐ ๋ฐ›์€ ์„œ๋ฒ„์‚ฌ์ด๋“œ ์š”์ฒญ์„ gunicorn์„ ํ™œ์šฉํ•ด์„œ django๋กœ ์ „๋‹ฌํ•˜๊ฒŒ๋” ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • Daphne

    Gunicorn์ด WSGI HTTP์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•œ๋‹ค๋ฉด ์ €ํฌ ์„œ๋น„์Šค์— ์žˆ๋Š” ์ฑ„ํŒ…๊ธฐ๋Šฅ์€ ASGI WS ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Daphne๋Š” Channels ๋ฅผ ์„ค์น˜ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์„ค์น˜๋˜๋ฉฐ Channels์—์„œ ์ง€์›ํ•˜๋Š” ์„œ๋ฒ„๋กœ ASGI ํ”„๋กœํ† ์ฝœ๋กœ ๋ฐ›์€ WS์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋ ค๊ณ  ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.

  • PostgreSQL

    PostgreSQL์€ MySQL๋ณด๋‹ค ํ‘œ์ค€์— ๋” ๊ฐ€๊น๊ฒŒ ๊ตฌํ˜„ํ•˜๋Š”๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ๋‘๊ณ ์žˆ๊ณ , ์˜คํ”ˆ์†Œ์Šค ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ๊ฐ€ ์ด๋„๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ์ž…๋‹ˆ๋‹ค. django์—์„œ ๊ฐ€์žฅ ๊ถŒ์žฅํ•˜๋Š” RDBMS๊ฐ€ PostgreSQL์ด์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๋ฅผ ์ง์ ‘ ์‚ฌ์šฉํ•ด๋ด„์œผ๋กœ์จ MySQL๊ณผ๋Š” ์–ด๋– ํ•œ ์ฐจ์ด์ ์ด ์žˆ๋Š”์ง€ ๊ณต๋ถ€๋„ ํ•˜๊ณ , ๋‹ค๋ฅธ RDBMS๋ฅผ ์‚ฌ์šฉํ•ด๋ด„์œผ๋กœ์จ ๊ฒฝํ—˜์น˜๋ฅผ ์Œ“๊ณ ์ž ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค.


5. ์•„ํ‚คํ…์ณ

image


6. ์œ ์ € ํ”ผ๋“œ๋ฐฑ ๋ฐ˜์˜

  • ํ”ผ๋“œ๋ฐฑ ๊ธฐ๊ฐ„ : 22.08.08 ~ 22.08.12
  • ํ”ผ๋“œ๋ฐฑ ์‘๋‹ต ์ˆ˜ : 44๊ฐœ

6-1. 401 ์—๋Ÿฌ

  • ์›์ธ : ๋ฆฌํ”„๋ ˆ์‹œ ํ† ํฐ์„ ๊ฐฑ์‹ ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ํŽ˜์ด์ง€ ๋กœ๋“œ ์‹œ์—๋งŒ ์ž‘๋™ํ•˜๊ณ , ๋น„๋™๊ธฐ ๊ธฐ๋Šฅ์„ ์‹คํ–‰ ์‹œ์—๋Š” ํ•ด๋‹น ํ•จ์ˆ˜๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š์Œ
  • ๊ฐœ์„  : ํ† ํฐ ๊ฐฑ์‹ ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ๊ธฐ๋Šฅ๋งˆ๋‹ค ํ˜ธ์ถœํ•˜๋„๋ก ์ˆ˜์ •
async function onAddressEnter() {
  var payload = JSON.parse(localStorage.getItem('payload'))
  const token = await refreshToken(payload)

6-2. UI / UX ๊ฐœ์„ 

  • ์›์ธ : ๋ฒ„ํŠผ ์•„์ด์ฝ˜๋“ค์˜ ๊ฐ€์‹œ์„ฑ๊ณผ ๋Œ€์—ฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ์ด ์ฑ„ํŒ…์ฐฝ์—๋งŒ ์กด์žฌํ•จ์œผ๋กœ ์ธํ•ด ์ ‘๊ทผ์„ฑ ๋ถ€์กฑ

  • ๊ฐœ์„ 

    • ์นดํ…Œ๊ณ ๋ฆฌ ๋ฒ„ํŠผ๋“ค์„ ํ˜ธ๋ฒ„์‹œ ๋“ฑ์žฅํ•˜๋Š” ๋ชจ๋‹ฌ์ด ์•„๋‹Œ ํŽ˜์ด์ง€์—์„œ ๋ฐ”๋กœ ๋ณด๊ณ  ์„ ํƒํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ฐœ์„ 
    • ๋ฌผํ’ˆ ๋“ฑ๋ก ๋ฒ„ํŠผ์„ fixed ๋œ ๋ฐ•์Šค์•ˆ์—๋„ ์ถ”๊ฐ€ํ•˜์—ฌ ํ•ญ์ƒ ๋ˆˆ์— ๋ณด์ด๊ณ  ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๋„๋ก ์ถ”๊ฐ€
    • ๋Œ€์—ฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๊ธฐ๋Šฅ๋“ค์„ ๋งˆ์ดํŽ˜์ด์ง€์—์„œ๋„ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋„๋ก ์ถ”๊ฐ€
๊ฐœ์„ ๋œ ์ด๋ฏธ์ง€ ๋ณด๊ธฐ

6-3. ์‹ ๊ณ  ๊ธฐ๋Šฅ

  • ์›์ธ : ๋ถ€์ ์ ˆํ•œ ๊ฒŒ์‹œ๊ธ€์„ ์‹ ๊ณ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๋ถ€์žฌ

  • ๊ฐœ์„ 

    • ์‹ ๊ณ  ๋‚ด์šฉ์„ ์ €์žฅํ•˜๋Š” DB ๋ชจ๋ธ์„ ์ถ”๊ฐ€
    • ์‚ฌ์šฉ์ž๊ฐ€ ํŠน์ • ๊ฒŒ์‹œ๊ธ€์— ๋Œ€ํ•ด ์‹ ๊ณ  ์‚ฌ์œ ๋ฅผ ์„ ํƒ, ๋‚ด์šฉ ์ž‘์„ฑ ํ›„ ์šด์˜์ง„์—๊ฒŒ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ์‹œ์Šคํ…œ ๊ตฌ์ถ•

7. ๋ฒ„์ „

  • v1.0

    • ๋ฐฐํฌ
  • v1.01

    • 401 ์—๋Ÿฌ ์ˆ˜์ •
    • ์ฑ„ํŒ… ์•Œ๋ฆผ ๋™๊ธฐํ™”
    • ์žฌ๊ฑฐ๋ž˜ ์‹œ ์—๋Ÿฌ ์ˆ˜์ •
  • v1.1

    • ๋ฌผํ’ˆ ํŽ˜์ด์ง€์™€ ์‚ฌ์ดํŠธ ์†Œ๊ฐœ ํŽ˜์ด์ง€ ๋ณ‘ํ•ฉ
    • ์นดํ…Œ๊ณ ๋ฆฌ & ์„น์…˜ ํ•„ํ„ฐ UI ๋ณ€๊ฒฝ
    • ๋งˆ์ดํŽ˜์ด์ง€์— ๋Œ€์—ฌ ์ƒํƒœ ์—…๋ฐ์ดํŠธ ๋ฒ„ํŠผ ์ถ”๊ฐ€
  • v1.2

    • ์‹ ๊ณ ๊ธฐ๋Šฅ ์ถ”๊ฐ€
    • ๋‹คํฌ๋ชจ๋“œ ์ถ”๊ฐ€

8. API ๋ช…์„ธ์„œ

ํฌ์ŠคํŠธ๋งจ DOCS ๋ฐ”๋กœ๊ฐ€๊ธฐ


9. DB ์„ค๊ณ„ ERD

https://www.erdcloud.com/d/zfZo5E3pKdEorSGBX


10. ๋ฐœํ‘œ ์˜์ƒ ๋ฐ PPT

YouTube ๋ฐ”๋กœ๊ฐ€๊ธฐ
๊ตฌ๊ธ€ ์Šฌ๋ผ์ด๋“œ ๋ฐ”๋กœ๊ฐ€๊ธฐ

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published