HOTSIX-TRELLO

๐Ÿํ”„๋กœ์ ํŠธ ๋ชฉํ‘œ

"HOTSIX ๋จน๊ณ  ํž˜๋‚ด์„œ ์ผํ•˜๋Š” Trello ์„œ๋น„์Šค ํ”„๋กœ์ ํŠธ!!!" ์ด ๋ฌธ์„œ๋Š” Trello ํ”„๋กœ์ ํŠธ์˜ API ๋ช…์„ธ์„œ, ์ฃผ์š” ๊ธฐ๋Šฅ ๋ฐ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ๋‚ด์šฉ์„ ํฌํ•จํ•˜๊ณ , ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” ์‚ฌ์šฉ์ž ์นœํ™”์ ์ธ ์—…๋ฌด ์ผ์ • ๊ด€๋ฆฌ ํˆด์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘จโ€๐Ÿ‘ฉโ€๐Ÿ‘งโ€๐Ÿ‘ฆ Our Team

๊น€์„ฑ์ฃผ ๋ฐ•๋Œ€ํ˜„ ์ž„์ฑ„๊ทœ ์ •์ง„ํ˜ธ

๐Ÿ† API ๋ช…์„ธ์„œ

1๏ธโƒฃ ํšŒ์›๊ฐ€์ž…/๋กœ๊ทธ์ธ ๊ธฐ๋Šฅ ๋ฐ TICKET ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ (๋‹ด๋‹น : ๊น€์„ฑ์ฃผ)

image

2๏ธโƒฃ MEMBER ๋ฐ KANBAN ๊ธฐ๋Šฅ (๋‹ด๋‹น : ์ž„์ฑ„๊ทœ)

image

3๏ธโƒฃ WORKSPACE ๋ฐ COMMENT ๊ธฐ๋Šฅ (๋‹ด๋‹น : ์ •์ง„ํ˜ธ)

image

4๏ธโƒฃ BOARD ๋ฐ TICKET ๊ธฐ๋Šฅ (๋‹ด๋‹น : ๋ฐ•๋Œ€ํ˜„)

image image image


๐Ÿ“‹ ERD Diagram

image


๐Ÿ“‹ ์™€์ด์–ดํ”„๋ ˆ์ž„

image


ํ”„๋กœ์ ํŠธ ํ•ต์‹ฌ๊ธฐ๋Šฅ

๐Ÿ”” ์ฒจ๋ถ€ํŒŒ์ผ ๋“ฑ๋ก

  • AMAZON S3๋ฅผ ์ด์šฉํ•˜์—ฌ, ํ‹ฐ์ผ“์˜ ์ฒจ๋ถ€ํŒŒ์ผ์„ ๋“ฑ๋กํ•˜๊ณ , ์ˆ˜์ •, ์‚ญ์ œํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์„ ๊ตฌํ˜„ ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ๋ณ„๋„์˜ ์ฒจ๋ถ€ํŒŒ์ผ ENTITY๋ฅผ ์ƒ์„ฑํ•˜์—ฌ ์—ฐ๊ด€๊ด€๊ณ„๋ฅผ ๋งบ์Œ์œผ๋กœ์จ ํ•˜๋‚˜์˜ ํ‹ฐ์ผ“์— ์—ฌ๋Ÿฌ ๊ฐœ์˜ ํŒŒ์ผ ์ฒจ๋ถ€๊ฐ€ ๊ฐ€๋Šฅํ•˜๋„๋ก ์„ค๊ณ„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.

๐Ÿ“ข Slack ์•Œ๋ฆผ๊ธฐ๋Šฅ

  • Slack API๋ฅผ ์ด์šฉํ•˜์—ฌ, ํŠน์ • ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ Slack์œผ๋กœ ์•Œ๋ฆผ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ์ƒˆ๋กœ์šด ๋ฉค๋ฒ„๊ฐ€ ์ถ”๊ฐ€๋˜์—ˆ์„ ๋•Œ, ํ•ด๋‹น ๋ฉค๋ฒ„๊ฐ€ ์–ด๋Š ์›Œํฌ์ŠคํŽ˜์ด์Šค์— ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค
  • ํ‹ฐ์ผ“์— ์ƒˆ๋กœ์šด ๋Œ“๊ธ€์ด ๋“ฑ๋ก๋˜์—ˆ์„ ๋•Œ, ์–ด๋Š ํ‹ฐ์ผ“์— ๋Œ“๊ธ€์ด ๋“ฑ๋ก๋˜์—ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ—จ ์นธ๋ฐ˜ ๋ณด๋“œํ˜•์‹์˜ ํ˜‘์—… ํˆด (CRUD)

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

๐Ÿ” ๊ฒ€์ƒ‰ ๊ธฐ๋Šฅ(๋‚ด์šฉ,์ œ๋ชฉ,๋งˆ๊ฐ์ผ,๋‹ด๋‹น์ž,๋ณด๋“œID ๊ฒ€์ƒ‰๊ธฐ๋Šฅ)

  • QueryDSL์„ ํ™œ์šฉํ•˜์—ฌ ๋™์  ์ฟผ๋ฆฌ์ž‘์„ฑ์ด ๊ฐ€๋Šฅํ•˜๋„๋ก ๊ตฌํ˜„ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • ticket์˜ ์ œ๋ชฉ, ๋‚ด์šฉ, ๋งˆ๊ฐ์ผ, ๋‹ด๋‹น์ž ๋ฐ ๋ณด๋“œID ๋กœ ํ˜„์žฌ ์œ ์ €๊ฐ€ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” workspace ์•ˆ์—์„œ ๊ฒ€์ƒ‰์„ ํ•ด ์ค๋‹ˆ๋‹ค.

๐Ÿ“Š ๋™์‹œ์„ฑ์ œ์–ด

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

๐Ÿšจ ์บ์‹ฑ (์กฐํšŒ์ˆ˜ ๊ด€๋ฆฌ)

  • ์—ฐ์†๋œ ์š”์ฒญ์œผ๋กœ ์ธํ•œ DB๋ณ‘๋ชฉ์„ ํ•ด์†Œํ•˜๊ณ  ์†Œ๋ฉธ๊ธฐ๊ฐ„์ด ์กด์žฌํ•˜๋Š” ๋ฐ์ดํ„ฐ์˜ TimeToLive ๊ด€๋ฆฌ๋ฅผ ์šฉ์ดํ•˜๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋„๋ก Redis๋ฅผ ๋„์ž…ํ•˜์˜€์Šต๋‹ˆ๋‹ค.
  • redis๋ฅผ ์ด์šฉํ•˜์—ฌ ์กฐํšŒ์ˆ˜๋ฅผ ๋”ฐ๋กœ ๊ด€๋ฆฌํ•˜๊ณ  ์กฐํšŒ์ˆ˜์— ๋”ฐ๋ผ ํ‹ฐ์ผ“์˜ ๋žญํ‚น ๋ถ€์—ฌ ๊ฐ€๋Šฅ

โ“ Trouble Shooting

์ตœ์ ํ™”

  • ๋ฌธ์ œ์ƒํ™ฉ : ์ธ๋ฑ์Šค ์ ์šฉ ์‹œ ๊ต‰์žฅํžˆ ๋ฏธ๋ฏธํ•œ ์ˆ˜์น˜๋กœ ์†๋„๊ฐœ์„ ์ด ๋จ.(์•ฝ 1 sec)
  • ํ•ด๊ฒฐ๋ฐฉ์•ˆ : ticketKeyword๋กœ ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ์„ ํ•œ๋ฒˆ์— ๊ฒ€์ƒ‰ํ•˜์˜€์œผ๋‚˜, ticketTitle, ticketContents๋กœ ์ œ๋ชฉ๊ณผ ๋‚ด์šฉ์„ ๋‹ค๋ฅธ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋ฐ›์•„ ๊ฒ€์ƒ‰ (์•ฝ 50% ๊ฐ€๊นŒ์šด ์กฐํšŒ์†๋„ ๊ฐœ์„  ํšจ๊ณผ ๋ฐœ์ƒ!)

์•Œ๋งž์€ ๋‹ด๋‹น์ž ์ฐพ๊ธฐ

  • ๋ฌธ์ œ์ƒํ™ฉ : ํ•œ ์œ ์ €๊ฐ€ ์—ฌ๋Ÿฌ ๋‹ด๋‹น์ž๋ฅผ ๋งก๊ณ  ์žˆ์–ด์„œ ๋‹ด๋‹น์ž๋ฅผ ๋กœ๋“œํ• ๋•Œ ๋งŽ์€ ๊ฐ’์ด ๋‚˜์˜ค๋Š” ์˜ค๋ฅ˜
  • ํ•ด๊ฒฐ๋ฐฉ์•ˆ : ์ฟผ๋ฆฌ๋ฌธ์„ ์ž‘์„ฑํ•˜์—ฌ ํ•ด๋‹น ์›Œํฌ์ŠคํŽ˜์ด์Šค์™€ ์œ ์ €์˜ ์•„์ด๋””๊ฐ€ ์ผ์น˜ํ•˜๋Š” ๋‹ด๋‹น์ž๋ฅผ ๋ถˆ๋Ÿฌ์˜ค๋„๋ก ์„ค๊ณ„

๋‚™๊ด€์  ๋ฝ ์˜ˆ์™ธ์ฒ˜๋ฆฌ

  • ๋ฌธ์ œ์ƒํ™ฉ : ๋‚™๊ด€์  ๋ฝ ํ…Œ์ŠคํŠธ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ, ๊ณ ์ •๋œ ๋ฌธ์ž๋ฐ์ดํ„ฐ๋กœ๋งŒ ์ˆ˜์ •๋˜๋„๋ก ์„ค์ •ํ•˜์—ฌ ๋ชจ์ˆ˜์— ์ƒ๊ด€์—†์ด ํ•ญ์ƒ 9๊ฐœ์˜ ์˜ˆ์™ธ์ฒ˜๋ฆฌ๊ฐ€ ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ๋ฐฉ์•ˆ : ํ•ญ์ƒ ๋žœ๋คํ•œ ์ƒˆ๋กœ์šด ๋ฌธ์ž๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋‚ด๋„๋ก UUID๋ฅผ ์ˆ˜์ •์š”์ฒญํ•˜๋Š” ๋ฐ์ดํ„ฐ์— ๋ง๋ถ™์—ฌ ํ•ด๊ฒฐ

QueryDSL์—์„œ workspace.id ์ ‘๊ทผ ๋ฌธ์ œ

  • ๋ฌธ์ œ์ƒํ™ฉ: ํ‹ฐ์ผ“์„ workspace.id ๋กœ ํ•„ํ•˜ํ„ฐ๊ธฐ ์œ„ํ•ด ๊ฐ ํ…Œ์ผ“์˜ workspace.id ๋ฅผ ticket.board.kanban.workspace.id ์ ‘๊ทผํ•˜๋ ค ํ–ˆ์œผ๋‚˜ member์™€ workspace๊ฐ€ ์—ฐ๊ด€๊ด€๊ณ„๊ฐ€ ํ˜•์„ฑ๋˜์–ด์„œ, ticket์— ์„œ workspace๋ฅผ ๊ทผ์ ‘ํ•  ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค.
  • ํ•ด๊ฒฐ๋ฐฉ์•ˆ: ticket.member.workspace.id๋กœ ์ ‘๊ทผํ•˜์—ฌ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐ ํ–ˆ์Šต๋‹ˆ๋‹ค.

redis ๋ฐ์ดํ„ฐ ์ค‘๋ณต ๋ฌธ์ œ

  • ๋ฌธ์ œ์ƒํ™ฉ : ์กฐํšŒ์ˆ˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋กœ๋“œํ•ด์„œ ๋‹ค๋ฃจ๋Š”๋ฐ intํƒ€์ž…๋ฟ ์•„๋‹ˆ๋ผ Stringํƒ€์ž…๋„ ๋ถˆ๋Ÿฌ์™€์ ธ์„œ ์—๋Ÿฌ๋ฐœ์ƒ
  • ํ•ด๊ฒฐ๋ฐฉ์•ˆ : ๋ฐ์ดํ„ฐ ์ €์žฅ์‹œ ํ‚ค๊ฐ’์ด ๊ฐ™์•„์„œ ์ƒ๊ธด ์˜ค๋ฅ˜ -> ํ‚ค๊ฐ’์„ ๋˜๋„๋ก ๋‹ค๋ฅด๊ฒŒ ์„ค์ •ํ•˜์—ฌ ์ €์žฅํ•˜์—ฌ ์ค‘๋ณต ๋ฐœ์ƒ ๋ฐฉ์ง€

โœ… 5๋ถ„ ๊ธฐ๋ก๋ณด๋“œ

image

๐Ÿ“ Technologies & Tools ๐Ÿ“