๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ199

[ TIL ] ์ตœ์ข… ํ”„๋กœ์ ํŠธ_Day 16 ์˜ค๋Š˜ ์ง„ํ–‰ํ•œ ๋‚ด์šฉ๋“ค ๐Ÿง ์ง€๊ธˆ๊นŒ์ง€ ์ง„ํ–‰ํ•œ ๋‚ด์šฉ๋“ค ์ •๋ฆฌV1 (MVP ๊ตฌํ˜„)1. ์ „์ฒด ์ฑ„์šฉ ๊ณต๊ณ  ์กฐํšŒ API๊ธฐ๋Šฅ์‚ฌ์šฉ์ž๊ฐ€ ์ „์ฒด ์ฑ„์šฉ ๊ณต๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๊ณ  ํ•„ํ„ฐ๋ง ๋ฐ ๊ฒ€์ƒ‰์–ด๋ฅผ ํ†ตํ•ด ํšจ์œจ์ ์œผ๋กœ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ตฌํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค.์„ธ๋ถ€ ์‚ฌํ•ญ๊ธฐ๋Šฅ์„ค๋ช…์ „์ฒด ๋ฐ์ดํ„ฐ ์กฐํšŒ๋ณ„๋„์˜ ๊ฒ€์ƒ‰์–ด๋‚˜ ํ•„ํ„ฐ ์กฐ๊ฑด ์—†์ด ๋ชจ๋“  ์ฑ„์šฉ ๊ณต๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.ํ•„ํ„ฐ๋ง์„ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์กฐํšŒ์‚ฌ์šฉ์ž๊ฐ€ ์ž…๋ ฅํ•œ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์กฐ๊ฑด์„ ์„ค์ •ํ•˜์—ฌ ์ฑ„์šฉ ๊ณต๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.- ํ•„ํ„ฐ ์กฐ๊ฑด: ์ง€์—ญ, ๊ณ ์šฉ ํ˜•ํƒœ, ํ•™๋ ฅ, ์ตœ์†Œ/์ตœ๋Œ€ ๊ฒฝ๋ ฅ, ์ฑ„์šฉ ์‹œ์ž‘/๋งˆ๊ฐ ๊ธฐ๊ฐ„, ์ž๊ฒฉ ์š”๊ฑด๊ฒ€์ƒ‰์–ด๋ฅผ ํ†ตํ•œ ๋ฐ์ดํ„ฐ ์กฐํšŒํŠน์ • ๊ฒ€์ƒ‰์–ด๋ฅผ ์ž…๋ ฅํ•˜๋ฉด ์ฑ„์šฉ ๊ณต๊ณ  ์ œ๋ชฉ์„ ๊ธฐ์ค€์œผ๋กœ ๊ฒ€์ƒ‰ํ•˜์—ฌ ๊ด€๋ จ ์ฑ„์šฉ ๊ณต๊ณ ๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.๋ฐ์ดํ„ฐ ์ •๋ ฌ์ฑ„์šฉ ๊ณต๊ณ ๋Š” ์ตœ์‹  ๋“ฑ๋ก์ˆœ(createdAt D.. 2025. 2. 27.
[ TIL ] ์ตœ์ข… ํ”„๋กœ์ ํŠธ_Day 15 ์˜ค๋Š˜ ์ง„ํ–‰ํ•œ ๋‚ด์šฉ๋“ค ๐Ÿง Elasticsearch ๋™์  ์ฟผ๋ฆฌ ์ž‘์„ฑํ•˜๊ธฐํ•„ํ„ฐ๋ง์ด ํ•„์š”ํ•œ ์กฐ๊ฑด๋“ค์„ ๋™์  ์ฟผ๋ฆฌ๋กœ ์ž‘์„ฑํ–ˆ๋‹ค. ํ•„ํ„ฐ๋ง์— ๋“ค์–ด๊ฐ€๋Š” ์กฐ๊ฑด๋“ค์ด ์ƒ๊ฐ๋ณด๋‹ค ๋งŽ์•„์„œ Elasticsearch์˜ ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š”๋ฐ ์ƒ๊ฐ๋ณด๋‹ค ์–ด๋ ค์› ๋‹ค. Bool ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด์„œ must์™€ filter ์ค‘์—์„œ ์„ ํƒํ•ด์•ผ ํ–ˆ๊ณ , ์ €์žฅํ•˜๋Š” ํ•„๋“œ๋„ keyword์™€ text ์ค‘์—์„œ ์„ ํƒํ•ด์•ผ ํ–ˆ๋‹ค. ๊ฐ๊ฐ์˜ ํŠน์ง•์„ ์ฐพ์•„๋ณด๋ฉด์„œ ๋ญ๊ฐ€ ๋” ์ ํ•ฉํ•œ์ง€ ์ƒ๊ฐํ•ด๋ณด๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.ํ•˜์ง€๋งŒ filter ์•ˆ์—์„œ๋„ term ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์•„๋‹ˆ๋ฉด ๋‹ค๋ฅธ ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ• ์ง€ ์„ ํƒํ•ด์•ผ ํ–ˆ๊ณ , ๋งŽ์€ ์„ ํƒ์‚ฌํ•ญ์ด ์กด์žฌํ–ˆ๋‹ค. ํŠœํ„ฐ๋‹˜์˜ ํžŒํŠธ๋ฅผ ํ†ตํ•ด ๋™์  ์ฟผ๋ฆฌ๋ฅผ ์™„์„ฑํ–ˆ๊ณ  ์ตœ์ข…์ ์œผ๋กœ ์ž˜ ๋™์ž‘ํ•˜๋Š” ๊ฒƒ๋„ ํ™•์ธํ–ˆ๋‹ค.API์™€ ์—ฐ๋™ํ•œ ํ›„ ์„ฑ๋Šฅ ํ™•์ธํ•˜๊ธฐAPI๋ฅผ ์—ฐ๋™ํ•œ ํ›„ Po.. 2025. 2. 25.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] Elasticsearch ์ธ๋ฑ์Šค ์‚ฝ์ž… ๋ฐ ์กฐํšŒ ์‹คํŒจ ๋ฌธ์ œ ํ•ด๊ฒฐ๊ธฐ (์ธ๋ฑ์Šค, ๋งคํ•‘, ID ์ค‘๋ณต) Elasticsearch ๋ฐ์ดํ„ฐ ์‚ฝ์ž… ๋ฐ ์กฐํšŒ ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ณผ์ • Elasticsearch์— CSV ๋ฐ์ดํ„ฐ๋ฅผ ์‚ฝ์ž…ํ•˜๊ณ  ์กฐํšŒํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฐ์ดํ„ฐ๊ฐ€ ์กฐํšŒ๋˜์ง€ ์•Š์•„ ์›์ธ์„ ๋ถ„์„ํ•˜๊ณ  ํ•ด๊ฒฐํ–ˆ๋˜ ๊ณผ์ •์„ ์ •๋ฆฌํ•ด ๋ดค๋‹ค.๋ฐœ์ƒํ•œ ๋ฌธ์ œ์™€ ์›์ธ ๋ถ„์„1.  ์ธ๋ฑ์Šค ๋„ค์ด๋ฐ ๋ถˆ์ผ์น˜ ๋ฌธ์ œ๋ฌธ์ œ ์ƒํ™ฉElasticsearch์—์„œ ์ธ๋ฑ์Šค๋ฅผ ์ƒ์„ฑํ•  ๋•Œ๋Š” "job-opening"์œผ๋กœ ์„ค์ •ํ–ˆ์ง€๋งŒ, ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•  ๋•Œ๋Š” "job_opening"์œผ๋กœ ์กฐํšŒํ•˜๋Š” ์‹ค์ˆ˜๋ฅผ ๋ฒ”ํ–ˆ๋‹ค.Kibana์—์„œ ์กฐํšŒ ์‹œ ๋ฐ์ดํ„ฐ๊ฐ€ ๋‚˜ํƒ€๋‚˜์ง€ ์•Š์•˜๋‹ค.ํ•ด๊ฒฐ ๋ฐฉ๋ฒ• ์ธ๋ฑ์Šค๋ช…์„ ์ƒ์ˆ˜(static final)๋กœ ์ •์˜ํ•˜์—ฌ, ์ƒ์„ฑ๊ณผ ์กฐํšŒ ์‹œ ์ผ๊ด€์„ฑ์„ ์œ ์ง€ํ–ˆ๋‹ค.public static final String INDEX_NAME = "job-opening"; 2. ๋™์  ๋งคํ•‘(@Postconstr.. 2025. 2. 25.
[ ํŠธ๋Ÿฌ๋ธ” ์ŠˆํŒ… ] Elasticsearch keyword ํ•„๋“œ์˜ ์ค‘์š”์„ฑ (term ์ฟผ๋ฆฌ๊ฐ€ ์•ˆ๋  ๋•Œ) Elasticsearch์—์„œ term ์ฟผ๋ฆฌ๊ฐ€ ๋™์ž‘ํ•˜์ง€ ์•Š๋Š” ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฌธ์ œ ์ƒํ™ฉ์ฑ„์šฉ ๊ณต๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์„ Spring API์™€ Elasticsearch๋ฅผ ์—ฐ๋™ํ•˜์—ฌ ๊ตฌํ˜„ํ•˜๋˜ ์ค‘, ์ž๊ฒฉ ์š”๊ฑด(requiredSkills)์„ term ์ฟผ๋ฆฌ๋ฅผ ํ†ตํ•ด ํ•„ํ„ฐ๋งํ–ˆ๋”๋‹ˆ ๋ฐ์ดํ„ฐ๊ฐ€ ์ „ํ˜€ ์กฐํšŒ๋˜์ง€ ์•Š๋Š” ํ˜„์ƒ์ด ๋ฐœ์ƒํ–ˆ๋‹ค.๊ธฐ์กด ์ฟผ๋ฆฌ// ์ž๊ฒฉ ์š”๊ฑด ํ•„ํ„ฐ๋งif (requestDto.getRequiredSkill() != null) { boolQueryBuilder.filter(f -> f .term(t -> t .field("requiredSkills") .value(requestDto.getRequiredSkill()) ) );}์›์ธ ๋ถ„์„๋จผ์ € Ela.. 2025. 2. 25.
[ TIL ] ์ตœ์ข… ํ”„๋กœ์ ํŠธ_Day 14 ์˜ค๋Š˜ ์ง„ํ–‰ํ•œ ๋‚ด์šฉ๋“ค ๐Ÿง match vs wildcardmatch์—ญ์ƒ‰์ธ(Inverted Index)์„ ํ™œ์šฉํ•˜๋Š” ํ’€ํ…์ŠคํŠธ ๊ฒ€์ƒ‰(Full-Text Search) ๋ฐฉ์‹analyzed ๋œ ํ•„๋“œ์—์„œ ํ† ํฐํ™”(Tokenization)์™€ ํ…์ŠคํŠธ ์ •๊ทœํ™”๋ฅผ ๊ฑฐ์ณ ๊ฒ€์ƒ‰์–ด๋ฅผ ๋งค์นญ๋™์ž‘ ๋ฐฉ์‹๊ฒ€์ƒ‰์–ด๋ฅผ ํ† ํฐํ™”ํ•˜๊ณ , ์œ ์‚ฌํ•œ ๋‹จ์–ด๊นŒ์ง€ ํฌํ•จํ•ด์„œ ๊ฒ€์ƒ‰์ผ๋ฐ˜์ ์œผ๋กœ text ํƒ€์ž… ํ•„๋“œ์—์„œ ์‚ฌ์šฉํ•˜๋ฉฐ, standard, ngram, edge_ngram ๋“ฑ์˜ ๋ถ„์„๊ธฐ๊ฐ€ ์ ์šฉํ† ํฐ ๋‹จ์œ„๋กœ ๊ฒ€์ƒ‰ํ•˜๋ฏ€๋กœ ํŠน์ • ์œ„์น˜์— ์žˆ๋Š” ๋ฌธ์ž๋‚˜ ์™„์ „ํ•œ ์ผ์น˜ ๊ฒ€์ƒ‰์—๋Š” ์ ํ•ฉํ•˜์ง€ ์•Š์Œ์žฅ์ ๋น ๋ฅธ ๊ฒ€์ƒ‰ ์†๋„ (์—ญ์ƒ‰์ธ์„ ํ™œ์šฉํ•˜์—ฌ ์ตœ์ ํ™”๋จ)์œ ์‚ฌํ•œ ๊ฒ€์ƒ‰์–ด๋„ ๋งค์นญ ๊ฐ€๋Šฅ (ํ† ํฐํ™”๋œ ๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒ€์ƒ‰)์ž์—ฐ์–ด ๊ฒ€์ƒ‰(NLP)๊ณผ ์ž˜ ์–ด์šธ๋ฆผ๋‹จ์ ๋ถ€๋ถ„ ๋ฌธ์ž์—ด ๊ฒ€์ƒ‰(contains ๊ฐ™์€ ๊ฒ€์ƒ‰)์—๋Š” ์ ํ•ฉํ•˜.. 2025. 2. 24.
[ TIL ] ์ตœ์ข… ํ”„๋กœ์ ํŠธ_Day 11 ์˜ค๋Š˜ ์ง„ํ–‰ํ•œ ๋‚ด์šฉ๋“ค ๐Ÿง Elasticsearch ๊ธฐ๊ฐ„ ๊ฒ€์ƒ‰ ์กฐํšŒ ์„ฑ๋Šฅ ๋น„๊ตํ•˜๊ธฐhiringStartAt๊ณผ hiringEndAt์„ ํ†ตํ•ด ์ฑ„์šฉ ๊ณต๊ณ ๋ฅผ ์กฐํšŒํ•˜๋Š” ๊ธฐ๋Šฅ์— Elasticsearch๋ฅผ ์ ์šฉํ–ˆ์„ ๋•Œ ์„ฑ๋Šฅ์ด ์–ผ๋งˆ๋‚˜ ํ–ฅ์ƒ๋˜๋Š”์ง€ ํ™•์ธํ•ด๋ดค๋‹ค. Elasticsearch๋ฅผ ์ ์šฉํ•˜๊ธฐ ์ „ํ›„์˜ ์†๋„๋ฅผ JMeter๋ฅผ ์ด์šฉํ•˜์—ฌ ์„ฑ๋Šฅ์„ ๋น„๊ตํ•ด ๋ณด์•˜๋‹ค.100๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ , 10์ดˆ ๋™์•ˆ 10ํšŒ๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ด 1,000๊ฐœ์˜ ์š”์ฒญ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ํ…Œ์ŠคํŠธ๋ฅผ ์ง„ํ–‰ํ–ˆ๋‹ค.Elasticsearch ์ ์šฉํ•˜๊ธฐ ์ „ํ›„ ์†๋„๊ฐ€ ์ฐจ์ด๊ฐ€ ๋ˆˆ์— ๋„๊ฒŒ ์ค„์–ด๋“  ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค. ์ ์šฉํ•˜๊ธฐ ์ „์—๋Š” 8ms์˜€๋Š”๋ฐ, Elasticsearch๋ฅผ ์ ์šฉํ•˜๊ณ  ๋‚˜๋‹ˆ 1ms๊นŒ์ง€ ๋–จ์–ด์กŒ๋‹ค.ํ…Œ์ŠคํŠธ ์ฝ”๋“œ ๊ณต๋ถ€ํ•˜๊ธฐ์•„์ง ๊ณผ์ œ์—์„œ ์ˆ˜์ •ํ•˜๋Š” ๊ฒƒ๋งŒ ํ•ด๋ณด๊ณ  ์‹ค์ œ๋กœ ๋‚ด๊ฐ€ ์ง์ ‘ ํ…Œ์Šค.. 2025. 2. 21.