๊ด๋ฆฌ์ ํจ๋ ์ธ๋ฑ์ฑ: ์์ฃผ ์ฐ๋ ํํฐ๋ฅผ ๋จผ์ ์ต์ ํํ์ธ์
๊ด๋ฆฌ์ ํจ๋ ์ธ๋ฑ์ฑ: ์ฌ์ฉ์๊ฐ ๊ฐ์ฅ ์์ฃผ ํด๋ฆญํ๋ ํํฐ(์ํ, ๋ด๋น์, ๋ ์ง ๋ฒ์, ํ ์คํธ ๊ฒ์)๋ฅผ ์ค์ ์ฟผ๋ฆฌ ํจํด์ ๋ฐ๋ผ ์ฐ์ ์ต์ ํํ์ธ์.

๊ด๋ฆฌ์ ํจ๋ ํํฐ๊ฐ ๋๋ ค์ง๋ ์ด์
๊ด๋ฆฌ์ ํจ๋์ ์ฒ์์๋ ๋น ๋ฅด๊ฒ ๋๊ปด์ง๋๋ค. ๋ฆฌ์คํธ๋ฅผ ์ด๊ณ ์คํฌ๋กคํ๊ณ ๋ ์ฝ๋๋ฅผ ํด๋ฆญํ๋ฉด ๊ธ๋ฐฉ ๋๋ฉ๋๋ค. ๋๋ ค์ง์ ์ฌ๋๋ค์ด ์ค์ ๋ก ์์ ํ๋ ๋ฐฉ์๋๋ก ํํฐ๋งํ ๋ ๋ํ๋ฉ๋๋ค: "์ด๋ฆฐ ํฐ์ผ๋ง", "Maya์๊ฒ ํ ๋น๋ ํญ๋ชฉ", "์ง๋์ฃผ์ ์์ฑ๋ ๊ฒ", "์ฃผ๋ฌธ ID์ 1047 ํฌํจ"์ฒ๋ผ์. ํด๋ฆญํ ๋๋ง๋ค ๋๊ธฐ ์๊ฐ์ด ์๊ธฐ๊ณ ๋ฆฌ์คํธ๊ฐ ๋์ ๊ฑฐ๋ฆฌ๊ธฐ ์์ํฉ๋๋ค.
๊ฐ์ ํ ์ด๋ธ์ด๋ผ๋ ์ด๋ค ํํฐ์์๋ ๋น ๋ฅด๊ณ ๋ค๋ฅธ ํํฐ์์๋ ๊ทน๋๋ก ๋๋ฆด ์ ์์ต๋๋ค. ์ํ ํํฐ๋ ์์ ํ ์งํฉ๋ง ๊ฑด๋๋ ค ๋น ๋ฅด๊ฒ ๋ฐํ๋ ์ ์์ต๋๋ค. ๋ฐ๋ฉด "๋ ๋ ์ง ์ฌ์ด์ ์์ฑ๋จ" ํํฐ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํฐ ๋ฒ์๋ฅผ ์ฝ๊ฒ ๋ง๋ค ์ ์์ต๋๋ค. ๋ด๋น์ ํํฐ๋ ๋จ๋ ์ผ๋ก๋ ๊ด์ฐฎ๋ค๊ฐ ์ํ์ ์ ๋ ฌ์ด ๊ฒฐํฉ๋๋ฉด ๋๋ ค์ง๋๋ค.
์ธ๋ฑ์ค๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ ์ฒด ํ ์ด๋ธ์ ์ฝ์ง ์๊ณ ์ผ์นํ๋ ํ์ ์ฐพ๋ ์ง๋ฆ๊ธธ์ ๋๋ค. ํ์ง๋ง ์ธ๋ฑ์ค๋ ๊ณต์ง๊ฐ ์๋๋๋ค. ์ ์ฅ ๊ณต๊ฐ์ ์ฐจ์งํ๊ณ ์ฝ์ ๋ฐ ๊ฐฑ์ ์ ์ฝ๊ฐ ๋๋ฆฌ๊ฒ ํฉ๋๋ค. ๋๋ฌด ๋ง์ด ์ถ๊ฐํ๋ฉด ์ฐ๊ธฐ๊ฐ ๋๋ ค์ง๊ณ ์ค์ ๋ณ๋ชฉ์ ํด๊ฒฐํ์ง ๋ชปํ ์ ์์ต๋๋ค.
๋ชจ๋ ๊ฒ์ ์ธ๋ฑ์ฑํ๊ธฐ๋ณด๋ค๋ ๋ค์ ํํฐ๋ฅผ ์ฐ์ ์ํ์ธ์:
- ์์ฃผ ์ฌ์ฉ๋๋ ๊ฒ
- ๋ง์ ํ์ ๊ฑด๋๋ฆฌ๋ ๊ฒ
- ๋์ ๋๋ ๋๊ธฐ ์๊ฐ์ ๋ง๋๋ ๊ฒ
- ๊ฐ๋จํ๊ณ ์ ๋ง๋ ์ธ๋ฑ์ค๋ก ์์ ํ๊ฒ ๊ฐ์ ํ ์ ์๋ ๊ฒ
๋ฒ์๋ฅผ ์ข๊ฒ ์ก์ ์ด์ ๋ ์๋์ ์ ๋๋ค. ๊ด๋ฆฌ์ ๋ฆฌ์คํธ์์ ์ฒ์ ์ ๊ธฐ๋๋ ์ฑ๋ฅ ๋ถ๋ง์ ๊ฑฐ์ ํญ์ ๋ค ๊ฐ์ง ํํฐ ์ ํ์์ ์ต๋๋ค: ์ํ(status), ๋ด๋น์(assignee), ๋ ์ง ๋ฒ์, ํ ์คํธ ํ๋. ์ด๋ค์ด ์ ๋ค๋ฅด๊ฒ ๋์ํ๋์ง ์ดํดํ๋ฉด ๋ค์ ๋จ๊ณ๋ ๋ช ํํฉ๋๋ค: ์ค์ ์ฟผ๋ฆฌ ํจํด์ ๋ณด๊ณ , ๊ทธ์ ๋ง๋ ๊ฐ์ฅ ์์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๊ณ , ๋๋ฆฐ ๊ฒฝ๋ก๊ฐ ๊ฐ์ ๋์๋์ง ๊ฒ์ฆํ์ธ์.
์ค์ ๊ด๋ฆฌ์ ์์ ๋ค์ ์ฟผ๋ฆฌ ํจํด
๊ด๋ฆฌ์ ํจ๋์ด ๋๋ ค์ง๋ ์ด์ ๋ ํ๋์ ๊ฑฐ๋ํ ๋ฆฌํฌํธ ๋๋ฌธ์ด ์๋๋๋ค. ํ๋ฃจ ์ข ์ผ ์ฌ์ฉ๋๋ ๋ช๋ช ํ๋ฉด์ด ์๊ณ , ๊ทธ ํ๋ฉด๋ค์ด ์์ฃผ ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ๋ณต ์คํํ๊ธฐ ๋๋ฌธ์ ๋๋ ค์ง๋๋ค.
์ด์ํ์ ๋ณดํต ํฐ์ผ, ์ฃผ๋ฌธ, ์ฌ์ฉ์, ์น์ธ, ๋ด๋ถ ์์ฒญ ๊ฐ์ ๋ช ๊ฐ์ ์์ ํ๋ฅผ ์์ฃผ ์ฌ์ฉํฉ๋๋ค. ์ด ํ์ด์ง๋ค์์ ๋ฐ๋ณต๋๋ ํํฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ํ(Status): ์ํฌํ๋ก๋ฅผ ๋ฐ์ํฉ๋๋ค(์๋ก์, ์ด๋ฆผ, ๋ณด๋ฅ, ์๋ฃ)
- ๋ด๋น์(Assignee): "๋ด ํญ๋ชฉ"์ด๋ "๋ฏธํ ๋น"์ ๋ณด๊ธฐ ์ํด ํ์ํฉ๋๋ค
- ๋ ์ง ๋ฒ์: ๋๊ตฐ๊ฐ ํญ์ "์ง๋์ฃผ์ ๋ฌด์จ ์ผ์ด ์์๋?"๋ผ๊ณ ๋ฌป์ต๋๋ค
- ๊ฒ์: ํน์ ํญ๋ชฉ์ผ๋ก ๋ฐ๋ก ์ด๋(์ฃผ๋ฌธ๋ฒํธ, ์ด๋ฉ์ผ)ํ๊ฑฐ๋ ํ ์คํธ(๋ ธํธ, ๋ฏธ๋ฆฌ๋ณด๊ธฐ)๋ฅผ ํ์ด๋ณด๊ธฐ ์ํจ์ ๋๋ค
๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค:
- ์ต์ ํญ๋ชฉ ๋๋ฌ๋ณด๊ธฐ(Browse newest): ์ค์บ ํจํด์ ๋๋ค. ๋ณดํต "์ต์ ํญ๋ชฉ์ ๋ณด์ฌ์ค, ์ํ๋ก ์ขํ ์๋ ์๊ณ , ์์ฑ ์๊ฐ์ผ๋ก ์ ๋ ฌ" ๊ฐ์ ํํ์ด๋ฉฐ ํ์ด์ง๋ค์ด์ ์ด ์ ์ฉ๋ฉ๋๋ค.
- ํน์ ํญ๋ชฉ ์ฐพ๊ธฐ(Find a specific item): ์กฐํ ํจํด์ ๋๋ค. ๊ด๋ฆฌ์๊ฐ ์ด๋ฏธ ID, ์ด๋ฉ์ผ, ํฐ์ผ ๋ฒํธ, ์ฐธ์กฐ๋ฅผ ์๊ณ ์์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ฐ๋ก ์์์ ํ์ผ๋ก ์ ํํ๊ธธ ๊ธฐ๋ํฉ๋๋ค.
๊ด๋ฆฌ์ ํจ๋์ ๋ํ ์์ธก ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ํํฐ๋ฅผ ์กฐํฉํฉ๋๋ค: "Open + Unassigned", "Pending + Assigned to me", "์ง๋ 30์ผ ์๋ฃ" ๋ฑ. ์ธ๋ฑ์ค๋ ์ด ๋ชฉ๋ก๊ณผ ๋ง์ถ๊ธฐ๋ณด๋ค๋ ์ค์ ์ฟผ๋ฆฌ ํํ์ ๋ง์ถ ๋ ๊ฐ์ฅ ์ ์๋ํฉ๋๋ค.
AppMaster๋ก ๊ด๋ฆฌ์ ๋๊ตฌ๋ฅผ ๋ง๋ค๋ฉด, ์ด๋ฐ ํจํด์ ๊ฐ์ฅ ๋ง์ด ์ฐ์ด๋ ๋ฆฌ์คํธ ํ๋ฉด๊ณผ ๊ธฐ๋ณธ ํํฐ๋ง ๋ด๋ ๋๋ฌ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์ค์ ๋ก ์ผ์ ์์ ์ ์์ง์ด๋ ๊ฒ๋ค์ ์ธ๋ฑ์ฑํ๊ธฐ๊ฐ ์ฌ์์ง๋๋ค.
๋ฌด์์ ๋จผ์ ์ธ๋ฑ์ฑํ ์ง ๊ณ ๋ฅด๋ ๋ฒ
์ธ๋ฑ์ฑ์ ํธ๋ฆฌ์์ฃผ์ฒ๋ผ ๋ค๋ฃจ์ธ์. ํํฐ ๋๋กญ๋ค์ด์ ๋์ค๋ ๋ชจ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ฑํ๋ ๊ฒ๋ถํฐ ์์ํ์ง ๋ง์ธ์. ์ฌ๋๋ค์ ์ง์ฆ๋๊ฒ ํ๋ ์์ฃผ ์คํ๋๋ ๋ช ๊ฐ์ง ์ฟผ๋ฆฌ๋ถํฐ ์์ํ์ธ์.
์ฌ๋๋ค์ด ์ค์ ๋ก ์ฐ๋ ํํฐ ์ฐพ๊ธฐ
์๋ฌด๋ ์ ์ฐ๋ ํํฐ๋ฅผ ์ต์ ํํ๋ ๊ฒ์ ์๊ฐ ๋ญ๋น์ ๋๋ค. ์ค์ ๋ก ๋จ๊ฑฐ์ด ๊ฒฝ๋ก๋ฅผ ์ฐพ์ผ๋ ค๋ฉด ์ฌ๋ฌ ์ ํธ๋ฅผ ๊ฒฐํฉํ์ธ์:
- UI ๋ถ์: ์ด๋ค ํ๋ฉด์ด ๊ฐ์ฅ ๋ง์ด ์กฐํ๋๋ฉฐ ์ด๋ค ํํฐ๊ฐ ๊ฐ์ฅ ์์ฃผ ํด๋ฆญ๋๋๊ฐ
- ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋๋ API ๋ก๊ทธ: ๊ฐ์ฅ ๋น๋ฒํ ์ฟผ๋ฆฌ์ ๊ฐ์ฅ ๋๋ฆฐ ์์ ํผ์ผํธ
- ๋ด๋ถ ํผ๋๋ฐฑ: "๊ฒ์์ด ๋๋ฆฌ๋ค"๋ ๋ง์ ๋ณดํต ํน์ ํ๋ฉด์ ๊ฐ๋ฆฌํต๋๋ค
- ๊ธฐ๋ณธ ๋๋ฉ ๋ฆฌ์คํธ: ๊ด๋ฆฌ์๊ฐ ํจ๋์ ์ด์๋ง์ ๋ฌด์์ด ์คํ๋๋๊ฐ
๋ง์ ํ์์ ๊ธฐ๋ณธ ๋ทฐ๋ "์คํ ํฐ์ผ" ๋๋ "์ ์ฃผ๋ฌธ" ๊ฐ์ ํํ์ ๋๋ค. ์ด ๋ทฐ๋ ๋๊ตฐ๊ฐ ์๋ก๊ณ ์นจํ ๋, ํญ์ ์ ํํ ๋, ํ์ ํ ๋์์ฌ ๋๋ง๋ค ์คํ๋ฉ๋๋ค.
ํ๋ ์ด๋ฆ์ด ์๋๋ผ ์ฟผ๋ฆฌ ํํ๋ก ๊ทธ๋ฃนํํ์ธ์
์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ ์์ฃผ ์ฐ์ด๋ ์ฟผ๋ฆฌ๋ฅผ ๊ทธ ๋์ ๋ฐฉ์์ผ๋ก ๊ทธ๋ฃนํํ์ธ์. ๋๋ถ๋ถ์ ๊ด๋ฆฌ์ ๋ฆฌ์คํธ ์ฟผ๋ฆฌ๋ ๋ช ๊ฐ์ง ๋ฒํท์ผ๋ก ๋๋ฉ๋๋ค:
- ๋๋ฑ ๋น๊ต(Equality) ํํฐ:
status = 'open',assignee_id = 42 - ๋ฒ์(Range) ํํฐ:
created_at๋ ๋ ์ง ์ฌ์ด - ์ ๋ ฌ๊ณผ ํ์ด์ง๋ค์ด์
:
ORDER BY created_at DESC๊ทธ๋ฆฌ๊ณ ํ์ด์ง 2 ๊ฐ์ ธ์ค๊ธฐ - ํ ์คํธ ์กฐํ: ์ ํ ์ผ์น(์ฃผ๋ฌธ ๋ฒํธ), ์ ๋์ฌ ์ผ์น(์ด๋ฉ์ผ ์์), ๋๋ ํฌํจ ๊ฒ์
๊ฐ ์์ ํ๋ฉด์ ๋ํด WHERE, ORDER BY, ํ์ด์ง๋ค์ด์
์ ํฌํจํ ํํ๋ฅผ ์ ์ด๋์ธ์. UI์์ ๋น์ทํด ๋ณด์ฌ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์์๋ ๋งค์ฐ ๋ค๋ฅด๊ฒ ๋์ํ ์ ์์ต๋๋ค.
์์ ์ฐ์ ๋ฐฐ์น๋ฅผ ๊ณ ๋ฅด์ธ์
์ฐ์ ์์ ๋ชฉํ ํ๋๋ก ์์ํ์ธ์: ๊ด๋ฆฌ์๊ฐ ์ฒ์ ๋ณด๋ ๊ธฐ๋ณธ ๋ฆฌ์คํธ ์ฟผ๋ฆฌ. ๊ทธ๋ฐ ๋ค์ ์์ฃผ ์ฐ์ด๋ 2~3๊ฐ์ ์ฟผ๋ฆฌ๋ฅผ ๊ณ ๋ฅด์ธ์. ๋ณดํต ์ด ์ ๋๋ฉด ๊ฐ์ฅ ํฐ ์ง์ฐ์ ์ค์ด๊ธฐ์ ์ถฉ๋ถํฉ๋๋ค.
์: ์ง์ํ์ด Tickets ๋ฆฌ์คํธ๋ฅผ status = 'open'๋ก ํํฐํ๊ณ ์ต์ ์์ผ๋ก ์ ๋ ฌํ๋ฉฐ ์ ํ์ ์ผ๋ก ๋ด๋น์์ ๋ ์ง ๋ฒ์๋ฅผ ์ ์ฉํ๋ค๋ฉด, ๊ทธ ์ ํํ ์กฐํฉ์ ๋จผ์ ์ต์ ํํ์ธ์. ๋น ๋ฅด๊ฒ ๋๋ฉด ๋ค์ ํ๋ฉด์ผ๋ก ๋์ด๊ฐ ์ฌ์ฉ๋ ๊ธฐ๋ฐ์ผ๋ก ์์
ํ์ธ์.
์ํ ํํฐ ์ธ๋ฑ์ฑ(๊ณผ์์ ํผํ๋ ๋ฒ)
์ํ๋ ์ฌ๋๋ค์ด ๊ฐ์ฅ ๋จผ์ ์ถ๊ฐํ๋ ํํฐ ์ค ํ๋๊ณ , ์๋ชปํ๋ฉด ํจ๊ณผ๊ฐ ์๊ฒ ์ธ๋ฑ์ฑํ๊ธฐ ์ฝ์ต๋๋ค.
๋๋ถ๋ถ์ ์ํ ํ๋๋ ๋ฎ์ ์นด๋๋๋ฆฌํฐ๋ฅผ ๊ฐ์ง๋๋ค: ๊ฐ์ด ๋ช ๊ฐ๋ฟ์
๋๋ค(open, pending, closed). ์ธ๋ฑ์ค๋ ๊ฒฐ๊ณผ๋ฅผ ์์ ์กฐ๊ฐ์ผ๋ก ์ขํ ๋ ๊ฐ์ฅ ๋์์ด ๋ฉ๋๋ค. ๋ง์ฝ 80%~95%์ ํ์ด ๋์ผํ ์ํ๋ผ๋ฉด status ๋จ๋
์ธ๋ฑ์ค๋ ํฐ ๋ณํ๋ฅผ ๋ง๋ค์ง ๋ชปํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ฌ์ ํ ๋ง์ ํ์ ์ฝ์ด์ผ ํ๊ณ , ์ธ๋ฑ์ค๋ ์ค๋ฒํค๋๋ฅผ ์ถ๊ฐํฉ๋๋ค.
๋ค์ ์ํฉ์์ ํจ๊ณผ๋ฅผ ๋๋ผ๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค:
- ์ด๋ค ์ํ๊ฐ ํฌ๊ทํ ๊ฒฝ์ฐ(์: escalated)
- ์ํ๊ฐ ๋ค๋ฅธ ์กฐ๊ฑด๊ณผ ๊ฒฐํฉ๋์ด ๊ฒฐ๊ณผ ์งํฉ์ ์๊ฒ ๋ง๋๋ ๊ฒฝ์ฐ
- ์ํ์ ์ ๋ ฌ์ด ์ผ๋ฐ์ ์ธ ๋ฆฌ์คํธ ๋ทฐ์ ์ผ์นํ๋ ๊ฒฝ์ฐ
ํํ ํจํด์ "์คํ ํญ๋ชฉ์ ๋ณด์ฌ์ค, ์ต์ ์"์
๋๋ค. ์ด ๊ฒฝ์ฐ ํํฐ์ ์ ๋ ฌ์ ํจ๊ป ์ธ๋ฑ์ฑํ๋ ๊ฒ์ด status ๋จ๋
์ธ๋ฑ์ค๋ณด๋ค ๋ซ์ต๋๋ค.
์ด๊ธฐ์ ํจ๊ณผ๋ฅผ ๋ด๋ ์กฐํฉ ์:
status + updated_at(์ํ๋ก ํํฐํ๊ณ ์ต๊ทผ ๋ณ๊ฒฝ์ ์ ๋ ฌ)status + assignee_id(์ํฌ ํ ๋ทฐ)status + updated_at + assignee_id(์ ๋ง ๊ทธ ๋ทฐ๊ฐ ๋ง์ด ์ฐ์ผ ๋๋ง)
๋ถ๋ถ ์ธ๋ฑ์ค(partial index)๋ ํ ์ํ๊ฐ ์ง๋ฐฐ์ ์ธ ๊ฒฝ์ฐ ์ข์ ํํ์ฑ ์ ๋๋ค. ์๋ฅผ ๋ค์ด "open" ๋ทฐ๊ฐ ์ฃผ๋ก ์ฌ์ฉ๋๋ค๋ฉด open ํ๋ง ์ธ๋ฑ์ฑํ๋ฉด ์ธ๋ฑ์ค๊ฐ ์์์ง๊ณ ์ฐ๊ธฐ ๋น์ฉ๋ ๋ฎ์์ง๋๋ค.
-- PostgreSQL example: index only open rows, optimized for newest-first lists
CREATE INDEX CONCURRENTLY tickets_open_updated_idx
ON tickets (updated_at DESC)
WHERE status = 'open';
์ค์ฉ์ ์ธ ํ ์คํธ: ๋๋ฆฐ ๊ด๋ฆฌ์ ์ฟผ๋ฆฌ๋ฅผ ์ํ ํํฐ๋ฅผ ๋ฃ๊ณ ๋บ ์ํ๋ก ์คํํด ๋ณด์ธ์. ๋ ๋ค ๋๋ฆฌ๋ฉด ์ํ๋ง์ ์ธ๋ฑ์ค๋ ์์ฉ์ด ์์ต๋๋ค. ์ ๋ ฌ๊ณผ ์ค์ ๋ก ๋ชฉ๋ก์ ์ค์ด๋ ๋ ๋ฒ์งธ ํํฐ์ ์ง์คํ์ธ์.
๋ด๋น์ ํํฐ๋ง: ๋๋ฑ ๋น๊ต ์ธ๋ฑ์ค์ ํํ ์กฐํฉ
๋๋ถ๋ถ ๊ด๋ฆฌ์ ํจ๋์์ ๋ด๋น์๋ ๋ ์ฝ๋์ ์ ์ฅ๋ ์ฌ์ฉ์ ID์
๋๋ค: assignee_id ๊ฐ์ ์ธ๋ ํค. ์ด๋ ์ ํ์ ์ธ ๋๋ฑ ๋น๊ต ํํฐ์ด๊ณ , ๋จ์ ์ธ๋ฑ์ค๋ก ๋น ๋ฅธ ์ฑ๊ณผ๋ฅผ ๋ณผ ์ ์์ต๋๋ค.
๋ด๋น์๋ ๋ค๋ฅธ ํํฐ์ ํจ๊ป ์์ฃผ ๋ฑ์ฅํฉ๋๋ค. ์: ๊ด๋ฆฌ์๊ฐ "Alex์๊ฒ ํ ๋น๋ ํญ๋ชฉ"์ผ๋ก ํํฐํ ๋ค "์คํ"์ผ๋ก ์ขํ๋๋ค. ์ด ๋ทฐ๊ฐ ๋๋ฆฌ๋ฉด ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค ์ด์์ด ํ์ํ ๋๊ฐ ๋ง์ต๋๋ค.
์์์ ์ผ๋ก ์ข์ ๋ณตํฉ ์ธ๋ฑ์ค:
assignee_id, statusโ "๋ด๊ฐ ํ ๋น๋ ์คํ ํญ๋ชฉ"assignee_id, status, updated_atโ ๋ฆฌ์คํธ๊ฐ ์ต๊ทผ ํ๋ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌ๋ ๋
๋ณตํฉ ์ธ๋ฑ์ค์์ ์์๋ ์ค์ํฉ๋๋ค. ๋๋ฑ ๋น๊ต ํํฐ(๋ณดํต assignee_id, ๊ทธ๋ค์ status)๋ฅผ ์์ ๋๊ณ , ์ ๋ ฌ์ด๋ ๋ฒ์ ์ปฌ๋ผ(updated_at)์ ๋ค์ ๋ก๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํจ์จ์ ์ผ๋ก ํ์ฉํฉ๋๋ค.
๋ฏธํ ๋น(unassigned)์ ํํ ๊ณจ์นซ๊ฑฐ๋ฆฌ์
๋๋ค. ๋ง์ ์์คํ
์ด ๋ฏธํ ๋น์ assignee_id = NULL๋ก ํํํ๊ณ ๊ด๋ฆฌ์๋ ์ด๋ฅผ ์์ฃผ ํํฐ๋งํฉ๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ฟผ๋ฆฌ ํํ์ ๋ฐ๋ผ NULL ๊ฐ์ ์คํ ๊ณํ์ ๋ฐ๊ฟ ์ธ๋ฑ์ค๊ฐ ๋ด๋น๋ ํญ๋ชฉ์์๋ ์ ์๋ํด๋ ๋ฏธํ ๋น์๋ ์ธ๋ชจ์๊ฒ ๋๊ปด์ง ์ ์์ต๋๋ค.
๋ฏธํ ๋น ํ๊ฐ ์ค์ํ๋ค๋ฉด ํ๋์ ๋ช ํํ ์ ๊ทผ์ ์ ํ๊ณ ํ ์คํธํ์ธ์:
assignee_id๋ฅผ nullable๋ก ์ ์งํ๋WHERE assignee_id IS NULL์ฟผ๋ฆฌ๋ฅผ ํ ์คํธํ๊ณ ํ์ํ ๊ฒฝ์ฐ ์ธ๋ฑ์ค ์ ๋ต์ ๋ง๋ จํฉ๋๋ค.- ๋ฐ์ดํฐ ๋ชจ๋ธ์ ๋ง๋๋ค๋ฉด ์ ์ฉ ๊ฐ(์: ํน๋ณํ "Unassigned" ์ฌ์ฉ์)์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๊ณ ๋ คํฉ๋๋ค.
- ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ง์ํ๋ฉด ๋ฏธํ ๋น ํ์ ๋ํ ๋ถ๋ถ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํฉ๋๋ค.
AppMaster๋ก ๊ด๋ฆฌ์ ํจ๋์ ๋ง๋ ๋ค๋ฉด ํ์ด ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ํํฐ์ ์ ๋ ฌ์ ๋ก๊น ํ๊ณ , ๋ชจ๋ ํ๋๋ฅผ ์ธ๋ฑ์ฑํ๊ธฐ๋ณด๋ค๋ ๊ทธ๋ฐ ํจํด์ ๋ฐ์ํ ์์์ ์ ์ ํ๋ ์ธ๋ฑ์ค๋ฅผ ๋ง๋ค๋ฉด ๋์์ด ๋ฉ๋๋ค.
๋ ์ง ๋ฒ์: ์ฌ๋๋ค์ด ํํฐํ๋ ๋ฐฉ์์ ๋ง์ถ ์ธ๋ฑ์ค
๋ ์ง ํํฐ๋ ๋ณดํต "์ง๋ 7์ผ", "์ง๋ 30์ผ"๊ณผ ๊ฐ์ ํ๋ฆฌ์ ๊ณผ ์์/๋์ ๊ณ ๋ฅด๋ ์ปค์คํ ์ ํ๊ธฐ๊ฐ ํจ๊ป ์ ๊ณต๋ฉ๋๋ค. ๋จ์ํด ๋ณด์ด์ง๋ง ํฐ ํ ์ด๋ธ์์๋ ๋งค์ฐ ๋ค๋ฅธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ ์ ์ด๋ฐํ ์ ์์ต๋๋ค.
๋จผ์ ์ฌ๋๋ค์ด ์ค์ ๋ก ์ด๋ค ํ์์คํฌํ ์ด์ ์๋ฏธํ๋์ง ๋ถ๋ช ํ ํ์ธ์. ๋ค์์ ์ฌ์ฉํฉ๋๋ค:
- ์ ํญ๋ชฉ ๋ทฐ๋
created_at - ์ต๊ทผ ๋ณ๊ฒฝ ๋ทฐ๋
updated_at
ํด๋น ์ปฌ๋ผ์ ์ผ๋ฐ์ ์ธ btree ์ธ๋ฑ์ค๋ฅผ ๋์ธ์. ๊ทธ๋ ์ง ์์ผ๋ฉด "์ง๋ 30์ผ" ํด๋ฆญ์ด ์ ์ฒด ํ ์ด๋ธ ์ค์บ์ผ๋ก ๋ฐ๋ ์ ์์ต๋๋ค.
ํ๋ฆฌ์
๋ฒ์๋ ๋ณดํต created_at >= now() - interval '30 days' ๊ฐ์ ํํ์
๋๋ค. ์ด๋ ๋ฒ์ ์กฐ๊ฑด์ด๊ณ created_at ์ธ๋ฑ์ค๋ฅผ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. UI๊ฐ ์ต์ ์ ์ ๋ ฌ๋ ํจ๊ป ํ๋ค๋ฉด ์ ๋ ฌ ๋ฐฉํฅ(์: PostgreSQL์ created_at DESC)๊ณผ ์ผ์น์ํค๋ ๊ฒ์ด ๋ง์ด ์ฐ์ด๋ ๋ฆฌ์คํธ์์ ๋์์ด ๋ฉ๋๋ค.
๋ ์ง๊ฐ ์ํ๋ ๋ด๋น์ ๊ฐ์ ๋ค๋ฅธ ํํฐ์ ๊ฒฐํฉ๋ ๋๋ ์ ์คํ์ธ์. ๋ณตํฉ ์ธ๋ฑ์ค๋ ๊ทธ ์กฐํฉ์ด ํํ ๋ ํ๋ฅญํฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์ฐ๊ธฐ ๋น์ฉ๋ง ์ฆ๊ฐ์ํฌ ๋ฟ์ ๋๋ค.
์ค์ฉ ๊ท์น:
- ๋๋ถ๋ถ์ ๋ทฐ๊ฐ ์ํ๋ก ๋จผ์ ํํฐํ ๋ค ๋ ์ง๋ก ์ขํ๋ค๋ฉด
(status, created_at)์ด ๋์์ด ๋ฉ๋๋ค. - ์ํ๋ ์ ํ์ ์ด์ง๋ง ๋ ์ง๊ฐ ํญ์ ์กด์ฌํ๋ฉด ๋จ์ํ
created_at์ธ๋ฑ์ค๋ฅผ ์ ์งํ๊ณ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ๋ง์ด ๋ง๋ค์ง ๋ง์ธ์. - ๋ชจ๋ ์กฐํฉ์ ๋ง๋ค์ง ๋ง์ธ์. ๊ฐ ์ธ๋ฑ์ค๋ ์ ์ฅ ๊ณต๊ฐ์ ๋๋ฆฌ๊ณ ์ฐ๊ธฐ๋ฅผ ๋๋ฆฌ๊ฒ ํฉ๋๋ค.
ํ์์กด๊ณผ ๊ฒฝ๊ณ๋ "๋ ์ฝ๋ ๋๋ฝ" ๋ฒ๊ทธ์ ์ฃผ์ ์์ธ์
๋๋ค. ์ฌ์ฉ์๊ฐ ๋ ์ง(์๊ฐ ์์ด)๋ฅผ ์ ํํ๋ฉด ์ข
๋ฃ์ผ์ ์ด๋ป๊ฒ ํด์ํ ์ง ๊ฒฐ์ ํ์ธ์. ์์ ํ ํจํด์ ์์ ํฌํจ, ์ข
๋ฃ ์ ์ธ: created_at >= start ๊ทธ๋ฆฌ๊ณ created_at < end_next_day. ํ์์คํฌํ๋ UTC๋ก ์ ์ฅํ๊ณ ์ฌ์ฉ์ ์
๋ ฅ์ UTC๋ก ๋ณํํ ๋ค ์ฟผ๋ฆฌํ์ธ์.
์: ์ด์ ๊ด๋ฆฌ์๊ฐ 1์ 10์ผ~1์ 12์ผ์ ์ ํํ๊ณ 1์ 12์ผ์ ๋ชจ๋ ํญ๋ชฉ์ ๊ธฐ๋ํ๋๋ฐ ์ฟผ๋ฆฌ๊ฐ <= '2026-01-12 00:00'๋ผ๋ฉด 1์ 12์ผ์ ๊ฑฐ์ ๋ชจ๋ ํญ๋ชฉ์ ๋๋ฝํฉ๋๋ค. ์ธ๋ฑ์ค ์์ฒด๋ ๋ฌธ์ ๊ฐ ์๋๊ณ ๊ฒฝ๊ณ ๋ก์ง์ด ์๋ชป๋ ๊ฒ์
๋๋ค.
ํ ์คํธ ํ๋: ์ ํ ๊ฒ์ ๋ ํฌํจ ๊ฒ์
ํ ์คํธ ๊ฒ์์ ๋ง์ ๊ด๋ฆฌ์ ํจ๋์ด ๋๋ ค์ง๋ ์ง์ ์ ๋๋ค. ์ฌ๋๋ค์ ํ ๋ฐ์ค์์ ๋ชจ๋ ๊ฒ์ ์ฐพ๊ธธ ๊ธฐ๋ํ๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ฒซ ๋ฒ์งธ ๊ฐ์ ์ ๋ ๊ฐ์ง ํ์๋ฅผ ๋ถ๋ฆฌํ๋ ๊ฒ์ ๋๋ค: ์ ํ ์ผ์น(๋น ๋ฅด๊ณ ์์ธก ๊ฐ๋ฅ)์ ํฌํจ ๊ฒ์(์ ์ฐํ์ง๋ง ๋ถ๋ด์ด ํผ).
์ ํ ์ผ์น ํ๋์๋ ์ฃผ๋ฌธ ID, ํฐ์ผ ๋ฒํธ, ์ด๋ฉ์ผ, ์ ํ๋ฒํธ, ์ธ๋ถ ์ฐธ์กฐ ๋ฑ์ด ํฌํจ๋ฉ๋๋ค. ์ด๋ฐ ํ๋๋ ์ผ๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์ธ๋ฑ์ค์ ์ ํฉํฉ๋๋ค. ๊ด๋ฆฌ์๊ฐ ID๋ ์ด๋ฉ์ผ์ ๋ถ์ฌ๋ฃ์ด ์ฐพ๋ ๊ฒฝ์ฐ ๋จ์ ์ธ๋ฑ์ค + ๋๋ฑ ๋น๊ต๋ก ์ฆ์ ๋๊ปด์ง๋ ์๋ต์ ์ป์ ์ ์์ต๋๋ค.
ํฌํจ ๊ฒ์์ ๋๊ตฐ๊ฐ๊ฐ "refund"๋ "john" ๊ฐ์ ์กฐ๊ฐ์ ์
๋ ฅํด ์ด๋ฆ, ๋
ธํธ, ์ค๋ช
์์ ์ผ์นํ๋ ํญ๋ชฉ์ ์ฐพ๋ ๊ฒฝ์ฐ์
๋๋ค. ๋ณดํต LIKE %term%์ผ๋ก ๊ตฌํ๋๋๋ฐ ์ ํ ์์ผ๋์นด๋ ๋๋ฌธ์ ์ผ๋ฐ B-tree ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ ์ ์์ด ๋ง์ ํ์ ์ค์บํฉ๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ณผ๋ถํ๋ฅผ ์ฃผ์ง ์๊ณ ๊ฒ์์ ๊ตฌ์ถํ๋ ์ค์ฉ์ ๋ฐฉ๋ฒ:
- ์ ํ ์ผ์น ๊ฒ์(ID, ์ด๋ฉ์ผ, ์ฌ์ฉ์๋ช )์ ์ฐ์ ๊ธฐ๋ฅ์ผ๋ก ๋ง๋ค๊ณ ๋ช ํํ ๋ผ๋ฒจ๋งํ์ธ์.
- ์ ๋์ฌ ๊ฒ์(
term%)์ ํ์ค ์ธ๋ฑ์ค๋ก ์ด๋ ์ ๋ ๋์์ด ๋๋ฉฐ ์ด๋ฆ ๊ฒ์์ ์ถฉ๋ถํ ๋๊ฐ ๋ง์ต๋๋ค. - ํฌํจ ๊ฒ์์ ๋ก๊ทธ๋ ๋ถ๋ง์ด ์ค์ ๋ก ํ์ํจ์ ๋ณด์ฌ์ค ๋๋ง ์ถ๊ฐํ์ธ์.
- ํฌํจ ๊ฒ์์ ์ถ๊ฐํ ๋๋ PostgreSQL full-text search๋ trigram ์ธ๋ฑ์ค ๊ฐ์ ์ ์ ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์. ์ผ๋ฐ ์ธ๋ฑ์ค๋ก
LIKE %term%์ ๊ณ ์น๋ ค ํ์ง ๋ง์ธ์.
์ ๋ ฅ ๊ท์น์ ๋๋ถ๋ถ์ ํ์ด ์์ํ๋ ๊ฒ๋ณด๋ค ๋ ํฐ ํจ๊ณผ๊ฐ ์์ต๋๋ค. ๋ก๋๋ฅผ ์ค์ด๊ณ ๊ฒฐ๊ณผ๋ฅผ ์ผ๊ด๋๊ฒ ๋ง๋ญ๋๋ค:
- ํฌํจ ๊ฒ์์ ์ต์ ๊ธธ์ด๋ฅผ ์ ํ์ธ์(์: 3์ ์ด์).
- ๋์๋ฌธ์ ์ ๊ทํ๋ฅผ ํ๊ฑฐ๋ ๋์๋ฌธ์ ๋ฌด์ ๋น๊ต๋ฅผ ์ผ๊ด๋๊ฒ ์ฌ์ฉํ์ธ์.
- ์๋ค ๊ณต๋ฐฑ์ ์ ๊ฑฐํ๊ณ ๋ฐ๋ณต ๊ณต๋ฐฑ์ ์ถ์ํ์ธ์.
- ์ด๋ฉ์ผ๊ณผ ID๋ ์ผ๋ฐ ๊ฒ์ ๋ฐ์ค์ ์ ๋ ฅ๋๋๋ผ๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ ํ ์ผ์น๋ก ์ฒ๋ฆฌํ์ธ์.
- ๊ฒ์์ด๊ฐ ๋๋ฌด ๊ด๋ฒ์ํ๋ฉด ํฐ ์ฟผ๋ฆฌ๋ฅผ ์คํํ์ง ๋ง๊ณ ์ฌ์ฉ์์๊ฒ ๊ตฌ์ฒดํ๋ฅผ ์์ฒญํ์ธ์.
์์ ์: ์ง์ ๋งค๋์ ๊ฐ "ann"์ ๊ฒ์ํด ๊ณ ๊ฐ์ ์ฐพ์ผ๋ ค ํฉ๋๋ค. ์์คํ
์ด ๋
ธํธ, ์ด๋ฆ, ์ฃผ์ ์ ์ฒด์ LIKE %ann%์ ์คํํ๋ฉด ์์ฒ ํ์ ์ค์บํ ์ ์์ต๋๋ค. ๋จผ์ ์ด๋ฉ์ผ์ด๋ ๊ณ ๊ฐ ID ๊ฐ์ ์ ํ ํ๋๋ฅผ ํ์ธํ๊ณ , ํ์ํ ๋๋ง ๋ ์ ๊ตํ ํ
์คํธ ์ธ๋ฑ์ค๋ก ํด๋ฐฑํ๋ฉด ๊ฒ์์ด ๋น ๋ฅด๊ฒ ์ ์ง๋ฉ๋๋ค.
์ธ๋ฑ์ค๋ฅผ ์์ ํ๊ฒ ์ถ๊ฐํ๋ ๋จ๊ณ๋ณ ์ํฌํ๋ก
์ธ๋ฑ์ค๋ ์ถ๊ฐํ๊ธฐ๋ ์ฝ์ง๋ง ํํํ๊ธฐ๋ ์ฝ์ต๋๋ค. ์์ ํ ์ํฌํ๋ก๋ ๊ด๋ฆฌ์๊ฐ ์์กดํ๋ ํํฐ์ ์ง์คํ๊ฒ ํ๊ณ , ๋์ค์ ํํํ "ํน์ ๋์์ด ๋ ๊น" ์ธ๋ฑ์ค๋ฅผ ํผํ๊ฒ ํฉ๋๋ค.
์ค์ ์ฌ์ฉ๋ถํฐ ์์ํ์ธ์. ์์ ์ฟผ๋ฆฌ๋ฅผ ๋ ๊ฐ์ง ๋ฐฉ์์ผ๋ก ์ถ์ถํ์ธ์:
- ๊ฐ์ฅ ๋น๋ฒํ ์ฟผ๋ฆฌ
- ๊ฐ์ฅ ๋๋ฆฐ ์ฟผ๋ฆฌ
๊ด๋ฆฌ์ ํจ๋์์๋ ์ด๋ค์ด ๋ณดํต ํํฐ์ ์ ๋ ฌ์ด ์๋ ๋ฆฌ์คํธ ํ์ด์ง์ ๋๋ค.
๋ค์์ผ๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ๋ณด๋ ๊ทธ๋๋ก ์ฟผ๋ฆฌ ํํ๋ฅผ ์บก์ฒํ์ธ์. ์ ํํ WHERE์ ORDER BY๋ฅผ ์ ์ด๋์ธ์(์ ๋ ฌ ๋ฐฉํฅ๊ณผ ํํ ์กฐํฉ ํฌํจ). ์์ ์ฐจ์ด๋ ์ด๋ค ์ธ๋ฑ์ค๊ฐ ๋์์ด ๋๋์ง๋ฅผ ๋ฐ๊ฟ ์ ์์ต๋๋ค.
๊ฐ๋จํ ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ธ์:
- ํ ๊ฐ์ ๋๋ฆฐ ์ฟผ๋ฆฌ์ ํ ๊ฐ์ง ์ธ๋ฑ์ค ๋ณ๊ฒฝ์ ๊ณ ๋ฅด์ธ์.
- ํ๋์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ์กฐ์ ํ์ธ์.
- ๊ฐ์ ํํฐ์ ๊ฐ์ ์ ๋ ฌ๋ก ์ฌ์ธก์ ํ์ธ์.
- ์ฝ์ ๋ฐ ๊ฐฑ์ ์ด ๋์ ๋๊ฒ ๋๋ ค์ง์ง ์์๋์ง ํ์ธํ์ธ์.
- ๋์ ์ฟผ๋ฆฌ๊ฐ ๋ช ํํ ๊ฐ์ ๋๋ฉด ๋ณ๊ฒฝ์ ์ ์งํ์ธ์.
ํ์ด์ง๋ค์ด์
๋ ๋ณ๋๋ก ํ์ธํ์ธ์. ์คํ์
๊ธฐ๋ฐ ํ์ด์ง๋ค์ด์
(OFFSET 20000)์ ์ธ๋ฑ์ค๊ฐ ์์ด๋ ๋ ๊น์ ํ์ด์ง๋ก ๊ฐ์๋ก ๋๋ ค์ง๋๋ค. ์ฌ์ฉ์๊ฐ ๋งค์ฐ ๊น์ ํ์ด์ง๋ก ์์ฃผ ์ด๋ํ๋ค๋ฉด ์ปค์ ์คํ์ผ ํ์ด์ง๋ค์ด์
("์ด ํ์์คํฌํ/ID ์ด์ ํญ๋ชฉ ํ์")์ ๊ณ ๋ คํด ์ธ๋ฑ์ค๊ฐ ํฐ ํ
์ด๋ธ์์๋ ์ผ๊ด๋ ์์
์ ํ๊ฒ ํ์ธ์.
๋ง์ง๋ง์ผ๋ก ์ธ๋ฑ์ค ๋ชฉ๋ก์ ๋ช ๋ฌ ํ์๋ ์ดํดํ ์ ์๊ฒ ๊ฐ๋จํ ๊ธฐ๋ก์ ๋จ๊ธฐ์ธ์: ์ธ๋ฑ์ค ์ด๋ฆ, ํ ์ด๋ธ, ์นผ๋ผ(์์ ํฌํจ), ์ง์ํ๋ ์ฟผ๋ฆฌ.
๊ด๋ฆฌ์ ํจ๋์์ ํํ ์ธ๋ฑ์ฑ ์ค์
์ฌ๋๋ค์ด ์ค์ ๋ก ์ด๋ป๊ฒ ํํฐ๋งํ๊ณ ์ ๋ ฌํ๋ฉฐ ํ์ด์ง๋ฅผ ๋๊ธฐ๋์ง ํ์ธํ์ง ์๊ณ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ฉด ๊ด๋ฆฌ์ ํจ๋์ด ๋๋ ค์ง๋๋ค. ์ธ๋ฑ์ค๋ ์ ์ฅ ๊ณต๊ฐ๊ณผ ๋ชจ๋ ์ฝ์ /๊ฐฑ์ ์ ๋ํ ์ถ๊ฐ ์์ ์ ์๊ตฌํฉ๋๋ค.
์์ฃผ ๋ฐ์ํ๋ ์ค์
๋ค์ ํจํด์ด ๋๋ถ๋ถ์ ๋ฌธ์ ๋ฅผ ์ผ์ผํต๋๋ค:
- "ํน์ ๋ชฐ๋ผ์" ๋ชจ๋ ์ปฌ๋ผ์ ์ธ๋ฑ์ค ์ถ๊ฐ
- ์๋ชป๋ ์ปฌ๋ผ ์์๋ก ๋ณตํฉ ์ธ๋ฑ์ค ์์ฑ
- ์ ๋ ฌ๊ณผ ํ์ด์ง๋ค์ด์ ์ ๋ฌด์
LIKE '%term%'๊ฐ์ ํฌํจ ๊ฒ์์ ์ผ๋ฐ ์ธ๋ฑ์ค๋ก ํด๊ฒฐํ๋ ค ๊ธฐ๋- UI ๋ณ๊ฒฝ ํ ์ค๋๋ ์ธ๋ฑ์ค๋ฅผ ๋จ๊ฒจ๋
ํํ ์๋๋ฆฌ์ค: ์ง์ํ์ด Status = Open์ผ๋ก ํํฐํ๊ณ updated ์๊ฐ์ผ๋ก ์ ๋ ฌํ๋ฉฐ ํ์ด์ง๋ฅผ ๋๊น๋๋ค. status์๋ง ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ ์ฌ์ ํ ์ด๋ฆฐ ํฐ์ผ์ ๋ชจ๋ ๋ชจ์ผ๊ณ ์ ๋ ฌํด์ผ ํ ์ ์์ต๋๋ค. ํํฐ์ ์ ๋ ฌ์ ํจ๊ป ๋ง์ถ ์ธ๋ฑ์ค๊ฐ 1ํ์ด์ง ๋ฐํ์ ๋น ๋ฅด๊ฒ ๋ง๋ญ๋๋ค.
์ด๋ฐ ๋ฌธ์ ๋ฅผ ์ก๋ ๋น ๋ฅธ ๋ฐฉ๋ฒ
๊ด๋ฆฌ์ UI ๋ณ๊ฒฝ ์ ํ์ ์งง์ ๋ฆฌ๋ทฐ๋ฅผ ํ์ธ์:
- ์์ ํํฐ์ ๊ธฐ๋ณธ ์ ๋ ฌ์ ๋์ดํ๊ณ ,
WHERE + ORDER BYํจํด์ ๋ง์กฑํ๋ ์ธ๋ฑ์ค๊ฐ ์๋์ง ํ์ธํ์ธ์. - ์ ํ ์์ผ๋์นด๋(
LIKE '%term%')๋ฅผ ์ฐพ์ ํฌํจ ๊ฒ์์ด ์ ๋ง ํ์ํ์ง ๊ฒฐ์ ํ์ธ์. - ์ค๋ณต๋๊ฑฐ๋ ๊ฒน์น๋ ์ธ๋ฑ์ค๋ฅผ ์ฐพ์๋ณด์ธ์.
- ์ฌ์ฉ๋์ง ์๋ ์ธ๋ฑ์ค๋ฅผ ์ผ์ ๊ธฐ๊ฐ ์ถ์ ํ ๋ค ํ์ ์๋ค๊ณ ํ์ ๋๋ฉด ์ ๊ฑฐํ์ธ์.
AppMaster๋ก PostgreSQL ๊ธฐ๋ฐ ๊ด๋ฆฌ์ ํจ๋์ ๋ง๋ ๋ค๋ฉด, ์ด ๋ฆฌ๋ทฐ๋ฅผ ์ ํ๋ฉด์ ๋ฐฐํฌํ ๋ ๋ฃจํด์ผ๋ก ์ผ์ผ์ธ์. ์ฌ๋ฐ๋ฅธ ์ธ๋ฑ์ค๋ UI๊ฐ ์ค์ ๋ก ์ฌ์ฉํ๋ ํํฐ์ ์ ๋ ฌ์์ ์ง์ ๋์ถ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
๋น ๋ฅธ ์ ๊ฒ ๋ฐ ๋ค์ ๋จ๊ณ
๋ ๋ง์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํ๊ธฐ ์ ์ ์ด๋ฏธ ์๋ ์ธ๋ฑ์ค๊ฐ ๋งค์ผ ์ฐ์ด๋ ์ ํํ ํํฐ์ ๋์์ด ๋๋์ง ํ์ธํ์ธ์. ์ข์ ๊ด๋ฆฌ์ ํจ๋์ ํํ ๊ฒฝ๋ก์์ ์ฆ์ ๋ฐ์ํด์ผ ํ๊ณ , ๋๋ฌธ ๊ฒ์์์๋ง ๋น ๋ฅด๊ฒ ๋์ํ ํ์๋ ์์ต๋๋ค.
๋ช ๊ฐ์ง ์ ๊ฒ๋ง์ผ๋ก ๋๋ถ๋ถ์ ๋ฌธ์ ๋ฅผ ์ก์ ์ ์์ต๋๋ค:
- ๊ฐ์ฅ ํํ ํํฐ ์กฐํฉ(์ํ, ๋ด๋น์, ๋ ์ง ๋ฒ์ + ๊ธฐ๋ณธ ์ ๋ ฌ)์ ์ด์ด ํ ์ด๋ธ์ด ์ปค์ ธ๋ ๋น ๋ฅด๊ฒ ์ ์ง๋๋์ง ํ์ธํ์ธ์.
- ๋๋ฆฐ ๋ทฐ๋ง๋ค ์ฟผ๋ฆฌ๊ฐ
WHERE์ORDER BY๋ชจ๋์ ๋ง๋ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ๊ณ ์๋์ง ํ์ธํ์ธ์. ํ์ชฝ๋ง ๋ง์ผ๋ฉด ๋ถ์กฑํ ์ ์์ต๋๋ค. - ์ธ๋ฑ์ค ๋ชฉ๋ก์ ์๊ฒ ์ ์งํด ๊ฐ ์ธ๋ฑ์ค์ ๋ชฉ์ ์ ํ ๋ฌธ์ฅ์ผ๋ก ์ค๋ช ํ ์ ์๋๋ก ํ์ธ์.
- ์ธ๋ฑ์ค ์ถ๊ฐ ํ ์์ฑ/๊ฐฑ์ ์์ (create, update, status change)์ด ๋๋ ค์ก๋์ง ๊ด์ฐฐํ์ธ์. ๋๋ ค์ก๋ค๋ฉด ์ธ๋ฑ์ค๊ฐ ๋๋ฌด ๋ง๊ฑฐ๋ ๊ฒน์ณ์ ธ ์์ ์ ์์ต๋๋ค.
- UI์์ "๊ฒ์"์ด ๋ฌด์์ ์๋ฏธํ๋์ง ๊ฒฐ์ ํ์ธ์: ์ ํ ์ผ์น, ์ ๋์ฌ, ํฌํจ ์ค ์ด๋ค ๊ฒ์ธ์ง. ์ธ๋ฑ์ฑ ๊ณํ์ ์ด ์ ํ๊ณผ ์ผ์นํด์ผ ํฉ๋๋ค.
์ค์ฉ์ ์ธ ๋ค์ ๋จ๊ณ๋ ๋ค์๊ณผ ๊ฐ์ ๊ณจ๋ ํจ์ค๋ฅผ ๋ฌธ์ฅ์ผ๋ก ์ ๋ ๊ฒ์ ๋๋ค: "์ง์ ์์ด์ ํธ๋ ์คํ ํฐ์ผ์ ํํฐํ๊ณ , ๋ด๊ฒ ํ ๋น๋ ํญ๋ชฉ, ์ง๋ 7์ผ, ์ต์ ์์ผ๋ก ์ ๋ ฌํ๋ค." ๊ทธ๋ฐ ๋ฌธ์ฅ๋ค์ ์ฌ์ฉํด ๊ทธ ๊ฒฝ๋ก๋ค์ ๋ช ํํ ์ง์ํ๋ ์์์ ์ธ๋ฑ์ค๋ฅผ ์ค๊ณํ์ธ์.
์์ง ๊ฐ๋ฐ ์ด๊ธฐ๋ผ๋ฉด ๋๋ฌด ๋ง์ ํ๋ฉด์ ๋ง๋ค๊ธฐ ์ ์ ๋ฐ์ดํฐ์ ๊ธฐ๋ณธ ํํฐ๋ฅผ ๋ชจ๋ธ๋งํ๋ ๊ฒ์ด ๋์์ด ๋ฉ๋๋ค. AppMaster (appmaster.io)๋ฅผ ์ฌ์ฉํ๋ฉด ๊ด๋ฆฌ์ ๋ทฐ๋ฅผ ๋น ๋ฅด๊ฒ ๋ฐ๋ณตํ๊ณ , ์ค์ ์ฌ์ฉ์ด ๋จ๊ฑฐ์ด ๊ฒฝ๋ก๋ฅผ ๋๋ฌ๋ธ ๋ค ์์์ ์ธ๋ฑ์ค๋ฅผ ์ถ๊ฐํด ์ต์ ํํ ์ ์์ต๋๋ค.
์์ฃผ ๋ฌป๋ ์ง๋ฌธ
๋จผ์ ๊ด๋ฆฌ์๋ค์ด ์ฒ์ ๋ณด๋ ๊ธฐ๋ณธ ๋ฆฌ์คํธ ๋ทฐ์ ํ๋ฃจ ์ข ์ผ ํด๋ฆญํ๋ 2โ3๊ฐ์ ํํฐ๋ฅผ ์ต์ฐ์ ์ผ๋ก ํ์ธ์. ์ฌ์ฉ ๋น๋์ ์ฒด๊ฐ ์ง์ฐ(๊ฐ์ฅ ๋๋ฆฐ ์ฟผ๋ฆฌ)์ ์ธก์ ํ ๋ค, ์ ํํ ์ฟผ๋ฆฌ ํํ์ ๋ํด ๊ธฐ๋ค๋ฆผ์ ์ค์ฌ์ฃผ๋ ๊ฒ๋ง ์ธ๋ฑ์ฑํ์ธ์.
ํํฐ๋ง๋ค ์ฒ๋ฆฌํด์ผ ํ๋ ์์ด ๋ค๋ฅด๊ธฐ ๋๋ฌธ์ ๋๋ค. ์ด๋ค ํํฐ๋ ์์ ํ ์งํฉ์ผ๋ก ์ขํ ์ธ๋ฑ์ค๋ฅผ ์ ํ์ฉํ์ง๋ง, ๋ค๋ฅธ ํํฐ๋ ๋์ ๋ฒ์๋ฅผ ์ฝ๊ฑฐ๋ ํฐ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ ฌํด์ผ ํด์ ์ค์บ๊ณผ ์ ๋ ฌ์ด ๋ง์ด ๋ฐ์ํฉ๋๋ค. ๊ทธ๋์ ๊ฐ์ ํ ์ด๋ธ์ด๋ผ๋ ํ ์ฟผ๋ฆฌ๋ ๋น ๋ฅด๊ณ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ ๋๋ ์ ์์ต๋๋ค.
status ์ปฌ๋ผ์ ํญ์ ์ธ๋ฑ์ค๋ฅผ ๊ฑธ์ด์ผ ํ๋ ๊ฒ์ ์๋๋๋ค. ๋๋ถ๋ถ์ ํ์ด ๋์ผํ ์ํ๋ฅผ ๊ฐ์ง๋ฉด status๋ง์ ์ธ๋ฑ์ค๋ ํฐ ๋์์ด ๋์ง ์์ต๋๋ค. ์ํ๊ฐ ํฌ๊ทํ๊ฑฐ๋ ์ํ์ ์ ๋ ฌยท๋ค๋ฅธ ํํฐ๋ฅผ ํจ๊ป ์ธ๋ฑ์ฑํด ์ค์ ๋ทฐ๋ฅผ ์ฌํํ ๋ ํจ๊ณผ๋ฅผ ๋ด
๋๋ค.
์ฌ๋๋ค์ด ์ค์ ๋ก ํ๋ ๋์์ ๋ฐ์ํ๋ ๋ณตํฉ ์ธ๋ฑ์ค๋ฅผ ์ฌ์ฉํ์ธ์. ์: ์ํ๋ก ํํฐํ๊ณ ์ต๊ทผ ํ๋ ์์ผ๋ก ์ ๋ ฌํ๋ ๋ทฐ๋ผ๋ฉด ์ํ์ ์ ๋ ฌ ์ปฌ๋ผ์ ์กฐํฉํ ์ธ๋ฑ์ค๊ฐ ํจ๊ณผ์ ์ ๋๋ค. PostgreSQL์์๋ ํน์ ์ํ๋ง ์ธ๋ฑ์ฑํ๋ ๋ถ๋ถ ์ธ๋ฑ์ค(partial index)๊ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก assignee_id์ ๋จ์ผ ์ธ๋ฑ์ค๋ฅผ ๋ง๋๋ ๊ฒ์ด ๋น ๋ฅธ ์น์์
๋๋ค(๋๋ฑ ๋น๊ต). โ๋ด๊ฐ ํ ๋น๋ ์คํ ํญ๋ชฉโ ๊ฐ์ ํต์ฌ ์ํฌํ๋ก๊ฐ ์ค์ํ๋ฉด (assignee_id, status) ๋๋ ์ ๋ ฌ์ ํฌํจํด (assignee_id, status, updated_at) ๊ฐ์ ๋ณตํฉ ์ธ๋ฑ์ค๊ฐ ๋จ์ผ ์ปฌ๋ผ ์ธ๋ฑ์ค๋ณด๋ค ๋์ ์ ์์ต๋๋ค. ๋ณตํฉ ์ธ๋ฑ์ค๋ ์นผ๋ผ ์์๊ฐ ์ค์ํฉ๋๋ค.
์ข
์ข
unassigned๋ assignee_id๊ฐ NULL์ธ ๊ฒ์ผ๋ก ํํ๋ฉ๋๋ค. WHERE assignee_id IS NULL ์ฟผ๋ฆฌ๋ = 123๊ณผ ๋ค๋ฅธ ์คํ ๊ณํ์ ํ ์ ์์ด ์ธ๋ฑ์ค๊ฐ ๊ธฐ๋๋งํผ ํจ๊ณผ์ ์ด์ง ์์ ์ ์์ต๋๋ค. unassigned ํ๊ฐ ์ค์ํ๋ค๋ฉด ํน์ ์ ๋ต(์: ๋ถ๋ถ ์ธ๋ฑ์ค)์ ํ
์คํธํด ๋ณด์ธ์.
์ฌ๋๋ค์ด ์ค์ ๋ก ์ด๋ค ํ์์คํฌํ๋ฅผ ์๋ฏธํ๋์ง ๋ช
ํํ ํ์ธ์: created_at์ ์ ํญ๋ชฉ, updated_at์ ์ต๊ทผ ๋ณ๊ฒฝ. ํด๋น ์ปฌ๋ผ์ btree ์ธ๋ฑ์ค๋ฅผ ๋๋ฉด ์ต๊ทผ 30์ผ ๊ฐ์ ๋ฒ์ ์ฟผ๋ฆฌ๊ฐ ์ ์ฒด ํ
์ด๋ธ ์ค์บ์ผ๋ก ๊ฐ์ง ์์ต๋๋ค. ์์ฃผ ์ฐ์ด๋ ์กฐํฉ์ด๋ฉด (status, created_at) ๊ฐ์ ๋ณตํฉ ์ธ๋ฑ์ค๋ ๊ณ ๋ คํ์ธ์.
๋๋ถ๋ถ์ ๋ฌธ์ ๋ ๋ฒ์ ๊ฒฝ๊ณ์ ํ์์กด ์ฒ๋ฆฌ์์ ์ต๋๋ค. ์์ ํ ํจํด์ ์์์ ํฌํจ, ๋์ ์ ์ธ๋ก ์ฒ๋ฆฌํ๋ ๊ฒ์
๋๋ค: created_at >= start ๊ทธ๋ฆฌ๊ณ created_at < end_next_day. ํ์์คํฌํ๋ UTC๋ก ์ ์ฅํ๊ณ ์ฌ์ฉ์ ์
๋ ฅ์ UTC๋ก ๋ณํํด ์ฟผ๋ฆฌํ์ธ์.
LIKE %term% ๊ฐ์ contains ๊ฒ์์ ์ผ๋ฐ B-tree ์ธ๋ฑ์ค๋ฅผ ํ์ฉํ์ง ๋ชปํด ๋ง์ ํ์ ์ค์บํฉ๋๋ค. ID, ์ด๋ฉ์ผ, ์ฃผ๋ฌธ๋ฒํธ ๊ฐ์ ์ ํ ์ผ์น ํ๋๋ฅผ ์ฐ์ ์ง์ํ๊ณ , ์ ๋์ฌ ๊ฒ์(term%)์ ์ผ๋ฐ ์ธ๋ฑ์ค๋ก ์ด๋ ์ ๋ ์ปค๋ฒ๋ฉ๋๋ค. ์ง์ ํ contains ๊ฒ์์ด ํ์ํ๋ฉด PostgreSQL full-text search๋ trigram ์ธ๋ฑ์ค ๊ฐ์ ์ ์ ํ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ธ์.
์ธ๋ฑ์ค๋ฅผ ๋ฌด์์ ๋ง์ด ์ถ๊ฐํ๋ฉด ์ ์ฅ ๊ณต๊ฐ์ด ๋๊ณ ์ฝ์
/๊ฐฑ์ ๋น์ฉ์ด ์ฌ๋ผ๊ฐ๋๋ค. ์ธ๋ฑ์ค๊ฐ WHERE + ORDER BY ํจํด๊ณผ ๋ง์ง ์์ผ๋ฉด ๋ณ๋ชฉ์ ํด๊ฒฐํ์ง ๋ชปํฉ๋๋ค. ํ ๋ฒ์ ํ๋์ ์ธ๋ฑ์ค๋ง ๋ฐ๊ฟ์ ์ธก์ ํ๊ณ , ์ค์ ๋ก ๋๋ฆฐ ์ฟผ๋ฆฌ๊ฐ ๊ฐ์ ๋ ๋๋ง ์ ์ฉํ์ธ์.
AppMaster๋ก ๊ด๋ฆฌ์ ํ๋ฉด์ ๋ง๋ ๋ค๋ฉด, ํ์ด ์ฃผ๋ก ์ฌ์ฉํ๋ ํํฐ์ ์ ๋ ฌ์ ๊ธฐ๋กํ๊ณ ๊ทธ ์ค์ ๋ทฐ์ ๋ง๋ ์์์ ์ธ๋ฑ์ค๋ง ์ถ๊ฐํ์ธ์.


