๊ฒ์ ์๊ตฌ ์ฌํญ์ ์ํ Elasticsearch ์ธ๋ฑ์ค & Query DSL ์ค๊ณ๊ธฐ
์ฌ๋ด ์ค์ต์ผ๋ก ๊ฒ์ ๊ธฐ๋ฅ ์๊ตฌ์ฌํญ์ ๋ฐ์ํด Elasticsearch์ ์ธ๋ฑ์ค ์ค์ ๊ณผ ๋งคํ์ ์ ์ํ๊ณ , ๊ฒ์์ ์ํ Query DSL(JSON ๊ธฐ๋ฐ ์ฟผ๋ฆฌ ์ธ์ด, Not OpenFeign QueryDSL)์ ์์ฑํ๋ฉด์ ๊ณ ๋ฏผํ๋ ์ ๋ค์ ์ ๋ฆฌํ ๊ธ์ ๋๋ค.
๊ฐ๋ฐ ํ๊ฒฝ
- VirtualBox (Rocky Linux)
- Elasticsearch 7.10.2
- ํ๋์ ํด๋ฌ์คํฐ์ ๋ ธ๋ 3๊ฐ ๊ตฌ์ฑ
API ์์ฒญ/์๋ต ๋๊ตฌ
- Kibana / Postman
1. ๋ช ์ฌ๊ตฌ๊ฐ ์ผ์นํ๋ ๊ฒฝ์ฐ ๊ฒ์์ด ๋ ์๋๊ฒ ํด์ฃผ์ธ์.
์ด๋ฅผ ์ํด mulit_match ์ phrase ํ์ ์ ํ์ฉํ๋ค. multi_match๋ type์ ๋ฐ๋ผ ์ฟผ๋ฆฌ ์คํ ๋ฐฉ๋ฒ์ด ๋ฌ๋ผ์ง๋ค.
multi_match ์ฟผ๋ฆฌ์ type๋ณ ๋์
- best_fields (๊ธฐ๋ณธ๊ฐ)
์ฌ๋ฌ ํ๋ ์ค ํ๋์์ ๊ฒ์์ด๊ฐ ๊ฐ์ฅ ์ ๋งค์น๋๋ ๊ฒฝ์ฐ ํด๋น ํ๋์ ์ ์๋ง ์ต์ข
_score๋ก ์ฌ์ฉ๋๋ค.
์๋ฅผ ๋ค์ด, title, summary, contents๊ฐ ๊ฒ์ ๋์์ผ ๋, ๊ฒ์์ด๊ฐ title์์ ๊ฐ์ฅ ์ ๋งค์น๋๋ฉด title ํ๋์ ์ ์๋ง ๋ฐ์๋๋ค.
์ฆ, "์ ๋ชฉ์ ํฌํจ๋์ด ์๋ค๋ฉด ๊ฐ์ฅ ์ฐพ๊ธฐ ์ฌ์ด ๋ฌธ์"๋ ์๊ตฌ์ฌํญ์ ์ ๋ชฉ์ ๊ฐ์ค์น๋ฅผ ๋์ด ์ฝ๊ฒ ๊ตฌํ์ด ๊ฐ๋ฅํ๋ค.
{
"query": {
"multi_match": {
"query": "์ ๊ธฐํ๋",
"type": "best_fields",
"fields": ["title^5", "summary^2", "contents"]
}
}
}
์ฐธ๊ณ , best_fields์ bool.should ์ฟผ๋ฆฌ์์ ์ฐจ์ด์
bool.should๋ก ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ๊ตฌ์ฑํ๋ฉด, ์ธ ํ๋์์์ ๋งค์นญ ์ ์๋ฅผ ๋ชจ๋ ๋ํ _score๊ฐ ๊ณ์ฐ๋๋ค. multi_match์ best_fields๋ ๊ฐ์ฅ ์ ๋งค์น๋ ๋จ์ผ ํ๋์ ์ ์๋ง ๋ฐ์๋๋ ๋ฐ๋ฉด, bool.should๋ ๋ชจ๋ ํ๋ ์ ์๋ฅผ ํฉ์ฐํ๋ค๋ ์ฐจ์ด๊ฐ ์๋ค.
"query": {
"bool": {
"should": [
{ "match": { "title": "์ ๊ธฐํ๋" }},
{ "match": { "summary": "์ ๊ธฐํ๋" }},
{ "match": { "contents": "์ ๊ธฐํ๋" }}
]
}
}
- phrase ํ์
multi_match์์ type: "phrase"๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ ๋ด์ฉ์ฒ๋ผ match_phrase ์ฟผ๋ฆฌ๊ฐ ์คํ๋๋ค. ์ด๋ ๋ช ์ฌ๊ตฌ๊ฐ ์์๋๋ก ์ผ์นํ๋ ๊ฒฝ์ฐ์ ์ ํฉํ๋ค.
The phrase and phrase_prefix types behave just like best_fields, but they use a match_phrase or match_phrase_prefix query instead of a match query.
์ฒซ ๋ฒ์งธ multi_match๋ ์ ํํ ๋ช ์ฌ๊ตฌ ์ผ์น์ ๊ฐ์ค์น๋ฅผ ์ฃผ๊ณ , ๋ ๋ฒ์งธ multi_match ๋ ์ ํํ ๋ช ์ฌ๊ตฌ ์ผ์น๊ฐ ์์ ๊ฒฝ์ฐ ๊ฒ์์ด ๋๊ธฐ ์ํ ์ฟผ๋ฆฌ๋ก ์๊ฐํ๋ฉฐ ๋ง๋ค์๋ค.
{
"query": {
"bool": {
"should": [
{
"multi_match": {
"query": "๊ตญ๋ฏผ์ํ ์ฒญ๋
์ต๊ณ ์์ ๊น์ฌ์",
"type": "phrase",
"fields": ["title^10", "writer^10", "contents^2"]
}
},
{
"multi_match": {
"query": "๊ตญ๋ฏผ์ํ ์ฒญ๋
์ต๊ณ ์์ ๊น์ฌ์",
"fields": ["title^5", "writer^5", "contents"]
}
}
]
}
},
2. unique filter ์ฌ์ฉ ์ ์ฃผ์์
๋ด์ค ์์ฑ์๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ด์ค๋ฅผ ๊ฒ์ํ๊ณ ์ถ๋ค. ์์ฑ์ ํ๋์๋ "์ ์๋ ๊ธฐ์, ๋ฐํ์ ๊ธฐ์" ๋๋ "์ ์๋ ๊ธฐ์"์ฒ๋ผ ๊ฐ์ด ๋ค์ด์จ๋ค.
์ฒ์์๋ nori_tokenizer๋ฅผ ์๊ฐํ์ง๋ง nori_tokenizer๋ "์ ์๋ ๊ธฐ์"๋ฅผ "์ ์" + "๋"์ผ๋ก ํ ํฐํํ๊ธฐ ๋๋ฌธ์, ๊ณต๋ฐฑ ๊ธฐ์ค์ผ๋ก ํ ์ ๋๋๊ณ ์ผ๋ถ ํน์๋ฌธ์๋ฅผ ์ ๊ฑฐํ๋ standard tokenizer๋ฅผ ์ฌ์ฉํด "์ ์๋", "๊ธฐ์", "๋ฐํ์", "๊ธฐ์"์ ๊ฐ์ ํ ์ ์์ฑํ๋๋ก ํ๋ค.
์ด ๊ณผ์ ์์ "๊ธฐ์"๊ฐ ์ค๋ณต๋๊ธฐ ๋๋ฌธ์ unique filter๋ฅผ ์ ์ฉํ๋ฉด "๊ธฐ์" ํ ์ด ํ๋๋ง ๋จ๋๋ค. ์ฒ์์ ์ด ๋ฐฉ์์ด ๋ ํจ์จ์ ์ด๋ผ๊ณ ์๊ฐํ๋ค.
ํ์ง๋ง ๋ฌธ์ ๋ unique filter๊ฐ term์ ์์น ์ ๋ณด(position)๋ฅผ ์ ์งํ์ง ์๋๋ค๋ ์ ์ด๋ค. ๊ทธ๋์ "์ ์๋ ๊ธฐ์" ๋๋ "๋ฐํ์ ๊ธฐ์"์ ๊ฐ์ด ๋ช
์ฌ๊ตฌ ์ ์ฒด๋ฅผ ๋์์ผ๋ก match_phrase ๊ฒ์์ ํ ๊ฒฝ์ฐ, ๋ช
์ฌ๊ตฌ๊ฐ ์ผ์นํ๋ ๊ฒ์ ๊ฒฐ๊ณผ๊ฐ ๋์ค์ง ์๊ฒ ๋๋ค.
๋ฐ๋ผ์ unique filter๋ match_phrase ๊ฒ์์ด ํ์ ์๋ ํ๋์ ์ ์ฉํ๋ ๊ฒ์ด ์ ์ ํ๋ค๊ณ ํ๋จ์ด ๋๋ฉฐ, unique filter ๋ ์ฌ์ฉํ์ง ์๊ฒ ๋์๋ค.
3. ์ ๋ชฉ ํ๋์ ๊ฒ์์ด๊ฐ ํฌํจ๋ ๊ฒฝ์ฐ ๊ฐ์ค์น ๋ถ์ฌ
์ ๋ชฉ(title)์ ๊ฒ์์ด๊ฐ ํฌํจ๋์์ ๋ ๋ ๋์ ์ ์๋ฅผ ์ฃผ๊ธฐ ์ํด, ๋ ๊ฐ์ง ๋ฐฉ๋ฒ์ ์๊ฐํ๋ค.
1. Mappings์์ boost ์ค์ ํ๊ธฐ
"mappings": {
"properties": {
"title": {
"type": "text",
"boost": 10
}
}
}
2. Query DSL ์์ ํ๋๋ณ ๊ฐ์ค์น ๋ถ์ฌํ๊ธฐ
# ๋จ์ผ ํ๋ ๊ฒ์ ์
"match": {
"title": {
"query": "...",
"boost": 10
}
}
# ์ฌ๋ฌ ํ๋๋ฅผ ๋์์ ๊ฒ์ํ ๋
"multi_match": {
"query": "๊ตญ๋ฏผ์ํ ์ฒญ๋
์ต๊ณ ์์",
"type": "phrase",
"fields": ["title^10", "writer^10", "contents^2"]
}
๋๋ Query DSL์์ ๊ฐ์ค์น๋ฅผ ๋ถ์ฌํ๋ ๋ฐฉ์์ ์ ํํ๋ค.
๊ทธ ์ด์ ๋ mappings์ด๋ settings๋ ํ ๋ฒ ์ ์๋๋ฉด ์ฌ์์ธ(reindex) ์์ด๋ ์์ ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค. (ํ๋ ์ถ๊ฐ๋ ์ ์ธ)
reindex๋ ๊ธฐ์กด ์ธ๋ฑ์ค์ ๋ฌธ์๋ฅผ ์ ์ธ๋ฑ์ค๋ก ๋ค์ ์์ธํ๋ ์์
์ด๋ค.
๋ฐ๋ผ์ title ํ๋์ ๊ฐ์ค์น๋ฅผ 10์์ 20์ผ๋ก ๋ฐ๊พธ๋ ค๋ ์๋ก์ด ์๊ตฌ์ฌํญ์ด ์๊ฒผ์ ๋, ๊ธฐ์กด mappings์ boost ๊ฐ์ ์ค์ ํด๋๋ค๋ฉด ์ ์ฐํ๊ฒ ๋์ํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
4. ๊ฒ์ ํ๋์ธ '์ ๋ชฉ'์ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํด ์ฃผ์ธ์.
์ ๋ชฉ์ ๊ฒ์ ๋์์ด์ ์ ๋ ฌ ๊ธฐ์ค์ด ๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์, multi-fields๋ฅผ ์ฌ์ฉํด ํด๊ฒฐํ๋ค.
๋จผ์ , ๊ฒ์ ๋์์ธ ์ ๋ชฉ์ ์์ธํ๊ธฐ ์ํด์ ์ ๋ชฉ ํ๋๋ฅผ mappings ์ ์ ๋๋ผ์ด์ ์ text ํ์ ์ ์ ์ํ๊ฒ ๋๋ค.
"mappings": {
"properties": {
...
"title": {
"type": "text",
"analyzer": "korean_basic_analyzer" // custom ์ ๋๋ผ์ด์
}
}
ํ์ง๋ง text ํ์
์ ์ ๋ ฌ์ด ๋ถ๊ฐ๋ฅํ๋ค.
๊ทธ ์ด์ ๋ ์์ธ ์ ์ ๋๋ผ์ด์ ๋ฅผ ํตํด ํ
์คํธ๊ฐ ํ ํฐํ๋๊ณ , ๊ฒฐ๊ณผ์ ์ผ๋ก ์ญ์์ธ ๊ตฌ์กฐ๋ก ์ ์ฅ๋๊ธฐ ๋๋ฌธ์ด๋ค.
์๋ฅผ ๋ค์ด "๋ผ๋ฉด"์ด ํฌํจ๋ ๋ฌธ์๊ฐ 1, 2, 3๋ฒ์ผ ๊ฒฝ์ฐ, ์ธ ๋ฌธ์ ๋ชจ๋ "๋ผ๋ฉด"์ด๋ผ๋ ํ
์ ๊ฐ๊ณ ์์ด ์ด๋ค ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ ์ง ์ ์ ์๋ค. ์ด ๊ฒฝ์ฐ Elasticsearch๋ _score ๊ธฐ์ค์ผ๋ก๋ง ์ ๋ ฌํ๊ฒ ๋๋ค.
์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด title ํ๋๋ฅผ ๋ฉํฐ ํ๋๋ก ์ค์ ํด keyword ํ์ ์ ์ถ๊ฐํ๋ค. keyword๋ ํ ํฐํ๋ฅผ ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ ๋ ฌ ๊ธฐ์ค์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. keyword ํ์ ์ ํ๋๋ ์ ๋๋ผ์ด์ ๋์ ๋ ธ๋ฉ๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ๋ฉฐ, ๋ ธ๋ฉ๋ผ์ด์ ๋ ํ ํฌ๋์ด์ ๊ฐ ์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด๋ ๊ฒ title ์ title.text ์ title.keyword ๋ก multi_fields๋ฅผ ๋๋ค๋ฉด ์ด ๋ ํ๋๋ ์์ ํ ๋ณ๊ฐ๋ก ๋์ํ๊ฒ ๋๋ค.
"mappings": {
"properties": {
...
"title": {
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
},
"analyzer": "korean_basic_analyzer" // custom ์ ๋๋ผ์ด์
}
}
๊ทธ๋ฆฌ๊ณ , Query DSL ์์ฑ ์, sort์ title.keyword ํ๋๋ฅผ ์ถ๊ฐํ๋ฉด ๋๋ค.
"sort": [
{ "title.keyword": "asc" }
]
๊ทธ๋ฌ๋, ์ด๋ ๊ฒ ํ๋๊ฐ ๊ฒ์ ๋์์ด๋ฉด์, keyword ๋ฅผ ํ์ฉํด ์ ๋ ฌํ๋ฉด score ๊ธฐ๋ฐ์ด ๋ฌด์๋์ด ๋ฌธ์ ๊ฒ์ ์ ํ๋๊ฐ ๋จ์ด์ง๊ฒ ๋๋ค.
๊ทธ๋์, ์ ๋ ฌ์ด ํ์ํ๋ค๋ฉด ๊ฒ์ ๋์์ผ๋ก ์ ๋ ฌํ๊ธฐ ๋ณด๋ค๋ ํ ํฐํ ๋์ง ์๋ ํ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ ๋ ฌํ๋ ์๊ตฌ์ฌํญ์ผ๋ก ๋ณ๊ฒฝํ๋ฉด ์ข์ ๋ฏ ํ๋ค.
์ถ๊ฐ๋ก ๊ณต์๋ฌธ์์์ ๋ฉํฐ ํ๋๋ ๊ฐ์ ํ๋๋ฅผ ์ฌ๋ฌ ์ ๋๋ผ์ด์ ๋ฅผ ํ์ฉํด ๊ฒ์ ์ ํ๋๋ฅผ ๋์ด๋๋ฐ๋ ์ฌ์ฉ๋๋ค๊ณ ํ๋ค.
* Multi-fields with multiple analyzers
5. ๊ฒ์ ๋์์ด ์๋ ํ๋๋ ์ ๋๋ผ์ด์ ๋์ ๋ ธ๋ฉ๋ผ์ด์ ์ฌ์ฉ
์ ๋๋ผ์ด์ ๋ 0~3๊ฐ์ Character Filter, 1๊ฐ์ Tokenizer, 0~n๊ฐ์ Token Filter ๋ก ๊ตฌ์ฑ๋๋ค.
ํ์ง๋ง, ๋ ธ๋ฉ๋ผ์ด์ ๋ Tokenizer๋ฅผ ์ ์ฉํ ์ ์๋ค. ๋ค์ ๋งํด ๊ฒ์ ๋์์ด ์๋ ํ๋๋ ๋ ธ๋ฉ๋ผ์ด์ ๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์๋ฅผ ๋ค์ด, ๋ ธ๋ฉ๋ผ์ด์ ๋ "์ฐ๋ฆฌ์ ๋ชฉํ๋ ํ๋ณตํ๊ธฐ ์ ๋๋ค." ๋ฅผ ์ ์ฅํ ๋, "์ฐ๋ฆฌ" "๋ชฉํ" "ํ๋ณต" ์ด๋ ๊ฒ ํ ํฐํํ์ง ์๊ณ , " ์ฐ๋ฆฌ์ ๋ชฉํ๋ ํ๋ณตํ๊ธฐ ์ ๋๋ค. " ์ด ๋ฌธ์ฅ ์์ฒด๋ก ์ ์ฅ์ ํ๋ค. ๊ทธ๋์, ์ ํํ ์ผ์นํ๋ term์ฟผ๋ฆฌ์์ ์ฌ์ฉํ ์ ์๊ณ , keyword ํ์ ์ฌ์ฉ ์, ๋ ธ๋ฉ๋ผ์ด์ ๋ฅผ ํ์ฉํ๊ฒ ๋๋ค.
6. ์ธ๋ฑ์ค ์ค์ ์, dynamic: false ์ฌ์ฉ ์ํ๊ธฐ
Elasticsearch๋ ๋ฌธ์๋ฅผ ์์ธํ ๋, ์ธ๋ฑ์ค์ ์ ์๋์ง ์์ ํ๋๊ฐ ์์ผ๋ฉด ์๋์ผ๋ก ํ๋์ ํ์ ์ ์ถ๋ก ํด์ ํ๋๋ฅผ ์ถ๊ฐํ๋ค.
ํ์ง๋ง, Elasticsearch ๋ ํ๋์ ํ์ ์ ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค. ์๋ฃํ์ด ์ ์(์๋ฃํ์ ์๋ง๋) ํ์ ์ ์ฌ์ฉํ๋ฉด ๊ฒ์/์์ธ ์ ์ฑ๋ฅ์ด ์ข์์ง๋ค.(16๋นํธ๋ก ํํํ ์ ์๋ ๊ฐ์ด๋ฉด integer ๋ณด๋ค๋ short ๋ก ์ง์ ํ๋ ๊ฒ์ด ์ข๋ค๋ ์๋ฏธ)
๋ค๋ง, ์ ์ฅํ ๋๋ ์ค์ ๊ฐ์ ๋ง์ถฐ ์ต์ ํ ๋์ด ๋์คํฌ ์ฌ์ฉ๋์์์ ์ด๋์ ์๋ค๊ณ ํ๋ค.(์ถ์ฒ. ์๋ผ์คํฑ ๋ฐ์ด๋ธ)
์๋ฌดํผ, mappings ์ค์ ์ dynamic: false๋ฅผ ์ง์ ํ๋ฉด ํ์
์ด ์ ์๋์ง ์์ ํ๋๋ ํ์
์ ์ถ๋ก ํ์ง ์๊ณ ์์ธ๋์ง ์๊ฒ ํ ์ ์๋ค.
ํ์ง๋ง, dynamic: false ๋ ์๋ก์ด ํ๋๋ฅผ ์ถ๊ฐํ๋ ๊ฒ ๋ํ ๋ถ๊ฐ๋ฅํ๊ฒ ๋ง๋ ๋ค. ์ฆ, "๋์ค์ ํน์ ํ๋๋ฅผ ์ถ๊ฐํ๊ณ ์ถ์ด์" ๋ ์๊ตฌ์ฌํญ์ ๋์ํ๊ธฐ ์ด๋ ต๊ฒ ๋๋ค.
๋ฐ๋ผ์ ๋ถํ์ํ ํ๋ ์์ฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด dynamic: false๋ฅผ ์ฌ์ฉํ๋ ๋์ , ๋ฌธ์ ์ ์ฒ๋ฆฌ ๊ณผ์ ์์ ํ์์๋ ํ๋๋ฅผ ์ ์ ํด์ฃผ๋ ๊ฒ์ด ๋ ๋์ ๋ฐฉ์์ด๋ผ๊ณ ์๊ฐํ๋ค.
7. ๊ธฐํ
- ๋ ์ง ํ๋๋ format ์ต์ ์ ๋ช ์ํด์ ์ฒ๋ฆฌ
- ์ง๊ณ(aggregation)๋ฅผ ์ํด aggs ์ฌ์ฉ
- text ํ์ ์ ์ง๊ณ๊ฐ ๋ถ๊ฐ๋ฅํ๋ฏ๋ก, ์ง๊ณ๋ฅผ ์ํด multi-fields๋ก keyword ํ์ ์ ๋ณํ ์ฌ์ฉ
- ๊ฒ์ ๊ฒฐ๊ณผ ๊ฐ์กฐ๋ฅผ ์ํด highlight ์ฌ์ฉ
๋ง์น๋ฉฐ
์ด๋ฒ ์์
์ ํ๋ฉฐ ๋ถ์กฑํ๋ ์ ๋ ์์๋ค.
์๋ฅผ ๋ค์ด, ํด๋ฌ์คํฐ 1๊ฐ์ ๋
ธ๋ 3๊ฐ๋ฅผ ๊ตฌ์ฑํ์ ๋, ์ธ๋ฑ์ค๋ฅผ ๋ช ๊ฐ์ ์ค๋๋ก ๋ถ์ฐ์ํฌ์ง ๊ธฐ์ค์ ๋ช
ํํ ์ธ์ฐ์ง ๋ชปํ๋ค.
- number_of_shards : ํด๋น ์ธ๋ฑ์ค๋ฅผ ๋ช ๊ฐ์ ์ค๋๋ก ์ชผ๊ฐค๊ฑด์ง ์ค์ ๊ฐ์ด๋ค.
- ์ค๋ ์๊ฐ ๋๋ฌด ๋ง์ผ๋ฉด ๋ฌธ์ ์์ธ ์ฑ๋ฅ์ด ๊ฐ์ํ๊ณ , ์ค๋ ์๊ฐ ๋๋ฌด ์์ผ๋ฉด ํ ์ค๋์ ํฌ๊ธฐ๊ฐ ์ปค์ ์ฅ์ ๋ก ์ธํ ์ค๋ ๋ณต๊ตฌ ์ ์ค๋ ๊ฑธ๋ฆผ / ํด๋ฌ์คํฐ ์์ ์ฑ์ด ๋จ์ด์ง๋ค.
- numbers_of_replicas : ์ฃผ ์ค๋ ํ๋๋น ๋ณต์ ๋ณธ ์ค๋ ๋ช ๊ฐ ๋ง๋ค์ง๋ฅผ ์ค์ ํ๋ค.
์ด ๋ ์ค์ ์ ํด๋ฌ์คํฐ ์ด์ ์ ์ ๋ง ํ์ํ ์ค์ ์ด๊ธฐ ๋๋ฌธ์ ๊ผญ ์ถํ์ ํ์ตํ๊ณ ์ ํ๋ค.
์ด๋ฌํ ์ค์ต์ ์งํํ๋ฉด์ ๊ณต์๋ฌธ์๋ ์ฑ ์ ๋ชจ๋ฅด๋ ์ง์์ด ๋ง๋ค๋ณด๋ ์์ธํ ์๊ณ ์ถ์ ๋ง์์ ํ์ํ ๋ถ๋ถ ์ธ์๋ ์๊พธ ์ฝ๊ฒ ๋์๋ค. ๊ทธ๋ฌ๋, ์ดํดํ๋ฉฐ ์ฝ๋๋ผ๋ ๋จธ๋ฆฌ์์์ ๋น ๋ฅด๊ฒ ํ๋ฐ๋๋ ๊ฒ๋ํ ๊ฒฝํํ๋ค.
๊ทธ๋์ ์ ์ ๋๋ผ๋ ๊ฑด, ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ธ ๋์๋ ํ์ํ ๊ฒ์ ์์ฃผ๋ก ์ฝ์ง์ ํด์ผ ๋จธ๋ฆฌ์ ์ค๋ ๋จ๋๊ฒ์ ๋๊ผ๋ค. ์๋ก์ด ๊ธฐ์ ์ ๋ฐฐ์ธ ๋์๋ ํ์ํ ๋ถ๋ถ๋ถํฐ ์ฐจ๊ทผ์ฐจ๊ทผ ๋ฐฐ์ฐ๊ณ , ์ ๋์ ์ธ ์๊ฐ๋ ํ์ํ๋ค๋ ๊ฒ์ ์๊ฐํ๋ฉฐ ์กฐ๋ฐ์ฌ ๋ด์ง ์๋ ๊ฒ๋ ์ค์ํ ๊ฒ ๊ฐ๋ค.