๐งฉ ๋ฐฐ๊ฒฝ
์ค๋ ๋๋์ด ๋ฆฌํฉํ ๋ง ํ ์ ์๋ ํ์์๊ฐ์ด ์ฃผ์ด์ง ๋ !!
์ต๊ทผ ์ฝ๋ ๋ฆฌํฉํ ๋ง ๊ณผ์ ์์ ๋ฐ๋ณต๋๋ ๋ก์ง(์ฃผ์์ผ๋ก ๋ฏธ๋ฆฌ ํ์ํด๋จ์ง๋กฑ)์ ์ ๋ฆฌํ๊ณ ์ฌ์ฉํ๊ณ ์๋ ๋ฉํฐ์ค๋ ๋ฉ์ผ๋ก ๋ฌธ์ ์ ์ฌ๋ฅผ ๋ณ๋ ฌ ์ฒ๋ฆฌํ๋ ๊ตฌ์กฐ๋ฅผ ์ข ๋ค๋ฌ์ผ๋ ค๊ณ ํ๋ค
์ฐ์ ๋ด ์ฝ์ง ๊ธฐ๋ก ์ ์ ๋ด๊ฐ ํ๊ณ ์๋ ๊ณผ์ ์ ๋ํด ๊ฐ๋จํ ์ค๋ช
1. ๋ฌธ์(html)๋ฅผ ์ฒญํฌ(seq)๋ก ์ชผ๊ฐ์ ์ ์ฌํ๊ธฐ ๋๋ฌธ์, response๋ ๋ฌธ์ ๋จ์๋ก ์ฑ๊ณต/์คํจ/๋ฏธ๋ถ๋ฅ๋ ๋ฌธ์ ์ฒญํน ์์ด๋ ๋ฅผ ๋ชจ์์ฃผ์ด์ผ ํ๋ค.
1-1. ๋จ์ํ ์ค๋ ๋๊ฐ ๋ช ๊ฐ ์ฑ๊ณตํ๋์ง๊ฐ ์ค์ํ ๊ฒ ์๋๋ผ:
A๋ฌธ์๋ ์ด 3๊ฐ์ ์ฒญํฌ์ค 1๊ฐ ์ฑ๊ณต, 2๊ฐ ์คํจ
B๋ฌธ์๋ ์ด 15๊ฐ์ ์ฒญํฌ์ค 15๊ฐ ์ฑ๊ณต, 0๊ฐ ์คํจ
์ด๋ ๊ฒ ๋ฌธ์ ์ฒญํฌ ๋จ์๋ก ์ํ๋ฅผ ์ง๊ณํด์ผ ๋์ค์ ํต๊ณ/๋ก์ง๊ฐํ ๋ฑ์ ์ฐ์ผ ์ ์๋ค!
2. ์ฌ๊ธฐ์, ์ค๋ ๋๋ณ๋ก ์ฒ๋ฆฌ๋๋ ๋ฌธ์์ ๋ํ ์ฑ๊ณต/์คํจ/๋ฏธ๋ถ๋ฅ๋ ๋ฌธ์ ์ฒญํน ์์ด๋๋ฅผ ๋ฐ๋ก ๋ชจ์์ผ ํ๊ณ , ์ด๋ฅผ ๋ค์ ํ๋ฒ ํฉ์ณ์ API response ํฌ๋งท์ ๋ง์ถฐ ๋ฐํํด์ผ ํ๋ค.
3. ๋ด๊ฐ ์ํ๋ ํฌ๋งท์ ์ด๊ฑฐ:
{
"docLoadResult": {
"processResults": [
{
"docId": "DOC123",
"successList": ["DOC123_1"],
"failureList": ["DOC123_2"],
"unknownList": [],
"docListCnt": 2
},
{
"docId": "DOC456",
"successList": ["DOC456_1"],
"failureList": [],
"unknownList": ["DOC456_2", "DOC456_3"],
"docListCnt": 3
}
]
}
}
๐ญ ๊ณ ๋ฏผ์ ๋ด์ฉ
์ฒ์์๋ ๋จ์ ๋ฆฌ์คํธ ๋ฌถ์์ผ๋ก ๊ด๋ฆฌํ๋๋ฐ ์ ์ ์ฝ๋๊ฐ ์ง์ ๋ถํด์ ธ์ dataclass๋ฅผ ๋์ ํด ๊ตฌ์กฐํํ๊ธฐ๋ก ํ๋ค.
์๋ ๊ฒ:
from dataclasses import dataclass, field
@dataclass
class ResultDoc:
docSuccessList: list = field(default_factory=list)
docFailureList: list = field(default_factory=list)
docUnknownList: list = field(default_factory=list)
docListCnt: int = 0
1. ๊ฐ ์ค๋ ๋๋ ResultDoc ๊ฐ์ฒด๋ฅผ ์ฑ์ด๋ค
2. queue.put(resultDoc)๋ก ๊ฒฐ๊ณผ๋ฅผ push ํด์ค๋ค
3. ๋ชจ๋ ์ค๋ ๋๊ฐ ๋๋ ๋ค, queue.get()์ผ๋ก ํธ์ฌํด๋์ ๊ฒฐ๊ณผ๋ค์ ๋ชจ์ ์ต์ข response๋ฅผ ๋ง๋ค์ด ์ต์ข return!
๊ทธ๋ฌ๋
๋ฌธ์ ๋ ๊ฒฐ๊ณผ ์ง๊ณ๋ฅผ ๋ค๋ฃจ๋ ๊ณผ์ ์์ ๋ฐ์ํ๋ค:
- ์ค๋ ๋๋ณ๋ก ResultDoc ๊ฐ์ฒด๋ฅผ ๋ง๋ค์ด ํ์ ๋ฃ์๋๋ฐ successList์ ๊ฐ์ด ์ ๋ค์ด๊ฐ ๐ข(๋งน์์ฝ ๋ถ๋ช ๋๋ฒ๊น ํ์ ๋ ์ ๊ฐ๊ณ ์๋ ๊ฐ๋ค์ด์๋ค ใ ใ )
- count๊ฐ(๊ฐ๋ฌธ์๋ณ ๋ฌธ์ ์ฒญํฌ ๋ฐ์ดํฐ ์นด์ดํธ)์ ์ ์ฐํ๋๋ฐ ์ ๋ฆฌ์คํธ๋ ๋น์ด์๋ ๊ฑฐ์ง? ๋์ฒด ์ด๋์ ๋ฐ์ดํฐ๊ฐ ๋ ์๊ฐ ๊ฑด์ง,,
- ํนํ ๋๋ฒ๊น ๋ชจ๋์์ ๋ฆฌ์คํธ ์ ๊ฐ์ด ๋ณด์ด๋๋ฐ!!! ์ response๋ก ๋ง๋ค์ด ๋ด๋ณด๋ด๋ฉด ํ์ผ์์ด []๋ง ๋์ค๋ ๊ฒ์ด๋ ๋์ฒด ์..
์ด ๊ณผ์ ์์ ๋๋
'๋ฉํฐ ์ค๋ ๋ฉ์ด๋ผ ๊ฐ์ด ๊ผฌ์๋?'
'์ ์ญ๋ณ์ ๋ฌธ์ ์ธ๊ฐ?' (๊ดํ ์์ฌ)
๊ฐ์ ๋ถ์๊ฐ์ด ์ปค์ก๊ณ ์์ธ์ ํ์ฐธ ๋ชป ์ก์ผ๋ ๋๋ฌด๋๋ฌด ๋ต๋ตํ๋ค.
๐ ๏ธ ํด๊ฒฐ์ ์ํ ์๋๋ค
์ค๋ ํ๋ฃจ ์ข ์ผ ๊ตฌ๊ธ๊ณผ GPT๋ฅผ ์๊ตฌ๋ฆฌ์ ๋ผ๊ณ ์ด์๋ค.
1. deepcopy ์ ์ฉ
์ฐพ์๋ณด๋, mutable ๊ฐ์ฒด(list) ์ฐธ์กฐ ๋ฌธ์ ์ผ ์ ์๋ค๊ณ ํ๋๋ผ.
queue.put(copy.deepcopy(resultDoc)) ์ ํ๋ค
2. dataclass ๊ธฐ๋ณธ๊ฐ ํ์ธ
ํน์ ๋ชจ๋ฅด๋ dataclass ๊ธฐ๋ณธ๊ฐ์ field(default_factory=list) ๋ก ํด์ฃผ์๋์ง ๋ค์ ํ์ธํ๋ค(list = []๊ณผ ๊ฐ์ ์ฝ๋๋ฅผ ์ผ์๊น ๋ด)
3. ํ์ ๊ฐ์ ๋ฃ๊ธฐ ์ง์ /์งํ ๋๋ฒ๊น
ํ์ ๋ฃ๊ธฐ ์ง์ ๊ฐ → ํ์์ ๊บผ๋ธ ์งํ ๊ฐ → response์ append ์งํ ๊ฐ์ ๋๋ฌ๋๋ฌ ์ฝ์๋ค. ๊ทผ๋ฐ ๊ฐ์ ์ ๋ค๊ณ ๋์๋๋ฐ..
4. ์ฌ๋ฌ ๊ฐ์ค ์ธ์ฐ๊ธฐ: ๋ฉํฐ์ค๋ ๋ race condition, ์ ์ญ ๊ณต์ ๋ฌธ์ ?
๊ทผ๋ฐ ๋ฌธ์ ๋ ์ ํ ๋ค๋ฅธ ๊ณณ์ ์์๋ค.
๋ฐ๋ก ์คํ ๐ ๐ ๐ .
ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ ใ
์ฐ๊ณ ๋ ์ด์ด์๋ค.
๊ทธ ๋ฌธ์ ์ ์ฝ๋ ์ ํํ ๊ฐ์ ธ์ค๊ฒ ๋ค:
final_result.append({
"successList": list(r.docSuccessList),
"failureList": list(r.docFailureList),
"successList": list(r.docUnknownList), # <- ์๋ชป๋ ํค ์ค๋ณต
"docListCnt": r.docListCnt
})
๋ฐ๋ก๋ณด์ด๋์..?
์ ์ ๋ณด์ฌ์ ๋ฐ๋์ ์ ๋ ๋ ธ์ต๋๋ค,,ใ ใ ใ
dict ์์ฑ ์ฝ๋์ ๊ฐ์ key๋ฅผ ๋ ๋ฒ ์ผ๊ณ ๊ฒฐ๊ตญ successList์ unkownList ๊ฐ์ด ๋ด๊ธด ๊ฒ์ด๋ค.
๊ทธ๋ฌ๋ ์ํ๋ ๊ฐ์ด ๋ค์ด๊ฐ์ง ์์๋ ๊ฒ.
๋ฌธ์ ์ ๋ณธ์ง์ ๋ฉํฐ์ค๋ ๋๋, ํ๋, dataclass๋ ์๋์๋ค.
๊ฒฐ๊ตญ ์คํ ๋ฌธ์ ์๋ค.
๐ ๋ณํ
1. ๊ฐ์ฅ ํฐ ๋ณํ๋ ์ด๋ฒ ๊ฒฝํ์ผ๋ก ์ธํด “๊ฐ์ฅ ๋จ์ํ ์์ธ๋ถํฐ ํ์ธํ๋ผ”๋ ๊ตํ์ ์ป์ ๊ฒ์ด ๋๊ฒ ๋ค.
2. ์คํ ์์ ํด์ ์ํ๋ API ์๋ต ํํ๋ฅผ ๋ง๋ค์๋ค
๐ ํ๊ณ & ๋ค์ ๋ชฉํ
- ๋ณต์กํ ๋ฌธ์ ๋ฅผ ์์ฌํ๊ธฐ ์ ์ ๋จ์ํ ์ค์๋ฅผ ๋จผ์ ์ฒดํฌํ์
- ์ด๋ฒ ๊ฒฝ์ฐ๋ ๋ฉํฐ์ค๋ ๋ฉ, ํ ์์ฒด์ ๋ฌธ์ ์๋ ๋ฌด๊ดํ๋๋ฐ.. ๊ดํ ๊น์ ๊ณณ๋ง ํ๋ค๊ฐ ์๊ฐ์ ๋ ๋ฆฐ๊ฒ์ด๋.. ๊ทธ๋๋ ์ด๊ฒ ๋ํํ ๋์์ด ๋ ๊ฑฐ๋ผ ๋ฏฟ๋๋ค. ์ ๋ฐ ๋ ๋ ์์ผ๋ฉด ์ด๋ฐ ๋ ๋ ์๋ ๊ฑฐ์ง
- ๊ทธ๋ ๊ฒ ๋๋ฉด dataclass + queue + ๋ฉํฐ์ค๋ ๋ฉ ๊ตฌ์กฐ ์์ฒด๋ ๊ฝค ๊น๋ํ๊ฒ ๋ง์๋ค๋ ๊ฑฐ๊ฒ ์ง? ์์ผ๋ก ์ค๋ ๋ ์ฒ๋ฆฌํ ๋ ํฐ ๋์์ด ๋๊ฒ ๋ค..
- ๋ค์์๋ ์ด๋ฐ ๊ฒฝํ์ ๋ฐํ์ผ๋ก, ๋ก๊น /ํ ์คํธ ์ฝ๋๋ฅผ ๊ฐํํด “๋จ์ํ ์ค์”๊ฐ ์ด๋ ๊ฒ ํฐ ์ฝ์ง๋ก ์ด์ด์ง์ง ์๊ฒ ํ๊ณ ์ถ๋ค.
'๐ค๐ป ๋ ๋์ ๊ฐ๋ฐ์ ํ๊ธฐ > โ๏ธ๐ฆ ์ฝ์ง๊ธฐ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
| [๋์ ๊ณ ๋ฏผ] ์ฝ๋ ์ง๊ณ ๋๋ฉด ํญ์ ์ฐ์ฐํด์ (4) | 2025.08.03 |
|---|