๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”ฅ ํ”„๋กœ์ ํŠธ/์›จ๋”ฉ๋ฉ”์ดํŠธ

[์„ค๊ณ„] Tag ํ…Œ์ด๋ธ” ๋ฆฌํŒฉํ† ๋ง ๋ฐ Tag ๊ฒ€์ƒ‰ ๋ฐฉ์•ˆ

by nitronium102 2023. 8. 13.

ํ˜„์žฌ ์ƒํ™ฉ

์˜ˆ๋น„๋ถ€๋ถ€, ํ”Œ๋ž˜๋„ˆ, ํฌํŠธํด๋ฆฌ์˜ค, ์•„์ดํ…œ์—์„œ ํƒœ๊ทธ๋ฅผ ์ฐธ์กฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ N:M ๊ด€๊ณ„์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ๋Š” ์ค‘๊ฐ„ํ…Œ์ด๋ธ”์„ ๋‘์–ด ํƒœ๊ทธ ํ…Œ์ด๋ธ”๊ณผ ์—ฐ๊ฒฐํ•˜๋Š” ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์œ ์ €๋Š” ์ฃผ์–ด์ง„ ํƒœ๊ทธ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ž์‹ ์ด ์ง์ ‘ ํƒœ๊ทธ๋ฅผ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๊ณ , ์ถ”๊ฐ€ํ•œ ํƒœ๊ทธ๋กœ๋„ ๊ฒ€์ƒ‰์ด ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

image

๋ฌธ์ œ์ 

ํ˜„์žฌ MVP ๊ธฐ๋Šฅ ERD๋งŒ ๊ทธ๋ ธ๋Š”๋ฐ๋„ ํ…Œ์ด๋ธ”์ด ๋งŽ์•„์ง€๊ณ , ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋จ์— ๋”ฐ๋ผ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”๋„ ๋งŽ์•„์ ธ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ๋ณต์žกํ•ด์งˆ ์ˆ˜ ์žˆ๋‹ค๋Š” ๋‹จ์ ์ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

 

ํ•ด๊ฒฐ ๋ฐฉ์•ˆ

1. ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉํ•˜๊ณ , boolean ๊ฐ’์„ ํ†ตํ•ด ํƒœ๊ทธ ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์„ ๊ด€๋ฆฌ

- table_id (long)
- is_customer (bool)
- is_planner (bool)
- is_porfolio (bool)
- is_item (bool)
- tag_type (string)

์žฅ์  : ํ•˜๋‚˜์˜ ํ…Œ์ด๋ธ”๋กœ ๋ชจ๋“  ํƒœ๊ทธ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์„ค๊ณ„๊ฐ€ ๊ฐ„๋‹จํ•ด์ง„๋‹ค
๋‹จ์  : ๊ธฐ๋Šฅ์ด ์ถ”๊ฐ€๋  ๋•Œ๋งˆ๋‹ค ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™•์žฅ์„ฑ์ด ์ข‹์ง€ ์•Š๋‹ค.

ํ˜„์žฌ ์ €ํฌ๋Š” MVP ๊ฐœ๋ฐœ ์ƒํƒœ์ด๊ณ , ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์ด ๊ฐœ๋ฐœ๋  ์ˆ˜ ์žˆ๋Š” ๊ฐ€๋Šฅ์„ฑ์„ ์—ด์–ด๋†“๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ•ด๋‹น ํ•ด๊ฒฐ ๋ฐฉ์•ˆ์€ ์ ์ ˆํ•˜์ง€ ์•Š์•„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

2. ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” ์—†์ด String์œผ๋กœ ํƒœ๊ทธ๋ฅผ ๋ฐ›์•„ ๊ด€๋ฆฌํ•˜๊ธฐ

์ธ์Šคํƒ€๊ทธ๋žจ ๋“ฑ์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ๋Š” ๋ฐฉ์‹์ด๋ฉฐ, ํ•ด๋‹น ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋ฉด ์œ ์ € ์ปค์Šคํ…€ ํƒœ๊ทธ๋กœ๋„ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ

์žฅ์  : ์ค‘๊ฐ„ ํ…Œ์ด๋ธ”์ด ํ•„์š” ์—†์–ด ํ…Œ์ด๋ธ” ๊ตฌ์กฐ ๊ฐ„์†Œํ™” / ์œ ์ € ์ปค์Šคํ…€ ํƒœ๊ทธ๋กœ๋„ ์†์‰ฝ๊ฒŒ ๊ฒ€์ƒ‰ ๊ฐ€๋Šฅ
๋‹จ์  : ๊ฒ€์ƒ‰์„ ์œ„ํ•ด์„œ๋Š” elastic search๋ฅผ ์ด์šฉํ•ด์•ผ ํ•˜๋Š”๋ฐ ํ˜„์žฌ ์‚ฌ์šฉ์ž๊ฐ€ ์—†๋Š” ์ €ํฌ ์„œ๋น„์Šค ์ƒ์œผ๋กœ๋Š” ์˜ค๋ฒ„์ŠคํŽ™์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

 

๋ฉ˜ํ† ๋ง

์ผ๋‹จ ์ปค์Šคํ…€ ํƒœ๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•ด์„œ ๋” ๋ณต์žกํ•ด์ง€๋Š” ๊ฒƒ ๊ฐ™๋‹ค๋Š” ์˜๊ฒฌ์„ ์ฃผ์…จ์Šต๋‹ˆ๋‹ค. ์ฐจ๋ผ๋ฆฌ ์„œ๋น„์Šค ๋Ÿฐ์นญ ์‹œ ์ตœ๋Œ€ํ•œ ํƒœ๊ทธ๋ฅผ ๋งŽ์ด ์ค€๋น„ํ•ด์„œ ์ปค์Šคํ…€ ํƒœ๊ทธ ์—†์ด ์ €ํฌ๊ฐ€ ์ œ๊ณตํ•œ ํƒœ๊ทธ๋งŒ์œผ๋กœ EQUALS๋‚˜ LIKE ๊ฒ€์ƒ‰์„ ํ•˜๋Š” ๊ฒƒ์ด ๋‚˜์•„๋ณด์ž…๋‹ˆ๋‹ค.

 

๊ฒฐ๋ก 

๋ฌธ์ž์—ด ๋ฐฉ์‹์„ ์‚ฌ์šฉํ•˜๋˜ ๊ฒ€์ƒ‰์˜ ๊ฒฝ์šฐ elastic search ๋Œ€์‹  ๊ทธ๋ƒฅ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰(ex. '์นœ์ ˆํ•œ' -> '์นœ์ ˆ')๋กœ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

 

์ถ”๊ฐ€ ์˜๊ฒฌ

๊ฐœ์ธ์ ์œผ๋กœ๋Š” File ๋ฆฌํŒฉํ† ๋ง์—์„œ ์‚ฌ์šฉ ์˜ˆ์ •์ธ ๋ฐฉ์‹๋„ ์ข‹์•„๋ณด์ž…๋‹ˆ๋‹ค.

Long target_tag_id; // ์ค‘๊ฐ„ ํ…Œ์ด๋ธ” id
Long tag_id             // ํƒœ๊ทธ id
Long target_id        //  ๊ธฐ๋Šฅ id (planner, portfolio, customer, item)
String target_type   // ์–ด๋–ค ๊ธฐ๋Šฅ์ธ์ง€ ํ‘œ์‹œ

๋Œ“๊ธ€