kyle8581 commited on
Commit
2b267d0
ยท
1 Parent(s): cc288cd
answer_flow_generation/__pycache__/llm_functions.cpython-312.pyc ADDED
Binary file (6.39 kB). View file
 
answer_flow_generation/answer_flow_report_20250625_093159.html ADDED
The diff for this file is too large to render. See raw diff
 
answer_flow_generation/llm_functions.py ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from openai import OpenAI
2
+ from dotenv import load_dotenv
3
+ import yaml
4
+ import os
5
+ import json
6
+ import re
7
+
8
+ load_dotenv()
9
+
10
+ client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
11
+
12
+ # load prompt
13
+ try:
14
+ current_dir = os.path.dirname(os.path.abspath(__file__))
15
+ prompt_path = os.path.join(current_dir, 'prompt.yaml')
16
+ with open(prompt_path, "r", encoding='utf-8') as file:
17
+ prompt = yaml.safe_load(file)["prompt"]
18
+ except Exception as e:
19
+ print(f"Warning: prompt.yaml ๋กœ๋“œ ์‹คํŒจ. ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜: {e}")
20
+ prompt = """
21
+ You are an expert resume consultant. Based on the provided guide and user's experiences, create a logical and persuasive story flow for a cover letter answer.
22
+
23
+ ### Guide
24
+ {guide}
25
+
26
+ ### User's Experiences
27
+ {user_experiences}
28
+
29
+ Please generate a step-by-step answer flow in JSON format, like {"answer_flow": ["Step 1:...", "Step 2:...", "Step 3:...", "Step 4:..."]}.
30
+ """
31
+
32
+ def parse_markdown_table_from_response(text: str) -> str | None:
33
+ """
34
+ LLM ์‘๋‹ต์—์„œ markdown table์„ ์ถ”์ถœํ•ฉ๋‹ˆ๋‹ค.
35
+
36
+ Args:
37
+ text (str): LLM์ด ๋ฐ˜ํ™˜ํ•œ ์ „์ฒด ํ…์ŠคํŠธ ์‘๋‹ต.
38
+
39
+ Returns:
40
+ str | None: ์ถ”์ถœ๋œ markdown table ๋ฌธ์ž์—ด, ๋˜๋Š” ์‹คํŒจ ์‹œ None.
41
+ """
42
+ if not text:
43
+ return None
44
+
45
+ # ```markdown ... ``` ํ˜•์‹์˜ ์ฝ”๋“œ ๋ธ”๋ก์—์„œ table ์ถ”์ถœ
46
+ markdown_match = re.search(r"```markdown\s*([\s\S]*?)\s*```", text)
47
+ if markdown_match:
48
+ table_content = markdown_match.group(1).strip()
49
+ return table_content
50
+
51
+ # ์ฝ”๋“œ ๋ธ”๋ก์ด ์—†๋‹ค๋ฉด, ์ „์ฒด ํ…์ŠคํŠธ์—์„œ table ์ฐพ๊ธฐ
52
+ lines = text.strip().split('\n')
53
+ table_lines = []
54
+
55
+ for line in lines:
56
+ line = line.strip()
57
+ if line.startswith('|') and line.endswith('|'):
58
+ table_lines.append(line)
59
+
60
+ if len(table_lines) >= 3: # header, separator, at least one row
61
+ return '\n'.join(table_lines)
62
+
63
+ return None
64
+
65
+ def parse_json_from_response(text: str) -> dict | None:
66
+ """
67
+ Markdown ์ฝ”๋“œ ๋ธ”๋ก ์•ˆ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” JSON ๋ฌธ์ž์—ด์„ ์ถ”์ถœํ•˜๊ณ  ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
68
+ (์ด์ „ ๋ฒ„์ „๊ณผ์˜ ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ์œ ์ง€)
69
+
70
+ Args:
71
+ text (str): LLM์ด ๋ฐ˜ํ™˜ํ•œ ์ „์ฒด ํ…์ŠคํŠธ ์‘๋‹ต.
72
+
73
+ Returns:
74
+ dict | None: ํŒŒ์‹ฑ๋œ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ์ฒด, ๋˜๋Š” ์‹คํŒจ ์‹œ None.
75
+ """
76
+ if not text:
77
+ return None
78
+
79
+ # ```json ... ``` ๋˜๋Š” ``` ... ``` ํ˜•์‹์˜ ์ฝ”๋“œ ๋ธ”๋ก์—์„œ JSON ์ถ”์ถœ
80
+ match = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", text)
81
+ if match:
82
+ json_str = match.group(1)
83
+ else:
84
+ # ์ฝ”๋“œ ๋ธ”๋ก์ด ์—†๋‹ค๋ฉด, ์ „์ฒด ํ…์ŠคํŠธ๋ฅผ JSON์œผ๋กœ ๊ฐ€์ •
85
+ json_str = text
86
+
87
+ try:
88
+ return json.loads(json_str)
89
+ except json.JSONDecodeError:
90
+ # ์ „์ฒด ํŒŒ์‹ฑ์ด ์‹คํŒจํ•˜๋ฉด, ์ฒซ '{'์™€ ๋งˆ์ง€๋ง‰ '}'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ์‹œ๋„
91
+ start_index = json_str.find('{')
92
+ end_index = json_str.rfind('}')
93
+ if start_index != -1 and end_index != -1 and start_index < end_index:
94
+ potential_json = json_str[start_index:end_index+1]
95
+ try:
96
+ return json.loads(potential_json)
97
+ except json.JSONDecodeError:
98
+ pass # ์ด๋งˆ์ €๋„ ์‹คํŒจํ•˜๋ฉด ๊ทธ๋ƒฅ None ๋ฐ˜ํ™˜
99
+
100
+ return None
101
+
102
+ def generate_answer_flow(question, jd, company_name, experience_level, conversation):
103
+ """
104
+ ๋‹ต๋ณ€ ํ๋ฆ„(๊ฐœ์š”)์„ ์ƒ์„ฑํ•˜๊ณ , ํŒŒ์‹ฑ๋œ ๊ฒฐ๊ณผ์™€ ์ „์ฒด ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
105
+ """
106
+ try:
107
+ response = client.chat.completions.create(
108
+ model="gpt-4o-mini",
109
+ messages=[{"role": "user", "content": prompt.format(
110
+ question=question,
111
+ jd=jd,
112
+ company_name=company_name,
113
+ experience_level=experience_level,
114
+ conversation=conversation
115
+ )}],
116
+ # JSON ํ˜•ํƒœ๊ฐ€ ์•„๋‹ˆ๋ผ markdown table ํ˜•ํƒœ๋กœ ์‘๋‹ต ๋ฐ›๊ธฐ
117
+ )
118
+
119
+ # Markdown table ์‘๋‹ต ํŒŒ์‹ฑ
120
+ markdown_table = parse_markdown_table_from_response(response.choices[0].message.content)
121
+
122
+ if markdown_table:
123
+ parsed_content = {"flow": markdown_table}
124
+ else:
125
+ parsed_content = {"error": "Failed to parse markdown table"}
126
+
127
+ return parsed_content, response
128
+
129
+ except Exception as e:
130
+ print(f"๋‹ต๋ณ€ ํ๋ฆ„ ์ƒ์„ฑ ๋˜๋Š” ํŒŒ์‹ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
131
+ return {"error": f"Failed to generate or parse flow: {str(e)}"}, None
132
+
133
+ if __name__ == "__main__":
134
+ example_input = {
135
+ "question": "์‚ผ์„ฑ์ „์ž๋ฅผ ์ง€์›ํ•œ ์ด์œ ์™€ ์ž…์‚ฌ ํ›„ ์ด๋ฃจ๊ณ  ์‹ถ์€ ๊ฟˆ์„ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.",
136
+ "jd": "์‚ผ์„ฑ์ „์ž๋Š” ์„ธ๊ณ„์ ์ธ ๊ธฐ์ˆ  ๊ธฐ์—…์œผ๋กœ, ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ์„ ๋„์ ์ธ ๊ธฐ์ˆ ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์ž…์‚ฌํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๋ฉฐ, ์ตœ์‹  ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
137
+ "company_name": "์‚ผ์„ฑ์ „์ž",
138
+ "experience_level": "์‹ ์ž…",
139
+ "conversation": "User: ์•ˆ๋…•ํ•˜์„ธ์š”, ์‚ผ์„ฑ์ „์ž ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ ์ง๋ฌด์— ์ง€์›ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.\nAI: ๋„ค, ์–ด๋–ค ์ ์ด ๊ถ๊ธˆํ•˜์‹ ๊ฐ€์š”?\nUser: ์ž๊ธฐ์†Œ๊ฐœ์„œ์— ์–ด๋–ค ๊ฒฝํ—˜์„ ๊ฐ•์กฐํ•˜๋ฉด ์ข‹์„๊นŒ์š”?\nAI: ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์—์„œ ์‚ฌ์šฉํ•œ ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ์„ฑ๊ณผ๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค."
140
+ }
141
+
142
+ flow_json, _ = generate_answer_flow(**example_input)
143
+ print(json.dumps(flow_json, indent=2, ensure_ascii=False))
answer_flow_generation/prompt.yaml ADDED
@@ -0,0 +1,224 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ prompt: >
2
+ ์ง„ํ–‰๋œ ๋Œ€ํ™”๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž์†Œ์„œ ๋‹ต๋ณ€ ํ๋ฆ„์„ ์ƒ์„ฑํ•˜์‹œ์˜ค.
3
+
4
+ ### ์ถœ๋ ฅ ํ˜•์‹
5
+ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ markdown ํ˜•์‹์œผ๋กœ๋งŒ ์‘๋‹ตํ•˜์„ธ์š”:
6
+
7
+ ```markdown
8
+ <๋‹ต๋ณ€ ํ๋ฆ„ table>
9
+ ```
10
+
11
+ ## ์˜ˆ์‹œ
12
+
13
+ ### ์˜ˆ์‹œ 1 - ๋Œ€์ธ๊ด€๊ณ„ ๋ฐ ํ˜‘์—… ์—ญ๋Ÿ‰
14
+ ์งˆ๋ฌธ: ํŒ€์˜ ์ผ์›์œผ๋กœ์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ํ˜‘๋ ฅํ•˜์—ฌ ์„ฑ๊ณผ๋ฅผ ๋‚ธ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ๊ธฐ์ˆ ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.
15
+
16
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
17
+ ```markdown
18
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
19
+ | --- | --- | --- | --- |
20
+ | โ‘  ์š”์•ฝ | ํ•œ ๋ฌธ์žฅ ํ•ต์‹ฌ ์š”์•ฝ | ํ˜‘์—… ์ƒํ™ฉ์—์„œ ์ƒ๊ธด ๋ฌธ์ œ๋‚˜ ๊ฐˆ๋“ฑ์„ ํ•ด๊ฒฐํ•ด ๊ณต๋™ ์„ฑ๊ณผ๋ฅผ ์ด๋ˆ ๊ฒฝํ—˜์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝํ•œ๋‹ค | - ๊ฐˆ๋“ฑ or ์†Œํ†ต ๋ฌธ์ œ + ํ˜‘์—… ์„ฑ๊ณต ์š”์†Œ ํฌํ•จ |
21
+ | โ‘ก ์ƒํ™ฉ | ํ˜‘์—… ๋ฐฐ๊ฒฝ๊ณผ ๋‚˜์˜ ์—ญํ•  | ์–ด๋–ค ๋งฅ๋ฝ์˜ ํ˜‘์—… ์ƒํ™ฉ์ด์—ˆ๊ณ , ๋‚ด๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ๋งก์•˜๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…<br>(์–ธ์ œ, ์–ด๋””์„œ, ์–ด๋–ค ํ™œ๋™, ์–ด๋–ค ์—ญํ• ) | - ๊ธฐ๊ฐ„/์žฅ์†Œ/ํ™œ๋™๋ช…<br>- ๋‚ด๊ฐ€ ์ฃผ๋„ํ–ˆ๋Š”์ง€, ์ผ์›์œผ๋กœ ์ฐธ์—ฌํ–ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ |
22
+ | โ‘ข ๋ฌธ์ œ ์ธ์‹ | ํŒ€ ๋‚ด ๊ฐˆ๋“ฑ์ด๋‚˜ ์†Œํ†ต ๋ฌธ์ œ์˜ ๋ณธ์งˆ ์ธ์‹ | ํŒ€์›Œํฌ๋ฅผ ์ €ํ•ดํ•œ ๋ช…ํ™•ํ•œ ๊ฐˆ๋“ฑ or ์†Œํ†ต ๋ฌธ์ œ๋ฅผ ์ธ์‹ํ•˜๊ณ , ๊ทธ๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ธ์ง€ ์„œ์ˆ  | - ๋‹จ์ˆœ ์˜๊ฒฌ ์ฐจ์ด X โ†’ ๊ตฌ์„ฑ์› ๊ฐ„ ์ถฉ๋Œ, ํ”ผ๋กœ๊ฐ, ์ „๋‹ฌ ์˜ค๋ฅ˜ ๋“ฑ ์‹ค์ œ ์žฅ์•  ํฌํ•จ<br>- "๋ฌด์—‡์ด ์™œ ๋ฌธ์ œ์˜€๋Š”๊ฐ€"๊ฐ€ ์„ ๋ช…ํ•ด์•ผ ํ•จ |
23
+ | โ‘ฃ ํ•ด๊ฒฐ ํ–‰๋™ | ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋ณธ์ธ์˜ ์†Œํ†ต/์กฐ์œจ ๋…ธ๋ ฅ | ์†Œํ†ต ๋ฐฉ์‹, ์„ค๋“ ๊ณผ์ •, ์•„์ด๋””์–ด ์ œ์•ˆ ๋“ฑ ๋ณธ์ธ์˜ ๊ตฌ์ฒด์ ์ธ ํ˜‘์—… ํ–‰๋™์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๋ช… | - ๋‹จ์ˆœํ•œ ์ฐธ์—ฌ์ž X โ†’ ์˜๊ฒฌ ์กฐ์œจ์ž, ๋ถ„์œ„๊ธฐ ๋ฐ˜์ „์ž, ์•„์ด๋””์–ด ์ œ์•ˆ์ž ๋“ฑ์˜ ์—ญํ•  ๋ถ€๊ฐ<br>- ๊ฐ์ • ๊ด€๋ฆฌ, ์ค‘์žฌ, ๋ถ„์œ„๊ธฐ ์กฐ์„ฑ ๋…ธ๋ ฅ ํฌํ•จ |
24
+ | โ‘ค ๊ฒฐ๊ณผ | ํ˜‘์—… ์„ฑ๊ณผ ๋ฐ ๊ด€๊ณ„ ๋ณ€ํ™” | ๋ฌธ์ œ ํ•ด๊ฒฐ ํ›„ ํŒ€ ์„ฑ๊ณผ ๋˜๋Š” ๊ด€๊ณ„์˜ ๊ธ์ •์  ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธด ๋ชจ์Šต์„ ์ •๋Ÿ‰/์ •์„ฑ์ ์œผ๋กœ ํ‘œํ˜„ | - ๊ฒฐ๊ณผ = ๋ชฉํ‘œ ๋‹ฌ์„ฑ + ํŒ€ ๋ถ„์œ„๊ธฐ or ์œ ๋Œ€๊ฐ ํšŒ๋ณต ๋“ฑ<br>- "์„ฑ๊ณผ ์ˆ˜์น˜ + ๋ถ„์œ„๊ธฐ ๋ฐ˜์ „"์ด๋ฉด ๋ฒ ์ŠคํŠธ |
25
+ | โ‘ฅ ๋А๋‚€ ์  | ํŒ€์›Œํฌ์— ๋Œ€ํ•œ ์ธ์‹ ๋ณ€ํ™” | ํ˜‘์—…์˜ ๋ณธ์งˆ, ์†Œํ†ต ๋ฐฉ์‹, ์‚ฌ๋žŒ์„ ๋Œ€ํ•˜๋Š” ํƒœ๋„ ๋“ฑ์—์„œ ๋ฐฐ์šด ์ ์„ ์ง„์†”ํ•˜๊ฒŒ ์ž‘์„ฑ | - ๋‚ด๊ฐ€ ์‚ฌ๋žŒ๊ณผ ์ผํ•˜๋Š” ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋Š”๊ฐ€? |
26
+ | โ‘ฆ ์ง๋ฌด ์—ฐ๊ณ„ | ์กฐ์ง์ƒํ™œ์—์„œ์˜ ํŒ€์›Œํฌ ์‹ค์ฒœ ํฌ๋ถ€ | ํ˜‘์—…์ด ์ค‘์š”ํ•œ ์กฐ์ง์—์„œ ๋ณธ์ธ์˜ ์†Œํ†ต ๋ฐฉ์‹์ด ์–ด๋–ค ๊ธฐ์—ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฐ๊ฒฐ | - ํ˜‘์—… ์—ญ๋Ÿ‰์ด ํ•„์š”ํ•œ ์ง๋ฌด ํŠน์„ฑ๊ณผ ์—ฐ๊ฒฐ<br>- "๋‚ด๊ฐ€ ์ด๋Ÿฐ ์ƒํ™ฉ์—์„œ ์–ด๋–ค ํŒ€์›์ด ๋  ๊ฒƒ์ด๋‹ค"๋กœ ๊ตฌ์ฒดํ™” |
27
+ ```
28
+
29
+ ### ์˜ˆ์‹œ 2 - ๋ชฉํ‘œ ๋‹ฌ์„ฑ ๋ฐ ๋„์ „ ๊ฒฝํ—˜
30
+ ์งˆ๋ฌธ: ์Šค์Šค๋กœ ๋†’์€ ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ๊ณ  ๋ˆ์งˆ๊ธฐ๊ฒŒ ๋…ธ๋ ฅํ•˜์—ฌ ์„ฑ์ทจํ•œ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์„œ์ˆ ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.
31
+
32
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
33
+ ```markdown
34
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
35
+ | --- | --- | --- | --- |
36
+ | โ‘  ์š”์•ฝ | ํ•œ ๋ฌธ์žฅ ํ•ต์‹ฌ ์š”์•ฝ | ์–ด๋–ค ๋ชฉํ‘œ/๋„์ „์„ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•ด ์„ฑ๊ณผ๋ฅผ ๋ƒˆ๋Š”์ง€ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค | - ์‹œ๊ธฐ/์žฅ์†Œ/ํ–‰๋™/์„ฑ๊ณผ ํฌํ•จ |
37
+ | โ‘ก ์ƒํ™ฉ | ๋ชฉํ‘œ ๋˜๋Š” ์‹คํŒจ ์ƒํ™ฉ์˜ ๋ฐฐ๊ฒฝ | ์–ด๋–ค ๋ชฉํ‘œ๋ฅผ ์ถ”๊ตฌํ–ˆ๋Š”์ง€, ๋˜๋Š” ์–ด๋–ค ์‹คํŒจ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๊ตฌ์ฒด์  ๋งฅ๋ฝ์„ ์„ค๋ช…ํ•œ๋‹ค | - ์‹œ๊ธฐ/์žฅ์†Œ/์—ญํ• <br>- ์ผ๋ฐ˜์ ์ธ ์–ด๋ ค์›€์ด ์•„๋‹Œ, ๋ช…ํ™•ํ•œ ๋‚œ๊ด€์ด ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ |
38
+ | โ‘ข ๋„์ „ ์ •์˜ | ๋‚ด๊ฐ€ ๋งž๋‹ฅ๋œจ๋ฆฐ ๋„์ „/๊ณผ์ œ | ์–ด๋–ค ์ ์ด ์–ด๋ ค์› ๊ณ , ๋ฌด์—‡์„ ๊ทน๋ณตํ•ด์•ผ ํ–ˆ๋Š”์ง€ ํ•ต์‹ฌ ๋ฌธ์ œ๋ฅผ ์„ ๋ช…ํ•˜๊ฒŒ ๊ธฐ์ˆ  | - ๋ฌธ์ œ์˜ ๋ณธ์งˆ์„ ์Šค์Šค๋กœ ์ธ์‹ํ–ˆ๋Š”์ง€ ๋ณด์—ฌ์ค„ ๊ฒƒ<br>- ๋‹จ์ˆœํ•œ ์ƒํ™ฉ ๋ฌ˜์‚ฌ์—์„œ ๋๋‚˜์ง€ ์•Š๊ธฐ |
39
+ | โ‘ฃ ํ–‰๋™ | ๋ชฉํ‘œ ๋‹ฌ์„ฑ ๋˜๋Š” ์‹คํŒจ ๊ทน๋ณต์„ ์œ„ํ•œ ๋‚˜์˜ ํ–‰๋™ | ๊ตฌ์ฒด์ ์ธ ์‹คํ–‰ ๋‚ด์šฉ์„ ๋ฌ˜์‚ฌํ•˜๊ณ , ํŠนํžˆ ์–ด๋–ค ์ „๋žต์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์„ค๋ช… | - ๋‹จ์ˆœ ๋…ธ๋ ฅ๋ณด๋‹ค ๊ณ„ํš์„ฑ, ์ž๋ฐœ์„ฑ, ์ง€์†์„ฑ ๊ฐ•์กฐ<br>- ํŒ€๊ณผ ํ˜‘์—… ์‹œ, ๋ณธ์ธ์˜ ์ฃผ๋„์  ์—ญํ• ๋„ ๋“œ๋Ÿฌ๋‚ผ ๊ฒƒ |
40
+ | โ‘ค ๊ฒฐ๊ณผ | ๊ฒฐ๊ณผ ๋ฐ ๋ณ€ํ™” | ๋ชฉํ‘œ ๋‹ฌ์„ฑ ์—ฌ๋ถ€, ์‹คํŒจ ๊ทน๋ณต ๊ฒฐ๊ณผ๋ฅผ ์ •๋Ÿ‰/์ •์„ฑ ์ง€ํ‘œ๋กœ ๋ณด์—ฌ์คŒ | - ์ˆซ์ž, ๋น„๊ต ์ˆ˜์น˜, ๋ช…ํ™•ํ•œ ๋ณ€ํ™” ์„œ์ˆ <br>- ๋‹จ์ˆœ ์„ฑ๊ณต๋ณด๋‹ค ์–ด๋–ค ์˜๋ฏธ ์žˆ๋Š” ๋ณ€ํ™”๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”์ง€ ํฌํ•จ |
41
+ | โ‘ฅ ๋А๋‚€ ์  | ์‹คํŒจ์—์„œ์˜ ๊ตํ›ˆ, ์„ฑ๊ณต ์ดํ›„ ๋ณ€ํ™” | ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ƒ๊ฐ๊ณผ ํ–‰๋™์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์„ค๋ช… | - ๋‹จ์ˆœ "์—ด์‹ฌํžˆ ํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฑธ ์•Œ์•˜๋‹ค" X<br>- ๊ฐ€์น˜๊ด€/์ผํ•˜๋Š” ๋ฐฉ์‹/ํƒœ๋„์˜ ๋ณ€ํ™” ์ค‘์‹ฌ |
42
+ | โ‘ฆ ์ง๋ฌด ์—ฐ๊ณ„ | ์ด ๊ฒฝํ—˜์ด ์ง€์›์ง๋ฌด์— ์–ด๋–ค ๊ธฐ์—ฌ๊ฐ€ ๋˜๋Š”๊ฐ€ | ๊นจ๋‹ฌ์Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐ์ง/์ง๋ฌด์— ์–ด๋–ค ๊ธฐ์—ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์—ฐ๊ฒฐ | - ์ง๋ฌด์— ๋งž๋Š” ์—ญ๋Ÿ‰ ํ‚ค์›Œ๋“œ๋กœ ์—ฐ๊ฒฐ<br>- "์•ž์œผ๋กœ ์ด๋Ÿฐ ์ƒํ™ฉ์ด ์™€๋„ ์ด๋ ‡๊ฒŒ ๋Œ€์‘ํ•˜๊ฒ ๋‹ค" ์‹์˜ ํฌ๋ถ€ ๊ฐ•์กฐ |
43
+ ```
44
+
45
+ ### ์˜ˆ์‹œ 3 - ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ์ฐฝ์˜์„ฑ
46
+ ์งˆ๋ฌธ: ๊ธฐ์กด ๋ฐฉ์‹์˜ ๋น„ํšจ์œจ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์ ์šฉํ–ˆ๋˜ ๊ฒฝํ—˜์„ ์“ฐ์‹œ์˜ค.
47
+
48
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
49
+ ```markdown
50
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
51
+ | --- | --- | --- | --- |
52
+ | โ‘  ์š”์•ฝ | ํ•œ ๋ฌธ์žฅ ์š”์•ฝ | ์•„๋ž˜ ๋‚ด์šฉ์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์••์ถ• ์š”์•ฝ | "๋ฌธ์ œ๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ ์„ฑ๊ณผ๋ฅผ ๋‚ธ ๊ฒฝํ—˜"์ด ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ |
53
+ | โ‘ก ์ƒํ™ฉ | ๋ฐฐ๊ฒฝ ์„ค๋ช… | ์–ธ์ œ, ์–ด๋””์„œ, ์–ด๋–ค ๋งฅ๋ฝ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์ธ์ง€ ์„ค๋ช… | ์กฐ์ง/ํŒ€/์—…๋ฌด ๋งฅ๋ฝ๊ณผ ๋‚ด ์—ญํ• ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„œ์ˆ  |
54
+ | โ‘ข ๋ฌธ์ œ ์ •์˜ | ๋ฌธ์ œ ๋ฐ ์›์ธ ๋ถ„์„ | ๋‹จ์ˆœํ•œ ํ˜„์ƒ ๋‚˜์—ด์ด ์•„๋‹Œ, ์›์ธ์„ ๋ถ„์„ํ•˜์—ฌ ๋ณธ์งˆ์ ์ธ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•จ | '์™œ ๋ฐœ์ƒํ–ˆ๋Š”๊ฐ€'๋ฅผ ๊ณ ๋ฏผํ•œ ํ”์ ์ด ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ (ex. ํ”„๋กœ์„ธ์Šค/๊ตฌ์กฐ์  ๋ฌธ์ œ ๋“ฑ) |
55
+ | โ‘ฃ ํ•ด๊ฒฐ ํ–‰๋™ | ์ฐฝ์˜์  ํ•ด๊ฒฐ๋ฐฉ์•ˆ ๋ฐ ์‹คํ–‰ | ๋‚ด๊ฐ€ ์ง์ ‘ ์ œ์•ˆํ•˜๊ณ  ์‹คํ–‰ํ•œ ์ƒˆ๋กœ์šด ๋ฐฉ์‹ ๋˜๋Š” ๊ธฐ์กด ๋ฐฉ์‹์˜ ๊ฐœ์„ ์•ˆ | ๋‹จ์ˆœ ์‹คํ–‰์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์กด ํ‹€์„ '์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ' ํ–ˆ๋Š”์ง€๊ฐ€ ํ•ต์‹ฌ |
56
+ | โ‘ค ๊ฒฐ๊ณผ | ๊ฐœ์„  ์„ฑ๊ณผ | ํ–‰๋™ ์ดํ›„ ๊ฐœ์„ ๋œ ์ˆ˜์น˜์ /์ •์„ฑ์  ๊ฒฐ๊ณผ ์ œ์‹œ + ํƒ€์ธ์˜ ๋ฐ˜์‘ | "ํšจ์œจ ํ–ฅ์ƒ", "์„ฑ๊ณผ ์ฆ๊ฐ€", "ํ”ผ๋“œ๋ฐฑ", "์žฌ์‚ฌ์šฉ๋œ ๋ฐฉ์‹" ๋“ฑ ์ •๋Ÿ‰ยท์ •์„ฑ ๊ท ํ˜• |
57
+ | โ‘ฅ ๋А๋‚€ ์  | ํ†ต์ฐฐ ๋ฐ ์„ฑ์žฅ | ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ฌธ์ œ ํ•ด๊ฒฐ๋ ฅ ๋˜๋Š” ์ฐฝ์˜์  ํƒœ๋„์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ๋ฐฐ์› ๋Š”๊ฐ€ | "๋ฌธ์ œ ์ ‘๊ทผ ํƒœ๋„"๋‚˜ "์‚ฌ๊ณ ๋ฐฉ์‹์˜ ๋ณ€ํ™”"๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ |
58
+ | โ‘ฆ ์ง๋ฌด ์—ฐ๊ณ„ | ์ง๋ฌด ๊ธฐ์—ฌ ๊ฐ€๋Šฅ์„ฑ | ๋‚ด๊ฐ€ ์ง€์›ํ•œ ์ง๋ฌด์—์„œ ๋น„์Šทํ•œ ๋ฌธ์ œ์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์–ธ๊ธ‰ | "์ง€์› ๋ถ„์•ผ์—์„œ ๋‚˜์˜ ์ฐฝ์˜์„ฑ/๋ฌธ์ œ ํ•ด๊ฒฐ๋ ฅ์€ ์ด๋ ‡๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค"๋กœ ๋งˆ๋ฌด๋ฆฌ |
59
+ ```
60
+
61
+ ### ์˜ˆ์‹œ 4 - ์ง๋ฌด ๊ด€๋ จ ๊ฒฝํ—˜ ๋ฐ ํ™œ์šฉ/๊ธฐ์—ฌ
62
+ ์งˆ๋ฌธ: ์ง€์›ํ•œ ์ง๋ฌด์™€ ๊ด€๋ จ๋œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์„ ๋ณธ์ธ์˜ ์—ญํ• ๊ณผ ๊ธฐ์—ฌ ์œ„์ฃผ๋กœ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
63
+
64
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
65
+ ```markdown
66
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
67
+ | --- | --- | --- | --- |
68
+ | โ‘  ์š”์•ฝ | ํ•œ ๋ฌธ์žฅ ์š”์•ฝ | ์ง๋ฌด ๊ด€๋ จ ๊ฒฝํ—˜ ์ „์ฒด๋ฅผ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝ | ์ง๋ฌด๋ช…, ์ง๋ฌด์—ญํ• , ์„ฑ๊ณผ๊ฐ€ ํ•œ ๋ฌธ์žฅ์— ํฌํ•จ๋˜๋ฉด ์ข‹์Œ |
69
+ | โ‘ก ์ƒํ™ฉ | ํ™œ๋™ ๋ฐฐ๊ฒฝ | ์–ธ์ œ, ์–ด๋–ค ํ”„๋กœ์ ํŠธ/์—…๋ฌด์—์„œ ์–ด๋–ค ์—ญํ• ์„ ๋งก์•˜๋Š”์ง€ ์„ค๋ช… | ์ง๋ฌด ๊ด€๋ จ ๋งฅ๋ฝ์„ ๋ช…ํ™•ํžˆ! (ex. ์ธํ„ด, ์‚ฐํ•™, ๊ต๋‚ดํ”„๋กœ์ ํŠธ ๋“ฑ) |
70
+ | โ‘ข ๊ณผ์ œ ์ •์˜ | ๋ฌธ์ œ ์ธ์‹ ๋ฐ ๋ถ„์„ | ํ”„๋กœ์ ํŠธ ์ค‘ ์–ด๋–ค ํ•ต์‹ฌ ๊ณผ์ œ/๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๊ณ , ๋‚ด๊ฐ€ ๊ทธ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ–ˆ๋Š”์ง€ | ๊ณผ์ œ๊ฐ€ '๋‚ด๊ฐ€ ํ’€์–ด์•ผ ํ•  ์ง๋ฌด์ƒ ๋ฌธ์ œ'๋กœ ์ •์˜๋˜์—ˆ๋Š”์ง€ ํ™•์ธ |
71
+ | โ‘ฃ ํ•ด๊ฒฐ ํ–‰๋™ | ๊ธฐ์ˆ /์ง€์‹ ์ ์šฉ ๋ฐ ์‹คํ–‰ | ์ง๋ฌด ์—ญ๋Ÿ‰(์ง€์‹ยท๊ธฐ์ˆ )์„ ๋ฐ”ํƒ•์œผ๋กœ ์‹ค์ œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ–ˆ๋Š”์ง€ ์„œ์ˆ  | ๋‹จ์ˆœ ์ˆ˜ํ–‰์ด ์•„๋‹ˆ๋ผ '์ง๋ฌด ์—ญ๋Ÿ‰์„ ํ™œ์šฉํ•œ ๊ธฐ์—ฌ' ๊ฐ•์กฐ |
72
+ | โ‘ค ๊ฒฐ๊ณผ | ์„ฑ๊ณผ ๋ฐ ํ‰๊ฐ€ | ๊ฒฐ๊ณผ์ ์œผ๋กœ ์–ด๋–ค ๋ณ€ํ™”๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ์ˆ˜์น˜/ํ”ผ๋“œ๋ฐฑ ๋“ฑ์œผ๋กœ ์ •๋ฆฌ | ๊ตฌ์ฒด์  ์ง€ํ‘œ + ํƒ€์ธ์˜ ์ธ์ • (๋ฆฌ๋”, ๊ณ ๊ฐ, ์‚ฌ์šฉ์ž ๋“ฑ) |
73
+ | โ‘ฅ ๋А๋‚€ ์  | ์„ฑ์žฅ ๋ฐ ํ†ต์ฐฐ | ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ง๋ฌด์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ๋ฐฐ์šฐ๊ณ  ์„ฑ์žฅํ–ˆ๋Š”๊ฐ€ | ์ง๋ฌด ์ดํ•ด๋„/ํƒœ๋„/๊ธฐ์ˆ ์  ํ†ต์ฐฐ ๋“ฑ ์„ฑ์žฅ ํฌ์ธํŠธ๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ |
74
+ | โ‘ฆ ์ง๋ฌด ์—ฐ๊ณ„ | ํ–ฅํ›„ ๊ธฐ์—ฌ ๋ฐ ํฌ๋ถ€ | ๋ณธ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ๋‚ด๊ฐ€ ํ•ด๋‹น ์ง๋ฌด์— ์–ด๋–ค ๊ธฐ์—ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ | "๋‚˜๋Š” ์ด ์ง๋ฌด์—์„œ ์ด๋ ‡๊ฒŒ ์ผํ•  ๊ฒƒ์ด๋‹ค"๋กœ ๋งˆ๋ฌด๋ฆฌ |
75
+ ```
76
+
77
+ ### ์˜ˆ์‹œ 5 - ์ง€์› ๋™๊ธฐ
78
+ ์งˆ๋ฌธ: ํ˜„๋Œ€์ž๋™์ฐจ์— ์ง€์›ํ•˜๊ฒŒ ๋œ ๋™๊ธฐ์™€ ํ•ด๋‹น ์ง๋ฌด์— ๋ณธ์ธ์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
79
+
80
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
81
+ ```markdown
82
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
83
+ | --- | --- | --- | --- |
84
+ | โ‘  ์ง๋ฌด ๊ด€์‹ฌ ๊ณ„๊ธฐ | ํ•ด๋‹น ์ง๋ฌด์— ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ๋œ ์ฒซ ๊ณ„๊ธฐ | ์ˆ˜์—…, ํ™œ๋™, ์‚ฌ๋žŒ, ์‚ฌ๊ฑด ๋“ฑ ํ†ตํ•ด ์ง๋ฌด์— ํฅ๋ฏธ๋ฅผ ๋А๋ผ๊ฒŒ ๋œ ๊ตฌ์ฒด์  ์ถœ๋ฐœ์  ์ œ์‹œ | ๋‹จ์ˆœํ•œ ํฅ๋ฏธ X / ๊ตฌ์ฒด์ ์ธ ํ™œ๋™์ด๋‚˜ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์„œ์ˆ  |
85
+ | โ‘ก ํšŒ์‚ฌ ์„ ํƒ ์ด์œ  | ์—ฌ๋Ÿฌ ํšŒ์‚ฌ ์ค‘ ์ด ํšŒ์‚ฌ๋ฅผ ์„ ํƒํ•œ ์ด์œ  | ๊ธฐ์—…์˜ ์ œํ’ˆ, ์„œ๋น„์Šค, ์‚ฐ์—…, ์กฐ์ง๋ฌธํ™”, ๊ฒฝ์˜์ฒ ํ•™ ๋“ฑ๊ณผ ๋ณธ์ธ์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ์„ค๋ช… | "์ง๋ฌด๋งŒ"์ด ์•„๋‹ˆ๋ผ "์ด ํšŒ์‚ฌ์—์„œ" ํ•˜๊ณ  ์‹ถ์€ ์ด์œ ์—ฌ์•ผ ์„ค๋“๋ ฅ ์žˆ์Œ |
86
+ | โ‘ข ํšŒ์‚ฌ์— ๋Œ€ํ•ด ๋А๋‚€ ์  | ํšŒ์‚ฌ/์กฐ์ง์„ ์ ‘ํ•˜๊ฑฐ๋‚˜ ์กฐ์‚ฌํ•˜๋ฉด์„œ ๋А๋‚€ ๊ตฌ์ฒด์ ์ธ ์ธ์ƒ | ์ฒดํ—˜, ์‹ค์Šต, ๊ธฐ์‚ฌ, ๋ฆฌ์„œ์น˜, ์‚ฌ๋žŒ๊ณผ์˜ ์ ‘์ ์„ ํ†ตํ•ด ๋А๋‚€ ์ธ์ƒ, ๋ถ„์œ„๊ธฐ, ๊ฐ•์  ๋“ฑ | ๋‹จ์ˆœํ•œ ์นญ์ฐฌ X / ๋ณธ์ธ์˜ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„ํ•œ ๊ด€์ฐฐ๊ณผ ์ธ์ƒ ์ค‘์‹ฌ |
87
+ | โ‘ฃ ์ž…์‚ฌ ํ›„ ๊ณ„ํš | ์ž…์‚ฌ ์งํ›„ 1~3๋…„ ๋‚ด ํ•˜๊ณ  ์‹ถ์€ ์ผ, ์—ญ๋Ÿ‰ ์„ฑ์žฅ ๊ณ„ํš | ๋งก๊ฒŒ ๋  ์ง๋ฌด์—์„œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์œผ๋ฉฐ, ์–ด๋–ค ๋ถ€๋ถ„์„ ์„ฑ์žฅ์‹œํ‚ฌ ๊ฒƒ์ธ์ง€ | "์ผ๋‹จ ์—ด์‹ฌํžˆ ํ•˜๊ฒ ๋‹ค" ์‹์˜ ๋ง‰์—ฐํ•œ ์˜์ง€๊ฐ€ ์•„๋‹Œ ๊ตฌ์ฒด์ ์ธ ํ™œ๋™๊ณผ ๋ชฉํ‘œ ์ค‘์‹ฌ |
88
+ | โ‘ค ์žฅ๊ธฐ์ ์ธ ๋ชฉํ‘œ | ์ปค๋ฆฌ์–ด ๊ด€์ ์—์„œ์˜ ์ค‘์žฅ๊ธฐ์  ์„ฑ์žฅ ๋ฐฉํ–ฅ | ์ง๋ฌด ์ „๋ฌธ๊ฐ€๋กœ์„œ ๋˜๋Š” ๋ฆฌ๋”๋กœ์„œ ์–ด๋–ค ๋ชจ์Šต์œผ๋กœ ์„ฑ์žฅํ•˜๊ณ  ์‹ถ์€์ง€ | ํšŒ์‚ฌ๊ฐ€ ๊ทธ ์„ฑ์žฅ์˜ ๋ฐฐ๊ฒฝ์ด ๋˜์–ด์•ผ ํ•จ (ex. ํšŒ์‚ฌ์˜ ์žฅ์ ๊ณผ ์—ฐ๊ฒฐ) |
89
+ | โ‘ฅ ํšŒ์‚ฌ์—์˜ ๊ธฐ์—ฌ | ๋ณธ์ธ์˜ ์„ฑ์žฅ๊ณผ ํšŒ์‚ฌ์˜ ๋ฐฉํ–ฅ์ด ๋งŒ๋‚˜๋Š” ์ง€์  | ๋ณธ์ธ์˜ ์—ญ๋Ÿ‰๊ณผ ํšŒ์‚ฌ์˜ ๋น„์ „/๋ฐฉํ–ฅ์ด ๋งž๋‹ฟ๋Š” ์ ‘์ ์„ ๊ฐ•์กฐ | "๋‚˜์˜ ์„ฑ์žฅ = ํšŒ์‚ฌ์˜ ๊ธฐ์—ฌ"๋ผ๋Š” ๊ตฌ๋„๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์—ฌ์ ธ์•ผ ํ•จ |
90
+ ```
91
+
92
+ ### ์˜ˆ์‹œ 6 - ์ž…์‚ฌ ํ›„ ๋น„์ „
93
+ ์งˆ๋ฌธ: ์ž…์‚ฌ ํ›„ 5๋…„, 10๋…„ ๋’ค ์ด๋ฃจ๊ณ  ์‹ถ์€ ๋ชฉํ‘œ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•  ๊ฒƒ์ธ์ง€ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
94
+
95
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
96
+ ```markdown
97
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
98
+ | --- | --- | --- | --- |
99
+ | โ‘  ๋น„์ „ ์š”์•ฝ | ์ž…์‚ฌ ํ›„ ๊ถ๊ทน์ ์œผ๋กœ ์ง€ํ–ฅํ•˜๋Š” ๋ชจ์Šต | ์ง๋ฌด ์ „๋ฌธ์„ฑ๊ณผ ์กฐ์ง ๊ธฐ์—ฌ๊ฐ€ ๋™์‹œ์— ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ | ์ง๋ฌด ์—ญํ•  + ์กฐ์ง ๋‚ด ์˜ํ–ฅ๋ ฅ์ด ๋‹ด๊ธด ๊ตฌ์ฒด์  ํฌ์ง€์…˜ |
100
+ | โ‘ก ๋‹จ๊ธฐ ๊ณ„ํš | ์ž…์‚ฌ ์ดˆ๊ธฐ ๋‹จ๊ณ„์—์„œ ์šฐ์„ ์ ์œผ๋กœ ์ตํž ์—ญ๋Ÿ‰๊ณผ ๋งก๊ณ  ์‹ถ์€ ์—…๋ฌด | ํšŒ์‚ฌ/์ง๋ฌด์— ๋น ๋ฅด๊ฒŒ ์ ์‘ํ•˜๊ณ  ์‹ค๋ฌด์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉํ–ฅ ์ œ์‹œ | ๋ช…ํ™•ํ•œ ๊ธฐ๊ฐ„ ์–ธ๊ธ‰(1~2๋…„) + ์‹ค๋ฌด ์ค‘์‹ฌ ํ‚ค์›Œ๋“œ ํ™œ์šฉ |
101
+ | โ‘ข ์ค‘์žฅ๊ธฐ ๋ชฉํ‘œ | ์ผ์ • ๊ธฐ๊ฐ„ ๋‚ด ๋‹ฌ์„ฑํ•˜๊ณ  ์‹ถ์€ ์„ฑ๊ณผ์™€ ์„ฑ์žฅ ๋ชจ์Šต | ์ง๋ฌด์—์„œ์˜ ์„ฑ์žฅ ๊ฒฝ๋กœ ๋˜๋Š” ์ฑ…์ž„ ์žˆ๋Š” ์—ญํ•  ์ œ์‹œ | ๋ชฉํ‘œ ๋‹ฌ์„ฑ ์‹œ์ (3~5๋…„), ๊ตฌ์ฒด์ ์ธ ์—ญํ• /์„ฑ๊ณผ ์ค‘์‹ฌ |
102
+ | โ‘ฃ ์‹คํ–‰ ์ „๋žต | ์œ„์˜ ๋ชฉํ‘œ๋“ค์„ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์‹ค์ฒœ ๊ณ„ํš | ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์„ฑ์žฅํ•  ๊ฒƒ์ธ์ง€ ๊ตฌ์ฒด์ ์ธ ์‹คํ–‰ ๋ฐฉ์•ˆ ํฌํ•จ | ํ•™์Šต ๋ฃจํ‹ด, ํ˜‘์—… ๋ฐฉ๋ฒ•, ํ”ผ๋“œ๋ฐฑ ํ™œ์šฉ ๋“ฑ์˜ ๊ตฌ์ฒด์„ฑ ํ•„์š” |
103
+ | โ‘ค ์กฐ์ง ๊ธฐ์—ฌ | ๊ฐœ์ธ ์„ฑ์žฅ์ด ์กฐ์ง์— ๋ฏธ์น˜๋Š” ๊ธ์ •์  ์˜ํ–ฅ | ๋น„์ „ ๋‹ฌ์„ฑ์ด ํšŒ์‚ฌ์˜ ๊ฐ€์น˜, ์„ฑ๊ณผ์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌ๋˜๋Š”์ง€ ์—ฐ๊ฒฐ | ํšŒ์‚ฌ์˜ ๋ฐฉํ–ฅ์„ฑ๊ณผ ์—ฐ๊ณ„๋˜๋ฉด ์„ค๋“๋ ฅ ๊ฐ•ํ™” |
104
+ ```
105
+
106
+ ### ์˜ˆ์‹œ 7 - ์กฐ์ง ์ดํ•ด ๋ฐ ์ œ์–ธ
107
+ ์งˆ๋ฌธ: ๋‹น์‚ฌ ์„œ๋น„์Šค์˜ ์žฅ๋‹จ์ ์„ ๋ถ„์„ํ•˜๊ณ , ๊ฐœ์„  ๋ฐฉ์•ˆ์„ ์ œ์•ˆํ•ด ์ฃผ์‹ญ์‹œ์˜ค.
108
+
109
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
110
+ ```markdown
111
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
112
+ | --- | --- | --- | --- |
113
+ | โ‘  ํ™˜๊ฒฝ ์ธ์‹ | ์‚ฐ์—…/๊ธฐ์ˆ  ๋ณ€ํ™” ํ๋ฆ„ ์†์—์„œ ํšŒ์‚ฌ์˜ ํ˜„์žฌ ์œ„์น˜๋ฅผ ์ธ์‹ | ์‚ฐ์—…ยท์‹œ์žฅยท๊ณ ๊ฐ์˜ ๋ณ€ํ™” ํ๋ฆ„์— ๋Œ€ํ•œ ํ†ต์ฐฐ์„ ๋ณด์—ฌ์คŒ | ๋„ˆ๋ฌด ์ผ๋ฐ˜์  X โ†’ ํ•ด๋‹น ํšŒ์‚ฌ์˜ ํ˜„์žฌ ์ƒํ™ฉ๊ณผ ๋งฅ๋ฝ์ด ๋ฐ˜์˜๋ผ์•ผ ํ•จ |
114
+ | โ‘ก ํšŒ์‚ฌ ๊ฐ•์ /์ฐจ๋ณ„์  | ํšŒ์‚ฌ(๋˜๋Š” ๋Œ€ํ‘œ ์„œ๋น„์Šค)์˜ ๊ฐ•์  ๋ฐ ์ฐจ๋ณ„ํ™” ํฌ์ธํŠธ๋ฅผ ์ œ์‹œ | "์™œ ์ด ํšŒ์‚ฌ๊ฐ€ ๊ฒฝ์Ÿ ์šฐ์œ„์— ์žˆ๋Š”๊ฐ€"์— ๋Œ€ํ•œ ๋‚˜๋งŒ์˜ ์‹œ๊ฐ | ๋‹จ์ˆœ ๋‚˜์—ด X โ†’ ํ†ตํ•ฉ์  ํ•ด์„ O |
115
+ | โ‘ข ํ•ต์‹ฌ ์ œ์•ˆ | ํšŒ์‚ฌ๊ฐ€ ๋‚˜์•„๊ฐ€์•ผ ํ•  ๋ฐฉํ–ฅ์„ฑ ๋˜๋Š” ํ‚ค์›Œ๋“œ๋ฅผ ์ œ์•ˆ | ๋ธŒ๋žœ๋“œ ๊ฐ€์น˜, ๊ธฐ์ˆ  ์ „๋žต, ๊ณ ๊ฐ ์ค‘์‹ฌ ์ฒ ํ•™ ๋“ฑ ๋ช…ํ™•ํ•œ ์ œ์•ˆ | ์Šฌ๋กœ๊ฑด์ด๋‚˜ ๋ฌธ์žฅ์œผ๋กœ ์••์ถ• ๊ฐ€๋Šฅํ•˜๋ฉด ๋” ์ธ์ƒ์  |
116
+ | โ‘ฃ ์‹คํ–‰ ์ „๋žต | ์ œ์•ˆ์„ ์‹คํ˜„ํ•˜๊ธฐ ์œ„ํ•œ ์‹คํ–‰ ๋ฐฉํ–ฅ ๋˜๋Š” ๊ตฌ์ฒด์  ๋ฐฉ์•ˆ ์ œ์‹œ | ์„œ๋น„์Šค ๊ฐœ์„ ์•ˆ, ๊ธฐ์ˆ  ์ ์šฉ, ๊ณ ๊ฐ๊ฒฝํ—˜ ๊ฐ•ํ™” ๋ฐฉ์•ˆ ๋“ฑ | ํ˜„์‹ค์ ์ธ ์ˆ˜์ค€์˜ ์‹คํ–‰์•ˆ์ด ํฌํ•จ๋ผ์•ผ ์„ค๋“๋ ฅ โ†‘ |
117
+ | โ‘ค ๊ธฐ๋Œ€ ํšจ๊ณผ | ์‹คํ–‰ ์‹œ ํšŒ์‚ฌ ๋˜๋Š” ๊ณ ๊ฐ์—๊ฒŒ ์–ด๋–ค ๊ธ์ •์  ๋ณ€ํ™”๊ฐ€ ์žˆ๋Š”์ง€ ์„ค๋ช… | ๋ธŒ๋žœ๋“œ ๊ฐ•ํ™”, ๊ณ ๊ฐ๊ฒฝํ—˜ ๊ฐœ์„ , ์ˆ˜์ต์„ฑ ํ–ฅ์ƒ ๋“ฑ ๊ตฌ์ฒดํ™” | ํ—ˆํ™ฉ๋œ ๋ฏธ๋ž˜ ์˜ˆ์ธก X โ†’ ํ˜„์‹ค ๊ธฐ๋ฐ˜ ๊ฐ€์น˜ ์ „๋‹ฌ O |
118
+ ```
119
+
120
+ ### ์˜ˆ์‹œ 8 - ๊ฐœ์ธ์˜ ๋‚ด์  ํŠน์„ฑ
121
+ ์งˆ๋ฌธ: ๋ณธ์ธ์˜ ๊ฐ•์ ๊ณผ ์•ฝ์ ์„ ์„ค๋ช…ํ•˜๊ณ , ์•ฝ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ–ˆ๋Š”์ง€ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
122
+
123
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
124
+ ```markdown
125
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
126
+ | --- | --- | --- | --- |
127
+ | โ‘  ์žฅ์  ์ •์˜ | ์ง๋ฌด์™€ ์—ฐ๊ฒฐ๋˜๋Š” ํ•ต์‹ฌ ์„ฑ๊ฒฉ ๊ฐ•์ ์„ ํ•˜๋‚˜ ์„ ํƒ | ์ง€๋‚˜์น˜๊ฒŒ ์ผ๋ฐ˜์ ์ธ ์žฅ์ (X), ์ง๋ฌด์™€ ์—ฐ๊ด€์„ฑ ์žˆ๋Š” ์žฅ์ (O) | ์—ฌ๋Ÿฌ ๊ฐœ ๋‚˜์—ดํ•˜์ง€ ๋ง๊ณ  ํ•˜๋‚˜์— ์ง‘์ค‘, ์ง๋ฌด์ ํ•ฉ์„ฑ๊ณผ ์—ฐ๊ฒฐ๋  ๊ฒƒ |
128
+ | โ‘ก ์žฅ์  ๊ทผ๊ฑฐ ์‚ฌ๋ก€ | ํ•ด๋‹น ์žฅ์ ์ด ๋“œ๋Ÿฌ๋‚œ ๊ฒฝํ—˜์„ ๊ตฌ์ฒด์ ์œผ๋กœ ์„œ์ˆ  | ์ƒํ™ฉ-ํ–‰๋™-๊ฒฐ๊ณผ์˜ ๊ตฌ์กฐ๋กœ ๊ฐ„๋‹จํ•˜๊ฒŒ ์„ค๋ช… | ์ฃผ๋ณ€์˜ ํ‰๊ฐ€๊ฐ€ ํฌํ•จ๋˜๋ฉด ์„ค๋“๋ ฅ ์ƒ์Šน |
129
+ | โ‘ข ๋‹จ์  ์ •์˜ | ์กฐ์ง์ด ์ˆ˜์šฉ ๊ฐ€๋Šฅํ•œ ์ˆ˜์ค€์˜ ๋‹จ์ ์„ ์„ ์ • | ์—…๋ฌด์™€ ์ง์ ‘ ์ถฉ๋Œํ•˜์ง€ ์•Š๋Š” ๋‹จ์ , ๋„ˆ๋ฌด ์†”์งํ•˜๊ฑฐ๋‚˜ ์น˜๋ช…์ ์ธ ๋‹จ์ (X) | ๊ฐ์ •์ /์‚ฌ์ƒํ™œ์  ๋‹จ์ ์€ ํ”ผํ•  ๊ฒƒ |
130
+ | โ‘ฃ ๋ณด์™„ ๋…ธ๋ ฅ | ๋‹จ์ ์„ ์ธ์‹ํ•˜๊ณ  ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์˜จ ๋…ธ๋ ฅ | ์‹ค์งˆ์ ์ธ ํ–‰๋™, ๋ฃจํ‹ด, ์‹œ์Šคํ…œ์ด ์žˆ์œผ๋ฉด ์ข‹์Œ | "๋…ธ๋ ฅํ•˜๊ฒ ๋‹ค"๋Š” ๋‹ค์ง๋ณด๋‹ค๋Š” ๊ตฌ์ฒด์  ์‹คํ–‰ ์ค‘์‹ฌ |
131
+ | โ‘ค ๋ณ€ํ™” ๋ฐ ํšจ๊ณผ | ๊ทธ ๋…ธ๋ ฅ์˜ ๊ฒฐ๊ณผ ๋ณ€ํ™”๋œ ์  | ์‹ค์งˆ์ ์œผ๋กœ ๋ณ€ํ™”ํ•œ ํƒœ๋„๋‚˜ ์„ฑ๊ณผ ์ค‘์‹ฌ | ์žฅ์ ํ™”๋œ ๋‹จ์ ์ด ์•„๋‹ˆ๋ผ ๋ณ€ํ™” ๊ณผ์ •์— ์ง‘์ค‘ |
132
+ ```
133
+
134
+ ### ์˜ˆ์‹œ 9 - ์„ฑ์žฅ ๊ณผ์ •
135
+ ์งˆ๋ฌธ: ํ˜„์žฌ์˜ ์ž์‹ ์—๊ฒŒ ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ ์‚ฌ๊ฑด์ด๋‚˜ ์ธ๋ฌผ์„ ํฌํ•จํ•˜์—ฌ ์„ฑ์žฅ๊ณผ์ •์„ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
136
+
137
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
138
+ ```markdown
139
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
140
+ | --- | --- | --- | --- |
141
+ | โ‘  ์ดˆ๊ธฐ ๋ฐฐ๊ฒฝ | ์„ฑ์žฅ ํ™˜๊ฒฝ ๋˜๋Š” ์œ ๋…„๊ธฐ ํŠน์ง• | ์–ด๋ฆฐ ์‹œ์ ˆ ํ˜น์€ ํ•™์ฐฝ ์‹œ์ ˆ์˜ ๊ฐ€์น˜๊ด€ ํ˜•์„ฑ ๋ฐฐ๊ฒฝ์ด ๋˜๋Š” ์‚ฌ๊ฑด์ด๋‚˜ ํ™˜๊ฒฝ์„ ์†Œ๊ฐœ | ๋‹จ์ˆœํ•œ ์„ฑ๊ฒฉ ๋ฌ˜์‚ฌ๋ณด๋‹ค๋Š” ํ–‰๋™/์‚ฌ๊ณ ์˜ ๊ทผ๊ฑฐ๊ฐ€ ๋œ ์‚ฌ๊ฑด์ด ์ข‹์Œ |
142
+ | โ‘ก ๊ฐ€์น˜๊ด€ ํ˜•์„ฑ ์‚ฌ๊ฑด | ๋‚˜์—๊ฒŒ ์˜ํ–ฅ์„ ์ค€ ์‚ฌ๊ฑด ๋˜๋Š” ์ธ๋ฌผ | ํ˜„์žฌ์˜ ์‚ฌ๊ณ ๋ฐฉ์‹์ด๋‚˜ ํ–‰๋™ ๋ฐฉ์‹์„ ํ˜•์„ฑํ•˜๊ฒŒ ๋งŒ๋“  ์ฃผ์š” ์‚ฌ๊ฑด์ด๋‚˜ ์ธ๋ฌผ ์†Œ๊ฐœ | ๋‹จ์ˆœ ์†Œ๊ฐœ X โ†’ ๊ตฌ์ฒด์ ์ธ ์ƒํ™ฉ ๋ฌ˜์‚ฌ + ๋‚˜์—๊ฒŒ ์ค€ ๋ณ€ํ™” |
143
+ | โ‘ข ๋ณ€ํ™”์˜ ๊ฒฐ๊ณผ | ์‚ฌ๊ณ  ๋ฐฉ์‹, ํ–‰๋™ ๋ณ€ํ™” ๋ฐ ์„ฑ๊ณผ | ์œ„ ์‚ฌ๊ฑด/์ธ๋ฌผ๋กœ ์ธํ•ด ์ƒ๊ธด ๋ณ€ํ™”๊ฐ€ ์‹ค์ œ ํ–‰๋™์ด๋‚˜ ์„ฑ๊ณผ๋กœ ์ด์–ด์กŒ์Œ์„ ์„œ์ˆ  | ์ƒ๊ฐ๋งŒ ๋ณ€ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ, ํ–‰๋™๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ๋ณด์—ฌ์ค„ ๊ฒƒ |
144
+ | โ‘ฃ ์ง๋ฌด์™€์˜ ์—ฐ๊ฒฐ | ์ง๋ฌด์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ€์น˜๊ด€ ์ •๋ฆฝ ๋ฐ ์ ํ•ฉ์„ฑ ์–ดํ•„ | ์œ„ ๊ณผ์ •์—์„œ ํ˜•์„ฑ๋œ ๊ฐ€์น˜๊ด€์ด๋‚˜ ์—ญ๋Ÿ‰์ด ์ง€์› ์ง๋ฌด์— ์ ํ•ฉํ•จ์„ ์„ค๋ช… | '๊ทธ๋ž˜์„œ ์ง€๊ธˆ ์ด ์ง๋ฌด์— ์™œ ์ ํ•ฉํ•œ๊ฐ€?'๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ |
145
+ ```
146
+
147
+ ### ์˜ˆ์‹œ 10 - ๊ฐ€์น˜๊ด€ ๋ฐ ์‹ ๋…
148
+ ์งˆ๋ฌธ: '์ง์—…'์„ ์„ ํƒํ•  ๋•Œ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ๊ธฐ์ค€์€ ๋ฌด์—‡์ด๋ฉฐ, ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
149
+
150
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
151
+ ```markdown
152
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
153
+ | --- | --- | --- | --- |
154
+ | โ‘  ์ •์ฒด์„ฑ ์ •์˜ | ๋‚˜๋ฅผ ๋Œ€ํ‘œํ•˜๋Š” ํ‚ค์›Œ๋“œ ๋˜๋Š” ํ•ต์‹ฌ ์„ฑํ–ฅ ์†Œ๊ฐœ | ํ•œ๋‘ ๊ฐœ์˜ ๋‹จ์–ด(์˜ˆ: ๊ด€์ฐฐ, ์ง„์‹ฌ, ์‹ ๋ขฐ ๋“ฑ)๋กœ ๋‚˜์˜ ํƒœ๋„ยท์‹ ๋…ยท๊ฐ€์น˜๊ด€์„ ์š”์•ฝ | ํ•ด์‹œํƒœ๊ทธ๋‚˜ ์ง๊ด€์ ์ธ ๋ฌธ์žฅ ์‚ฌ์šฉ โ†’ ์ฃผ์ œ๋ฅผ ๋ช…ํ™•ํžˆ ์ธ์‹ํ•˜๊ฒŒ ํ•  ๊ฒƒ |
155
+ | โ‘ก ๊ฐ€์น˜๊ด€ ์„ค๋ช… | ํ•ด๋‹น ํ‚ค์›Œ๋“œ์— ๋Œ€ํ•œ ๋ณธ์ธ์˜ ์ฒ ํ•™์ด๋‚˜ ๋ฏฟ์Œ ์„ค๋ช… | ์™œ ๊ทธ ๊ฐ€์น˜๊ด€์„ ์ค‘์š”ํ•˜๊ฒŒ ์—ฌ๊ธฐ๋Š”์ง€, ์–ด๋–ค ๋ฐฐ๊ฒฝ์—์„œ ์ƒ๊ฒผ๋Š”์ง€๋ฅผ ์„ค๋ช… | ๋‹จ์ˆœ ์„ค๋ช… X โ†’ ์‚ฌ๊ณ ๋ฐฉ์‹์ด ์ž˜ ๋“œ๋Ÿฌ๋‚˜๋Š” ๋ฌธ์žฅ์ด๋ฉด ์ข‹์Œ |
156
+ | โ‘ข ๊ฒฝํ—˜ ์‚ฌ๋ก€ | ์‹ค์ œ๋กœ ๊ทธ ๊ฐ€์น˜๊ด€์ด ๋“œ๋Ÿฌ๋‚œ ์‚ฌ๊ฑด ์†Œ๊ฐœ | ๊ฐ€์น˜๊ด€์ด ๋‹จ์ง€ ์ƒ๊ฐ์— ๋จธ๋ฌผ์ง€ ์•Š๊ณ  ํ–‰๋™๊ณผ ๊ฒฐ๊ณผ๋กœ ์ด์–ด์กŒ์Œ์„ ๋ณด์—ฌ์คŒ | ์ง๋ฌด ๊ด€๋ จ ๊ฒฝํ—˜์ด๋ฉด ๋” ์ข‹๊ณ , ์„ฑ๊ณผ๋„ ํ•จ๊ป˜ ์ œ์‹œ๋˜๋ฉด ์„ค๋“๋ ฅโ†‘ |
157
+ | โ‘ฃ ์ง๋ฌด ์—ฐ๊ฒฐ | ํ•ด๋‹น ๊ฐ€์น˜๊ด€์ด ์ง๋ฌด ์ˆ˜ํ–‰์— ์–ด๋–ค ์˜ํ–ฅ์„ ์ค„ ์ˆ˜ ์žˆ๋Š”์ง€ ์„ค๋ช… | ์ด ๊ฐ€์น˜๊ด€์„ ๊ฐ€์ง„ ์‚ฌ๋žŒ์ด ๊ทธ ์ง๋ฌด์—์„œ ์–ด๋–ค ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ์„์ง€ ์—ฐ๊ฒฐ | "๊ทธ๋ž˜์„œ ์ด ์‚ฌ๋žŒ์ด ์™œ ์ ํ•ฉํ•œ๊ฐ€"์— ๋Œ€ํ•œ ๋Œ€๋‹ต์ด ๋˜๋„๋ก |
158
+ | โ‘ค ์„ฑ์žฅ ๋ฐฉํ–ฅ | ์ด ๊ฐ€์น˜๊ด€์„ ๋ฐ”ํƒ•์œผ๋กœ ํ–ฅํ›„ ์–ด๋–ค ์ „๋ฌธ๊ฐ€๋กœ ์„ฑ์žฅํ•˜๊ณ  ์‹ถ์€์ง€ | ์ถ”์ƒ์ ์ธ ์ธ์žฌ์ƒ X โ†’ ์‹ค๋ฌด ์žฅ๋ฉด์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์  ์„ฑ์žฅ ๋ฐฉํ–ฅ ์ œ์‹œ | "๊ณ ๊ฐ๊ณผ์˜ ๊ณต๊ฐ ๊ธฐ๋ฐ˜ ๋งˆ์ผ€ํŒ… ์ „๋ฌธ๊ฐ€๋กœ ์„ฑ์žฅ"์ฒ˜๋Ÿผ ๋ช…๋ฃŒํ•˜๊ฒŒ |
159
+ ```
160
+
161
+ ### ์˜ˆ์‹œ 11 - ์ธ์žฌ์ƒ ๋ฐ ์กฐ์ง์ ํ•ฉ์„ฑ
162
+ ์งˆ๋ฌธ: ๋‹น์‚ฌ์˜ ํ•ต์‹ฌ๊ฐ€์น˜(๋„์ „, ํ˜‘๋ ฅ, ์‹ ๋ขฐ) ์ค‘ ๋ณธ์ธ์„ ๊ฐ€์žฅ ์ž˜ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ€์น˜์™€ ๊ทธ ์ด์œ ๋ฅผ ๊ฒฝํ—˜์„ ๋“ค์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
163
+
164
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
165
+ ```markdown
166
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
167
+ | --- | --- | --- | --- |
168
+ | โ‘  ์ธ์žฌ์ƒ ์„ ํƒ | ํšŒ์‚ฌ์˜ ์ธ์žฌ์ƒ/ํ•ต์‹ฌ๊ฐ€์น˜ ์ค‘ ํ•œ ๊ฐ€์ง€๋ฅผ ์„ ํƒํ•ด ๋ฐํžŒ๋‹ค | ํ™ˆํŽ˜์ด์ง€, ์ฑ„์šฉ์•ˆ๋‚ด์„œ ๋“ฑ์„ ์ฐธ๊ณ ํ•ด ๋ช…ํ™•ํ•˜๊ฒŒ ์–ธ๊ธ‰ | ํ•ต์‹ฌ ํ‚ค์›Œ๋“œ๋Š” ๋ฌธ์žฅ ์•ž๋ถ€๋ถ„์— ๋…ธ์ถœ๋˜๋„๋ก |
169
+ | โ‘ก ๊ฐœ์ธ์  ํ•ด์„ | ํ•ด๋‹น ์ธ์žฌ์ƒ์„ ๋ณธ์ธ๋งŒ์˜ ์‹œ๊ฐ์œผ๋กœ ํ•ด์„ํ•œ๋‹ค | ๊ทธ ๊ฐ€์น˜๊ฐ€ ์™œ ์ค‘์š”ํ•œ์ง€, ์–ด๋–ค ์˜๋ฏธ๋กœ ๋ฐ›์•„๋“ค์ด๋Š”์ง€๋ฅผ ๋ณธ์ธ์˜ ์–ธ์–ด๋กœ ์„ค๋ช… | ๋‹จ์ˆœ ๋ณต๋ถ™ X โ†’ '๋‚ด๊ฐ€ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜๋Š” ์ด์œ '๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์•ผ ์„ค๋“๋ ฅโ†‘ |
170
+ | โ‘ข ๊ฒฝํ—˜ ์‚ฌ๋ก€ | ํ•ด๋‹น ์ธ์žฌ์ƒ์ด ์‹ค์ œ๋กœ ๋“œ๋Ÿฌ๋‚œ ๊ฒฝํ—˜์„ ์„œ์ˆ ํ•œ๋‹ค | ๋‹จ์ˆœํ•œ ๋‚˜์—ด์ด ์•„๋‹Œ, ๊ทธ ๊ฐ€์น˜์— ๊ธฐ๋ฐ˜ํ•œ ํ–‰๋™๊ณผ ๋งฅ๋ฝ์„ ์ค‘์‹ฌ์œผ๋กœ ๊ตฌ์„ฑ | ํ–‰๋™ โ†’ ๋ฌธ์ œ ์ธ์‹ โ†’ ์‹œ๋„ โ†’ ๋ณ€ํ™”๋กœ ํ๋ฆ„์ด ๋‚˜์™€์•ผ ์ข‹์Œ |
171
+ | โ‘ฃ ์„ฑ๊ณผ ์ œ์‹œ | ํ•ด๋‹น ๊ฐ€์น˜๊ด€ ๊ธฐ๋ฐ˜์˜ ํ–‰๋™์ด ๋‚ณ์€ ๊ฒฐ๊ณผ๋ฅผ ์„œ์ˆ ํ•œ๋‹ค | ์ˆ˜์น˜์  ์„ฑ๊ณผ or ๋ณ€ํ™”๋œ ํ‰๊ฐ€, ์˜ํ–ฅ๋ ฅ ๋“ฑ์œผ๋กœ ๊ตฌ์ฒดํ™” | "๊ทธ๋ž˜์„œ ๋ฌด์Šจ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”๊ฐ€?"๊ฐ€ ๋ฐ˜๋“œ์‹œ ๋“ค์–ด๊ฐ€์•ผ ํ•จ |
172
+ | โ‘ค ์—ฐ๊ฒฐ ๋ฐ ๋งˆ๋ฌด๋ฆฌ | ์ด ๊ฐ€์น˜๊ด€์ด ํšŒ์‚ฌ์—์„œ์˜ ์ผ๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋ ์ง€๋ฅผ ์„ค๋ช…ํ•œ๋‹ค | ๋‚ด๊ฐ€ ์ด ๊ฐ€์น˜๋ฅผ ์‹ค์ฒœํ•˜๋Š” ์‚ฌ๋žŒ์ž„์„ ๊ฐ•์กฐํ•˜๊ณ , ๊ทธ๊ฒŒ ์–ด๋–ป๊ฒŒ ํšŒ์‚ฌ์— ๋„์›€ ๋˜๋Š”์ง€ ๋ฐํž˜ | "์ด ๊ฐ€์น˜๊ด€์„ ๊ฐ–์ถ˜ ๋‚ด๊ฐ€, ์™œ ์ด ์ง๋ฌด์—์„œ ์ž˜ ๋งž๋Š”์ง€"๋ฅผ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ |
173
+ ```
174
+
175
+ ### ์˜ˆ์‹œ 12 - ๋ณด์œ  ์ง€์‹ ๋ฐ ๊ธฐ์ˆ  (๋ฌธ์ œ-ํ•ด๊ฒฐ๋ฐฉ์‹)
176
+ ์งˆ๋ฌธ: ๋ณด์œ ํ•œ ๊ธฐ์ˆ  ์Šคํƒ(Language, Framework, DB ๋“ฑ)์— ๋Œ€ํ•ด ์ˆ™๋ จ๋„๋ฅผ ํฌํ•จํ•˜์—ฌ ์ƒ์„ธํžˆ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
177
+
178
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
179
+ ```markdown
180
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
181
+ | --- | --- | --- | --- |
182
+ | โ‘  ์š”์•ฝ ํ•œ ๋ฌธ์žฅ | ์ „์ฒด ๋‹ต๋ณ€์„ ์š”์•ฝํ•˜๋Š” ํ•ต์‹ฌ ๋ฉ”์‹œ์ง€๋ฅผ ์ œ์‹œ | ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ฉฐ ํŠน์ • ๊ธฐ์ˆ  ์—ญ๋Ÿ‰์„ ๊ฐ–์ถ”๊ฒŒ ๋œ ๊ณ„๊ธฐ | ํ•ต์‹ฌ ๊ธฐ์ˆ  ์—ญ๋Ÿ‰ + ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฒฝํ—˜์ด ํ•จ๊ป˜ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ |
183
+ | โ‘ก ๋ฌธ์ œ ์ƒํ™ฉ | ์ง๋ฌด ์ˆ˜ํ–‰ ์ค‘ ๋งˆ์ฃผํ•œ ๊ตฌ์ฒด์ ์ธ ๊ธฐ์ˆ ์  ๋ฌธ์ œ๋‚˜ ๋ณ‘๋ชฉ ํ˜„์ƒ | ์‹ค์ œ ํ”„๋กœ์ ํŠธ๋‚˜ ํ˜‘์—… ์ƒํ™ฉ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์—ฌ์•ผ ํ•จ | ๋‹จ์ˆœํ•œ ๋ถˆํŽธํ•จ X โ†’ ๊ธฐ๋Šฅ ์ค‘๋‹จ, ์˜ค๋ฅ˜ ๋“ฑ ๋ช…ํ™•ํ•œ ๋ฌธ์ œ |
184
+ | โ‘ข ์›์ธ ๋ถ„์„ ๋ฐ ๊ณผ์ œ ์ •์˜ | ๋ฌธ์ œ์˜ ์›์ธ์„ ๊ธฐ์ˆ ์ ์œผ๋กœ ๋ถ„์„ํ•˜๊ณ  ๊ฐœ์„  ๊ณผ์ œ๋ฅผ ์Šค์Šค๋กœ ์ •์˜ | ๋…ผ๋ฆฌ์  ๋ถ„์„๊ณผ ๊ธฐ์ˆ ์  ํ†ต์ฐฐ์ด ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ | "์™œ ๋ฐœ์ƒํ–ˆ๋Š”๊ฐ€?" + "์–ด๋–ค ๋Šฅ๋ ฅ์ด ํ•„์š”ํ–ˆ๋Š”๊ฐ€?" |
185
+ | โ‘ฃ ํ•ด๊ฒฐ ๊ณผ์ • (๋‚˜์˜ ์•ก์…˜) | ๊ธฐ์ˆ ์  ์กฐ์น˜๋ฅผ ์ทจํ•˜๊ณ , ํ˜‘์—…ํ•˜๋ฉฐ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•œ ๊ตฌ์ฒด์  ์‹คํ–‰ | ์–ด๋–ค ๊ธฐ์ˆ ์„ ์–ด๋–ป๊ฒŒ ์ ์šฉํ–ˆ๋Š”์ง€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ | ๊ธฐ์ˆ  ๋‹จ์ˆœ ๋‚˜์—ด X โ†’ ๊ตฌ์กฐ ๋ณ€๊ฒฝ, ์„ค์ •, ๋„๊ตฌ ํ™œ์šฉ ๋“ฑ ์ƒ์„ธํžˆ |
186
+ | โ‘ค ์„ฑ๊ณผ ๋ฐ ํ‰๊ฐ€ | ๋ฌธ์ œ ํ•ด๊ฒฐ ๊ฒฐ๊ณผ, ์„ฑ๋Šฅ ๊ฐœ์„  ๋ฐ ํƒ€์ธ์˜ ํ‰๊ฐ€ ๋“ฑ ์„ฑ๊ณผ ์ œ์‹œ | ์ˆ˜์น˜/๋น„๊ต/ํ”ผ๋“œ๋ฐฑ ๋“ฑ ์™ธ๋ถ€ ์ง€ํ‘œ ๊ฐ•์กฐ | "๊ทธ๋ž˜์„œ ๋ญ๊ฐ€ ๋‹ฌ๋ผ์กŒ๋Š”๊ฐ€?"์— ๋ถ„๋ช…ํžˆ ๋‹ตํ•ด์•ผ ํ•จ |
187
+ | โ‘ฅ ๊นจ๋‹ฌ์Œ ๋ฐ ์ง๋ฌด ์—ฐ๊ณ„ | ์ด ๊ฒฝํ—˜์ด ๊ธฐ์ˆ  ์—ญ๋Ÿ‰๊ณผ ์ง๋ฌด ์ ํ•ฉ์„ฑ์— ์–ด๋–ค ์˜ํ–ฅ์„ ์ฃผ์—ˆ๋Š”์ง€ | ๊ธฐ์ˆ ์  ์„ฑ์žฅ๊ณผ ์‹ค๋ฌด ์ ์šฉ ๊ฐ€๋Šฅ์„ฑ์„ ๋“œ๋Ÿฌ๋‚ด์•ผ ํ•จ | ์ง๋ฌด ๊ธฐ์—ฌ ์˜์ง€๊นŒ์ง€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์—ฐ๊ฒฐ๋˜๋ฉด ์ข‹์Œ |
188
+ ```
189
+
190
+ ### ์˜ˆ์‹œ 13 - ์—ญ๋Ÿ‰ ๊ฐœ๋ฐœ ๊ณผ์ •
191
+ ์งˆ๋ฌธ: ์ง€์› ์ง๋ฌด์˜ ์ „๋ฌธ์„ฑ์„ ํ‚ค์šฐ๊ธฐ ์œ„ํ•ด ๋‚จ๋“ค๊ณผ ๋‹ฌ๋ฆฌ ํŠน๋ณ„ํ•œ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ธ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๋ฉด ์„œ์ˆ ํ•˜์‹œ์˜ค.
192
+
193
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
194
+ ```markdown
195
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
196
+ | --- | --- | --- | --- |
197
+ | โ‘  ๊ณ„๊ธฐ ๋ฐ ๋ฐฐ๊ฒฝ | ์ „๋ฌธ์„ฑ์„ ํ‚ค์šฐ๊ธฐ ์œ„ํ•ด ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋А๋‚€ ๊ณ„๊ธฐ | ์‹ค์ „ ๊ฒฝํ—˜์ด๋‚˜ ์‹คํŒจ, ํ•œ๊ณ„๋ฅผ ๊ฒช์œผ๋ฉฐ ๋А๋‚€ 'ํ•™์Šต์˜ ํ•„์š”์„ฑ' | ๋‹จ์ˆœ ํ˜ธ๊ธฐ์‹ฌ X โ†’ ๋ฌธ์ œ ์ธ์‹ ๋˜๋Š” ํ•„์š” ์˜์‹ ๊ธฐ๋ฐ˜ |
198
+ | โ‘ก ํ•™์Šต ํ™œ๋™ | ํ•™์Šต์„ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ–ˆ๋Š”์ง€ ๊ตฌ์ฒด์  ํ™œ๋™ ์„œ์ˆ  | ๊ต์œก ์ด์ˆ˜, ํ”„๋กœ์ ํŠธ ์ฐธ์—ฌ, ๋„๊ตฌ ํ•™์Šต, ํ”ผ๋“œ๋ฐฑ ๋“ฑ | ์Šค์Šค๋กœ ์„ ํƒํ•˜๊ณ  ๋ชฐ์ž…ํ•œ ๊ฒฝํ—˜์ด๋ฉด ๋” ์ข‹์Œ |
199
+ | โ‘ข ์ ์šฉ ๋ฐ ์‹ค์ฒœ | ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์‹ค์ œ ๊ฒฝํ—˜์— ์ ์šฉํ•œ ๊ณผ์ • | ํ•™์Šต-์‹คํ–‰ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ๋ช…ํ™•ํžˆ ์„ค๋ช… | ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์•„๋„ ์‹คํ–‰์ด ์ค‘์š” |
200
+ | โ‘ฃ ์„ฑ๊ณผ | ์‹คํ–‰ ํ›„ ์–ด๋–ค ๋ณ€ํ™”๋‚˜ ์„ฑ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ | ์ˆ˜์น˜, ๋น„๊ต, ํƒ€์ธ์˜ ํ‰๊ฐ€ ๋“ฑ์œผ๋กœ ์„ค๋“๋ ฅ ๊ฐ•ํ™” | "๊ทธ๋ž˜์„œ ์–ด๋–ค ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”๊ฐ€?"์— ๋‹ตํ•ด์•ผ ํ•จ |
201
+ | โ‘ค ์„ฑ์žฅ ๋ฐ ์—ฐ๊ณ„ | ํ•™์Šต์ด ์–ด๋–ป๊ฒŒ ๋‚ด ์‚ฌ๊ณ ๋ฐฉ์‹/์—ญ๋Ÿ‰์— ์˜ํ–ฅ์„ ๋ฏธ์ณค๋Š”์ง€ | ๋งˆ์ธ๋“œ์…‹ ๋ณ€ํ™”, ์ดํ›„ ํ–‰๋™์˜ ๋ณ€ํ™” | ์ง๋ฌด ์ ํ•ฉ์„ฑ๊ณผ ์—ฐ๊ฒฐ๋˜๋„๋ก ๋งˆ๋ฌด๋ฆฌ |
202
+ ```
203
+
204
+ ### ์˜ˆ์‹œ 14 - ์ง๋ฌด ๋ฐ ์‚ฐ์—… ์ดํ•ด๋„
205
+ ์งˆ๋ฌธ: ์ง€์›ํ•œ ๋ถ„์•ผ์˜ ์ตœ์‹  ๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ ์ค‘ ๊ฐ€์žฅ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ทธ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
206
+
207
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
208
+ ```markdown
209
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
210
+ | --- | --- | --- | --- |
211
+ | โ‘  ์ฃผ์š” ํŠธ๋ Œ๋“œ ์„ ์ • | ๋‚ด๊ฐ€ ์ฃผ๋ชฉํ•œ ์‚ฐ์—…ยท๊ธฐ์ˆ  ํŠธ๋ Œ๋“œ๋ฅผ ๋ช…ํ™•ํžˆ ์–ธ๊ธ‰ | ์ตœ์‹ ์„ฑ & ๊ฐœ์ธ์  ๊ด€์‹ฌ์ด ๋“œ๋Ÿฌ๋‚˜๋Š” ํ‚ค์›Œ๋“œ<br>๋„ˆ๋ฌด ๋„“์ง€ ์•Š๊ณ  ์ง๋ฌด์™€ ์—ฐ๊ฒฐ๋œ ํŠธ๋ Œ๋“œ | ๋‹จ์ˆœ ์œ ํ–‰ X โ†’ ์‹ค์งˆ์  ๋ณ€ํ™”๋ฅผ ๊ฐ€์ ธ์˜ฌ ๊ธฐ์ˆ  |
212
+ | โ‘ก ํŠธ๋ Œ๋“œ์˜ ์ค‘์š”์„ฑ ๋ถ„์„ | ์™œ ์ด ํŠธ๋ Œ๋“œ๊ฐ€ ์ค‘์š”ํ•œ์ง€ ์ž์‹ ์˜ ๊ฒฌํ•ด ์ œ์‹œ | ์‹œ์žฅ ๋ณ€ํ™”๋‚˜ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜ ๊ด€์ ์—์„œ ์ค‘์š”์„ฑ์„ ์„œ์ˆ <br>๊ธฐ์ˆ ์  ์ดํ•ด๋„๋„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํฌํ•จ | ๋‹จ์ˆœ ์„ค๋ช… X โ†’ ํ†ต์ฐฐ๋ ฅ ์žˆ๋Š” ๋ถ„์„ O |
213
+ | โ‘ข ํ•™์Šต ๋ฐ ์‹ค์ฒœ ๊ฒฝํ—˜ | ์ด ํŠธ๋ Œ๋“œ์™€ ๊ด€๋ จํ•ด ๋‚ด๊ฐ€ ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•ด์™”๋Š”์ง€ | ์ˆ˜์—…, ํ”„๋กœ์ ํŠธ, ๊ฐœ์ธํ•™์Šต, ์‚ฌ์ด๋“œ ์ž‘์—… ๋“ฑ ์‹ค์ฒœ ์ค‘์‹ฌ<br>๊ด€์‹ฌ์„ 'ํ–‰๋™'์œผ๋กœ ์ด์–ด๊ฐ„ ์  ๊ฐ•์กฐ | ์ด๋ก ๋งŒ X โ†’ ์‹ค์ œ ์ ์šฉ์ด๋‚˜ ์ฒดํ—˜ ๊ฒฝํ—˜ ์ค‘์‹ฌ |
214
+ | โ‘ฃ ์ธ์‚ฌ์ดํŠธ ๋ฐ ๊ด€์  ํ™•์žฅ | ์ด ํŠธ๋ Œ๋“œ๋ฅผ ๋ฐ”๋ผ๋ณด๋Š” ๋‚˜๋งŒ์˜ ๊ด€์  ์ œ์‹œ | ๋‹จ์ˆœ ๊ธฐ์ˆ  ์„ค๋ช…์„ ๋„˜์–ด ๊ฐ€์น˜ ์žฌํ•ด์„<br>๊ณ ๊ฐ, ์‹œ์žฅ, ์ง€์†๊ฐ€๋Šฅ์„ฑ ๋“ฑ ๋„“์€ ์‹œ์•ผ ๊ฐ•์กฐ | ๋‚จ๋“ค๊ณผ ๋‹ค๋ฅธ ์‹œ๊ฐ์ด๋‚˜ ๊นŠ์ด ์žˆ๋Š” ํ†ต์ฐฐ |
215
+ | โ‘ค ๊ธฐ์—… ๋ฐ ์ง๋ฌด์™€์˜ ์—ฐ๊ณ„ | ํ•ด๋‹น ํšŒ์‚ฌยท์ง๋ฌด์™€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ | ํšŒ์‚ฌ์˜ ๋ฐฉํ–ฅ์„ฑ๊ณผ ํŠธ๋ Œ๋“œ ๊ฐ„ ์—ฐ๊ฒฐ<br>๋‚ด๊ฐ€ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์„์ง€ ์ œ์‹œ | "์ด ํšŒ์‚ฌ์—์„œ ์ด ํŠธ๋ Œ๋“œ๋ฅผ ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•  ๊ฒƒ์ธ๊ฐ€" |
216
+ ```
217
+
218
+ ### ์ถ”๋ก 
219
+ ์งˆ๋ฌธ: {question}
220
+ Job Description: {jd}
221
+ ํšŒ์‚ฌ ์ด๋ฆ„: {company_name}
222
+ ๊ฒฝ๋ ฅ ์ˆ˜์ค€: {experience_level}
223
+ ๋Œ€ํ™” ๋‚ด์šฉ: {conversation}
224
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
answer_flow_generation/test.py ADDED
@@ -0,0 +1,160 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import random
3
+ import datetime
4
+ import json
5
+ import multiprocessing
6
+ import sys
7
+ from tqdm import tqdm
8
+
9
+ # ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ utils.py๋ฅผ importํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๋กœ ์ถ”๊ฐ€
10
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
11
+ from utils import track_api_cost
12
+ from llm_functions import generate_answer_flow
13
+
14
+ # ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋กœ๋“œ (ํ•„์š”์‹œ)
15
+ try:
16
+ from dotenv import load_dotenv
17
+ load_dotenv()
18
+ except ImportError:
19
+ pass
20
+
21
+ # ์˜ˆ์ œ ๋ฐ์ดํ„ฐ
22
+ example_companies = ["์‚ผ์„ฑ์ „์ž", "์นด์นด์˜ค", "๋„ค์ด๋ฒ„", "์ฟ ํŒก", "ํ† ์Šค", "ํ˜„๋Œ€์ž๋™์ฐจ", "CJ์ œ์ผ์ œ๋‹น", "ํ•˜์ด๋ธŒ"]
23
+ example_jobs_jds = {
24
+ "๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž": "Spring Boot, JPA, MySQL ๊ฒฝํ—˜์ž. MSA ํ™˜๊ฒฝ ๊ฒฝํ—˜ ์šฐ๋Œ€. ํด๋ผ์šฐ๋“œ(AWS) ํ™˜๊ฒฝ ๋ฐฐํฌ ๋ฐ ์šด์˜ ๊ฒฝํ—˜์ž.",
25
+ "ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž": "React, TypeScript, Redux ์‚ฌ์šฉ. ๋ฐ˜์‘ํ˜• ์›น ๊ฐœ๋ฐœ ๊ฒฝํ—˜ ํ•„์ˆ˜. UI/UX์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ๋†’์€ ๋ถ„.",
26
+ "๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€": "SQL, Python(Pandas, Scikit-learn) ํ™œ์šฉ ๋Šฅ๋ ฅ. ํ†ต๊ณ„์  ์ง€์‹๊ณผ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”(Tableau ๋“ฑ) ๋Šฅ๋ ฅ.",
27
+ "ํ”„๋กœ๋•ํŠธ ๋งค๋‹ˆ์ €(PM)": "IT ํ”„๋กœ๋•ํŠธ ๊ธฐํš ๋ฐ ๊ด€๋ฆฌ ๊ฒฝํ—˜. ์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ ์ž‘์„ฑ, ๋ฐฑ๋กœ๊ทธ ๊ด€๋ฆฌ. ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ • ๋Šฅ๋ ฅ.",
28
+ "๋งˆ์ผ€ํ„ฐ": "๋””์ง€ํ„ธ ๋งˆ์ผ€ํŒ…(SA, DA, SEO) ๊ฒฝํ—˜. ์ฝ˜ํ…์ธ  ๊ธฐํš ๋ฐ ์ œ์ž‘, ์„ฑ๊ณผ ๋ถ„์„. SNS ์ฑ„๋„ ์šด์˜ ๊ฒฝํ—˜."
29
+ }
30
+ example_questions = {
31
+ "์ง€์›๋™๊ธฐ": "{company_name}์— ์ง€์›ํ•œ ๋™๊ธฐ์— ๋Œ€ํ•ด ๊ธฐ์ˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค.",
32
+ "์„ฑ์žฅ๊ณผ์ •": "๋ณธ์ธ์˜ ์„ฑ์žฅ๊ณผ์ •์„ ๊ฐ„๋žตํžˆ ๊ธฐ์ˆ ํ•˜๋˜ ํ˜„์žฌ์˜ ์ž์‹ ์—๊ฒŒ ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ผ์นœ ์‚ฌ๊ฑด, ์ธ๋ฌผ ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ๊ธฐ์ˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค.",
33
+ "์ง๋ฌด์—ญ๋Ÿ‰": "{job_title} ์ง๋ฌด ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ์—ญ๋Ÿ‰์€ ๋ฌด์—‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ์ด๋ฅผ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•ด์™”๋Š”์ง€ ๊ธฐ์ˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค.",
34
+ "์ž…์‚ฌํ›„ํฌ๋ถ€": "์ž…์‚ฌ ํ›„ 10๋…„ ๋™์•ˆ์˜ ํšŒ์‚ฌ์ƒํ™œ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๊ทธ๊ฒƒ์„ ์ถ”๊ตฌํ•˜๋Š” ์ด์œ ๋ฅผ ๊ธฐ์ˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค."
35
+ }
36
+ experience_levels = ["์‹ ์ž…", "๊ฒฝ๋ ฅ", "์ธํ„ด"]
37
+ example_conversations = [
38
+ "User: ์•ˆ๋…•ํ•˜์„ธ์š”, ์ž๊ธฐ์†Œ๊ฐœ์„œ ์ปจ์„คํŒ…์„ ๋ฐ›๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.\nAI: ๋„ค, ์–ด๋–ค ์ง๋ฌด์™€ ํšŒ์‚ฌ์— ์ง€์›ํ•˜์‹œ๋‚˜์š”?\nUser: ์ฟ ํŒก์˜ PM ์ง๋ฌด์ž…๋‹ˆ๋‹ค. ์ œ ๊ฐ•์ ์€ ๋ฐ์ดํ„ฐ ๋ถ„์„ ๋Šฅ๋ ฅ์ž…๋‹ˆ๋‹ค.",
39
+ "User: ์„ฑ์žฅ๊ณผ์ • ํ•ญ๋ชฉ์€ ์–ด๋–ป๊ฒŒ ์“ฐ๋Š” ๊ฒŒ ์ข‹์„๊นŒ์š”?\nAI: ์ง๋ฌด์™€ ๊ด€๋ จ๋œ ๊ฒฝํ—˜์„ ์ค‘์‹ฌ์œผ๋กœ, ๊ทธ ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ฌด์—‡์„ ๋ฐฐ์šฐ๊ณ  ์–ด๋–ป๊ฒŒ ์„ฑ์žฅํ–ˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์ธ ์‚ฌ๋ก€๋ฅผ ๋“ค์–ด ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.",
40
+ "User: ์ œ ๊ฒฝํ—˜ ์ค‘ ์–ด๋–ค ๊ฒƒ์„ ๊ฐ•์กฐํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๊ฒ ์–ด์š”.\nAI: ์ง€์›ํ•˜์‹œ๋Š” ์ง๋ฌด์˜ JD(์ง๋ฌด๊ธฐ์ˆ ์„œ)๋ฅผ ๋ณด๋ฉด ์–ด๋–ค ์—ญ๋Ÿ‰์„ ์ค‘์š”ํ•˜๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ์™€ ๊ด€๋ จ๋œ ๊ฒฝํ—˜์„ ์šฐ์„ ์ ์œผ๋กœ ์–ดํ•„ํ•ด๋ณด์„ธ์š”."
41
+ ]
42
+
43
+ NUM_TESTS = 100
44
+ NUM_PROCESSES = 10
45
+ MODEL_NAME = "gpt-4o-mini"
46
+
47
+ def run_test(test_input_with_id):
48
+ """๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์›Œ์ปค ํ•จ์ˆ˜"""
49
+ test_id, test_input = test_input_with_id
50
+ total_cost = 0
51
+ error_message = ""
52
+ status = "โœ… Success"
53
+
54
+ try:
55
+ parsed_flow, response = generate_answer_flow(**test_input)
56
+
57
+ if response and hasattr(response, 'usage'):
58
+ total_cost = track_api_cost(response, MODEL_NAME, None)
59
+
60
+ if "error" in parsed_flow or "flow" not in parsed_flow or not parsed_flow["flow"]:
61
+ status = "โŒ Failure"
62
+ error_message = str(parsed_flow.get("error", "Invalid flow format"))
63
+
64
+ return {
65
+ "id": test_id,
66
+ "input": test_input,
67
+ "parsed_result": parsed_flow,
68
+ "error": error_message,
69
+ "cost": total_cost,
70
+ "status": status,
71
+ }
72
+ except Exception as e:
73
+ return {
74
+ "id": test_id,
75
+ "input": test_input,
76
+ "parsed_result": {},
77
+ "error": f"Exception: {str(e)}",
78
+ "cost": total_cost,
79
+ "status": "โŒ Error"
80
+ }
81
+
82
+ def main():
83
+ """ํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„, ์‹คํ–‰ํ•˜๊ณ  ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์ธ ํ•จ์ˆ˜"""
84
+ print(f"์ด {NUM_TESTS}๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋ฅผ {NUM_PROCESSES}๊ฐœ ํ”„๋กœ์„ธ์Šค๋กœ ๋ณ‘๋ ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค...")
85
+
86
+ test_inputs = []
87
+ for i in range(NUM_TESTS):
88
+ company = random.choice(example_companies)
89
+ job_title, jd = random.choice(list(example_jobs_jds.items()))
90
+ question_template = random.choice(list(example_questions.values()))
91
+ question = question_template.format(company_name=company, job_title=job_title)
92
+ experience = random.choice(experience_levels)
93
+ conversation = random.choice(example_conversations)
94
+
95
+ test_input = {
96
+ "company_name": company,
97
+ "jd": jd,
98
+ "question": question,
99
+ "experience_level": experience,
100
+ "conversation": conversation
101
+ }
102
+ test_inputs.append((i + 1, test_input))
103
+
104
+ results = []
105
+ with multiprocessing.Pool(processes=NUM_PROCESSES) as pool:
106
+ with tqdm(total=NUM_TESTS, desc="๋‹ต๋ณ€ ํ๋ฆ„ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ") as pbar:
107
+ for result in pool.imap_unordered(run_test, test_inputs):
108
+ results.append(result)
109
+ pbar.update()
110
+
111
+ results.sort(key=lambda x: x['id'])
112
+ print("๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
113
+
114
+ now = datetime.datetime.now()
115
+ report_filename = f"answer_flow_report_{now.strftime('%Y%m%d_%H%M%S')}.html"
116
+
117
+ failure_count = sum(1 for r in results if "Success" not in r["status"])
118
+ total_cost = sum(r['cost'] for r in results)
119
+ failure_rate = (failure_count / NUM_TESTS) * 100 if NUM_TESTS > 0 else 0
120
+
121
+ html_template = """
122
+ <!DOCTYPE html><html lang="ko"><head><meta charset="UTF-8"><title>๋‹ต๋ณ€ ํ๋ฆ„ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ ๋ณด๊ณ ์„œ</title>
123
+ <style>body{{font-family:sans-serif;margin:20px;}} h1,h2{{text-align:center;}} .summary{{border:1px solid #ddd;padding:20px;margin-bottom:20px;}} table{{width:100%;border-collapse:collapse;}} th,td{{border:1px solid #ddd;padding:8px;text-align:left;vertical-align:top;}} th{{background-color:#f2f2f2;}} .status-success{{color:green;font-weight:bold;}} .status-failure{{color:red;font-weight:bold;}} pre{{white-space:pre-wrap;word-wrap:break-word;background-color:#f9f9f9;padding:10px;border:1px solid #ddd;}} .container{{max-width:1400px;margin:auto;}}</style>
124
+ </head><body><div class="container"><h1>๋‹ต๋ณ€ ํ๋ฆ„ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ ๋ณด๊ณ ์„œ</h1><div class="summary"><h2>์š”์•ฝ</h2><p><strong>ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„:</strong> {now}</p><p><strong>์ด ํ…Œ์ŠคํŠธ ์ˆ˜:</strong> {total_tests}</p><p><strong>์„ฑ๊ณต:</strong> {success_count}</p><p><strong>์‹คํŒจ/์—๋Ÿฌ:</strong> {failure_count}</p><p><strong>์‹คํŒจ์œจ:</strong> <span class="{status_class}">{failure_rate:.2f}%</span></p><p><strong>์ด ์˜ˆ์ƒ ๋น„์šฉ:</strong> ${total_cost:.6f}</p></div>
125
+ <h2>์ƒ์„ธ ๊ฒฐ๊ณผ</h2><table><thead><tr><th>ID</th><th>์ž…๋ ฅ (Input)</th><th>ํŒŒ์‹ฑ ๊ฒฐ๊ณผ (Parsed)</th><th>์—๋Ÿฌ</th><th>๋น„์šฉ</th><th>์ƒํƒœ</th></tr></thead><tbody>{table_rows}</tbody></table></div></body></html>
126
+ """
127
+
128
+ table_rows_html = ""
129
+ for res in results:
130
+ status_class = "status-success" if "Success" in res["status"] else "status-failure"
131
+ table_rows_html += f"""
132
+ <tr>
133
+ <td>{res['id']}</td>
134
+ <td><pre>{json.dumps(res['input'], indent=2, ensure_ascii=False)}</pre></td>
135
+ <td><pre>{json.dumps(res['parsed_result'], indent=2, ensure_ascii=False)}</pre></td>
136
+ <td><pre>{res['error']}</pre></td>
137
+ <td>${res['cost']:.6f}</td>
138
+ <td class="{status_class}">{res['status']}</td>
139
+ </tr>
140
+ """
141
+
142
+ final_html = html_template.format(
143
+ now=now.strftime('%Y-%m-%d %H:%M:%S'),
144
+ total_tests=NUM_TESTS,
145
+ success_count=NUM_TESTS - failure_count,
146
+ failure_count=failure_count,
147
+ status_class="status-success" if failure_rate < 10 else "status-failure",
148
+ failure_rate=failure_rate,
149
+ total_cost=total_cost,
150
+ table_rows=table_rows_html
151
+ )
152
+
153
+ with open(report_filename, "w", encoding="utf-8") as f:
154
+ f.write(final_html)
155
+
156
+ print(f"'{report_filename}' ํŒŒ์ผ๋กœ ๋ณด๊ณ ์„œ๊ฐ€ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
157
+ print(f"์ด ์˜ˆ์ƒ ๋น„์šฉ: ${total_cost:.6f}")
158
+
159
+ if __name__ == "__main__":
160
+ main()
app.py ADDED
@@ -0,0 +1,281 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+
4
+ # Force the project root onto the path
5
+ project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
6
+ if project_root not in sys.path:
7
+ sys.path.insert(0, project_root)
8
+
9
+ from dotenv import load_dotenv
10
+ import gradio as gr
11
+ import yaml
12
+ import json
13
+ import re
14
+ from chat.llm_functions import get_interviewer_response, get_student_response, generate_cover_letter_response
15
+ from utils import parse_json_from_response
16
+ from guide_generation.llm_functions import generate_guide as create_guide_from_llm
17
+ from answer_flow_generation.llm_functions import generate_answer_flow
18
+
19
+
20
+ # Load environment variables and initial data
21
+ load_dotenv()
22
+
23
+ # with open("prompt.yaml", "r", encoding='utf-8') as f:
24
+ # prompts = yaml.safe_load(f)
25
+
26
+ with open("example_info.json", "r", encoding='utf-8') as f:
27
+ # This now serves as the default values for the UI
28
+ default_info = json.load(f)
29
+ # word_limit ๊ธฐ๋ณธ๊ฐ’ ์ถ”๊ฐ€
30
+ if 'word_limit' not in default_info:
31
+ default_info['word_limit'] = 300
32
+
33
+ def user_submit(message, history):
34
+ """์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ฑ—๋ด‡ ๊ธฐ๋ก์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค."""
35
+ if not message.strip():
36
+ return "", history
37
+ history.append([message, None])
38
+ return "", history
39
+
40
+ def bot_response(history, shared_info, progress=gr.Progress()):
41
+ """๋ฉด์ ‘๊ด€์˜ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๊ณ  ์ง„ํ–‰๋ฅ ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค."""
42
+ if not history or history[-1][1] is not None:
43
+ return history, gr.update(), gr.update()
44
+
45
+ conversation_str = ""
46
+ for h in history:
47
+ conversation_str += f"ํ•™์ƒ: {h[0]}\n"
48
+ if h[1]:
49
+ conversation_str += f"AI: {h[1]}\n"
50
+
51
+ format_info = shared_info.copy()
52
+ format_info['conversation'] = conversation_str
53
+ # word_limit ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • (ํ˜น์‹œ ์—†์„ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„)
54
+ if 'word_limit' not in format_info:
55
+ format_info['word_limit'] = 300
56
+
57
+ history[-1][1] = ""
58
+ full_response = ""
59
+ for chunk in get_interviewer_response(format_info):
60
+ full_response += chunk
61
+ history[-1][1] = full_response
62
+ yield history, gr.update(), gr.update()
63
+
64
+ final_data = parse_json_from_response(full_response)
65
+ final_progress_update = gr.update()
66
+ final_reason_update = gr.update()
67
+ if final_data:
68
+ history[-1][1] = final_data.get("answer", "์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.")
69
+ final_progress = final_data.get("progress", 0)
70
+ reasoning = final_data.get("reasoning_for_progress", "")
71
+
72
+ if isinstance(final_progress, int) and 0 <= final_progress <= 100:
73
+ progress(final_progress / 100)
74
+ final_progress_update = f"์ž๊ธฐ์†Œ๊ฐœ์„œ ์™„์„ฑ๋„: {final_progress}%"
75
+ if reasoning:
76
+ final_reason_update = gr.update(value=f"**์ง„ํ–‰ ์ƒํ™ฉ ๋ถ„์„:** {reasoning}", visible=True)
77
+ else:
78
+ final_reason_update = gr.update(visible=False)
79
+
80
+ if final_progress >= 100:
81
+ history.append([None, "๋ฉด์ ‘์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ ํƒญ์œผ๋กœ ์ด๋™ํ•˜์„ธ์š”."])
82
+
83
+ yield history, final_progress_update, final_reason_update
84
+
85
+
86
+ def generate_ai_reply(history, shared_info, progress=gr.Progress()):
87
+ """ํ•™์ƒ์˜ AI ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ์— ๋Œ€ํ•œ ๋ฉด์ ‘๊ด€์˜ ํ›„์† ์งˆ๋ฌธ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค."""
88
+ if not history or not history[-1][1]:
89
+ return history, gr.update(), gr.update()
90
+
91
+ conversation_str = ""
92
+ for h in history:
93
+ conversation_str += f"ํ•™์ƒ: {h[0]}\n"
94
+ if h[1]:
95
+ conversation_str += f"AI: {h[1]}\n"
96
+
97
+ format_info = shared_info.copy()
98
+ format_info['conversation'] = conversation_str
99
+ # word_limit ๊ธฐ๋ณธ๊ฐ’ ์„ค์ • (ํ˜น์‹œ ์—†์„ ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„)
100
+ if 'word_limit' not in format_info:
101
+ format_info['word_limit'] = 300
102
+
103
+ student_answer_json = ""
104
+ history.append(["", None])
105
+ for chunk in get_student_response(format_info):
106
+ student_answer_json += chunk
107
+ parsed_data = parse_json_from_response(student_answer_json)
108
+ if parsed_data:
109
+ history[-1][0] = parsed_data.get("answer", "")
110
+ else:
111
+ history[-1][0] = student_answer_json
112
+ yield history, gr.update(), gr.update()
113
+
114
+ final_data = parse_json_from_response(student_answer_json)
115
+ if final_data:
116
+ history[-1][0] = final_data.get("answer", "์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.")
117
+ yield history, gr.update(), gr.update()
118
+
119
+ yield from bot_response(history, shared_info, progress=progress)
120
+
121
+ def generate_all_cover_letters(history, shared_info, progress=gr.Progress()):
122
+ """๋ชจ๋“  ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋ฌธํ•ญ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๊ณ  ์ง„ํ–‰๋ฅ ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค."""
123
+ if not history:
124
+ empty_outputs = [gr.update(value="๋ฉด์ ‘ ๋Œ€ํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")] * len(shared_info.get('questions', []))
125
+ empty_guidelines = [gr.update(value="")] * len(shared_info.get('questions', []))
126
+ return empty_outputs + empty_guidelines + [gr.update()]
127
+
128
+ # history -> conversation_history ํ˜•์‹ ๋ณ€ํ™˜
129
+ conversation_str = ""
130
+ for h in history:
131
+ if h[0]: conversation_str += f"ํ•™์ƒ: {h[0]}\n"
132
+ if h[1]: conversation_str += f"AI: {h[1]}\n"
133
+
134
+ total_questions = len(shared_info.get('questions', []))
135
+ outputs = [""] * total_questions
136
+ guidelines = [""] * total_questions
137
+
138
+ format_info = shared_info.copy()
139
+ format_info['conversation'] = conversation_str
140
+
141
+ for i, question in enumerate(shared_info.get('questions', [])):
142
+ # 1๋‹จ๊ณ„: Answer Flow Generation
143
+ progress_text = f"์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ ์ง„ํ–‰๋ฅ : {int((i / total_questions) * 50)}% (๋‹ต๋ณ€ ํ๋ฆ„ ์ƒ์„ฑ ์ค‘...)"
144
+ yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True)]
145
+
146
+ flow_result, _ = generate_answer_flow(
147
+ question=question,
148
+ jd=format_info.get('jd', ''),
149
+ company_name=format_info.get('company_name', ''),
150
+ experience_level=format_info.get('experience_level', '์‹ ์ž…'),
151
+ conversation=conversation_str
152
+ )
153
+
154
+ flow_text = flow_result.get('flow', '') if flow_result else ''
155
+ guidelines[i] = flow_text # ๊ฐ€์ด๋“œ๋ผ์ธ ์ €์žฅ
156
+
157
+ # 2๋‹จ๊ณ„: Cover Letter Response Generation
158
+ progress_text = f"์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ ์ง„ํ–‰๋ฅ : {int((i / total_questions) * 50 + 25)}% (๋‹ต๋ณ€ ์ƒ์„ฑ ์ค‘...)"
159
+ yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True)]
160
+
161
+ full_response = ""
162
+ word_limit = shared_info.get('word_limit', 300) # shared_info์—์„œ word_limit ๊ฐ€์ ธ์˜ค๊ธฐ
163
+ for chunk in generate_cover_letter_response(question, [], format_info, flow_text, word_limit):
164
+ full_response += chunk
165
+ parsed_data = parse_json_from_response(full_response)
166
+ if parsed_data and 'answer' in parsed_data:
167
+ outputs[i] = parsed_data['answer']
168
+ else:
169
+ outputs[i] = full_response
170
+
171
+ overall_progress_val = (i + 0.75) / total_questions
172
+ progress_text = f"์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ ์ง„ํ–‰๋ฅ : {int(overall_progress_val*100)}%"
173
+ yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(value=progress_text, visible=True)]
174
+
175
+ # ์ตœ์ข… ํŒŒ์‹ฑ
176
+ final_data = parse_json_from_response(full_response)
177
+ if final_data and 'answer' in final_data:
178
+ outputs[i] = final_data['answer']
179
+
180
+ # ์™„๋ฃŒ
181
+ yield [gr.update(value=o) for o in outputs] + [gr.update(value=g) for g in guidelines] + [gr.update(visible=False)]
182
+
183
+ def update_guide_and_info(company, position, jd, questions_str, word_limit):
184
+ guide_json, _ = create_guide_from_llm(questions_str, jd, company, "์‹ ์ž…") # experience_level is hardcoded for now
185
+
186
+ if guide_json and "guide" in guide_json:
187
+ guide_text = guide_json["guide"]
188
+ else:
189
+ guide_text = "๊ฐ€์ด๋“œ ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ๊ฐ’์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
190
+
191
+ new_info = default_info.copy()
192
+ new_info.update({
193
+ "company_name": company,
194
+ "position_title": position,
195
+ "jd": jd,
196
+ "questions": [q.strip() for q in questions_str.strip().split('\n') if q.strip()],
197
+ "guide": guide_text,
198
+ "word_limit": word_limit
199
+ })
200
+
201
+ # Return new state and update for the guide display
202
+ return new_info, guide_text
203
+
204
+ # --- Gradio UI ---
205
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
206
+ shared_info = gr.State(default_info)
207
+
208
+ with gr.Tabs() as tabs:
209
+ with gr.TabItem("๊ฐ€์ด๋“œ ์ƒ์„ฑ", id=0):
210
+ gr.Markdown("## ๐Ÿ“ ์ž๊ธฐ์†Œ๊ฐœ์„œ ์ •๋ณด ์ž…๋ ฅ")
211
+ gr.Markdown("๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  '๊ฐ€์ด๋“œ ์ƒ์„ฑ' ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”.")
212
+ with gr.Row():
213
+ company_name_input = gr.Textbox(label="ํšŒ์‚ฌ๋ช…", value=default_info.get("company_name"))
214
+ position_title_input = gr.Textbox(label="์ง๋ฌด๋ช…", value=default_info.get("position_title"))
215
+ jd_input = gr.Textbox(label="Job Description (JD)", lines=5, value=default_info.get("jd"))
216
+ questions_input = gr.Textbox(label="์ž๊ธฐ์†Œ๊ฐœ์„œ ์งˆ๋ฌธ (ํ•œ ์ค„์— ํ•œ ๊ฐœ์”ฉ)", lines=3, value="\n".join(default_info.get("questions", [])))
217
+
218
+ with gr.Row():
219
+ word_limit_input = gr.Number(
220
+ label="์ž๊ธฐ์†Œ๊ฐœ์„œ ๊ธ€์ž์ˆ˜ ์ œํ•œ",
221
+ value=300,
222
+ minimum=100,
223
+ maximum=1000,
224
+ step=50,
225
+ info="์ž๊ธฐ์†Œ๊ฐœ์„œ ๊ฐ ๋ฌธํ•ญ๋ณ„ ๊ธ€์ž์ˆ˜ ์ œํ•œ์„ ์„ค์ •ํ•˜์„ธ์š”."
226
+ )
227
+
228
+ generate_guide_btn = gr.Button("๊ฐ€์ด๋“œ ์ƒ์„ฑ", variant="primary")
229
+ guide_output = gr.Markdown(label="์ƒ์„ฑ๋œ ๏ฟฝ๏ฟฝ์ด๋“œ", value=f"**๊ฐ€์ด๋“œ:**\n{default_info.get('guide')}")
230
+
231
+ with gr.TabItem("๋ฉด์ ‘ ๋Œ€ํ™”", id=1):
232
+ gr.Markdown("## ๐Ÿ’ฌ ๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜")
233
+ gr.Markdown("๋ฉด์ ‘๊ด€์˜ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜๊ฑฐ๋‚˜, 'AI ๋‹ต๋ณ€ ์ƒ์„ฑ' ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”. ๋ฉด์ ‘๊ด€์ด ํŒ๋‹จํ•˜๋Š” ์ž๊ธฐ์†Œ๊ฐœ์„œ ์™„์„ฑ๋„๊ฐ€ 100%๊ฐ€ ๋˜๋ฉด ๋ฉด์ ‘์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.")
234
+
235
+ with gr.Row():
236
+ progress_display = gr.Markdown("์ž๊ธฐ์†Œ๊ฐœ์„œ ์™„์„ฑ๋„: 0%")
237
+ reason_display = gr.Markdown("", visible=False)
238
+ chatbot = gr.Chatbot(label="๋ฉด์ ‘ ๋Œ€ํ™”", bubble_full_width=False, avatar_images=("๐Ÿ‘ค", "๐Ÿ‘”"), height=500)
239
+ msg = gr.Textbox(label="๋ฉ”์‹œ์ง€ ์ž…๋ ฅ", placeholder="๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”...", lines=2)
240
+ with gr.Row():
241
+ submit_btn = gr.Button("์ „์†ก", variant="primary")
242
+ ai_reply_btn = gr.Button("AI ๋‹ต๋ณ€ ์ƒ์„ฑ", variant="secondary")
243
+ clear_btn = gr.Button("์ดˆ๊ธฐํ™”")
244
+
245
+ with gr.TabItem("์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ", id=2):
246
+ gr.Markdown("## ๐Ÿ“ ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋‹ต๋ณ€ ์ƒ์„ฑ")
247
+ gr.Markdown("๋ฉด์ ‘์ด ์™„๋ฃŒ๋˜๋ฉด ๋Œ€ํ™” ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.")
248
+
249
+ generate_btn = gr.Button("์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ ์‹œ์ž‘", variant="primary", size="lg")
250
+ cover_letter_progress_display = gr.Markdown("", visible=False)
251
+
252
+ cover_letter_outputs = []
253
+ guideline_outputs = []
254
+ for i, question in enumerate(default_info.get('questions', [])):
255
+ with gr.Accordion(f"๋ฌธํ•ญ {i+1}: {question[:50]}...", open=True):
256
+ gr.Markdown(f"**{question}**")
257
+
258
+ with gr.Tabs():
259
+ with gr.TabItem("์ƒ์„ฑ๋œ ๋‹ต๋ณ€"):
260
+ output = gr.Textbox(label=f"๋‹ต๋ณ€ {i+1}", lines=8, interactive=False)
261
+ cover_letter_outputs.append(output)
262
+
263
+ with gr.TabItem("๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ"):
264
+ guideline = gr.Markdown(value="๊ฐ€์ด๋“œ๋ผ์ธ์ด ์ƒ์„ฑ๋˜๋ฉด ์—ฌ๊ธฐ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.")
265
+ guideline_outputs.append(guideline)
266
+
267
+ # Event Handlers
268
+ generate_guide_btn.click(
269
+ fn=update_guide_and_info,
270
+ inputs=[company_name_input, position_title_input, jd_input, questions_input, word_limit_input],
271
+ outputs=[shared_info, guide_output]
272
+ )
273
+
274
+ submit_btn.click(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display, reason_display])
275
+ msg.submit(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display, reason_display])
276
+ ai_reply_btn.click(generate_ai_reply, [chatbot, shared_info], [chatbot, progress_display, reason_display])
277
+ clear_btn.click(lambda: ([], "์ž๊ธฐ์†Œ๊ฐœ์„œ ์™„์„ฑ๋„: 0%", ""), None, [chatbot, progress_display, reason_display], queue=False)
278
+ generate_btn.click(generate_all_cover_letters, [chatbot, shared_info], cover_letter_outputs + guideline_outputs + [cover_letter_progress_display])
279
+
280
+ if __name__ == "__main__":
281
+ demo.launch(share=True)
chat/.gradio/certificate.pem ADDED
@@ -0,0 +1,31 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ -----BEGIN CERTIFICATE-----
2
+ MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
3
+ TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
4
+ cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
5
+ WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
6
+ ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
7
+ MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
8
+ h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
9
+ 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
10
+ A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
11
+ T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
12
+ B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
13
+ B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
14
+ KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
15
+ OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
16
+ jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
17
+ qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
18
+ rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
19
+ HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
20
+ hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
21
+ ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
22
+ 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
23
+ NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
24
+ ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
25
+ TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
26
+ jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
27
+ oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
28
+ 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
29
+ mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
30
+ emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
31
+ -----END CERTIFICATE-----
chat/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ # This file can be empty. It marks the directory as a Python package.
chat/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (149 Bytes). View file
 
chat/__pycache__/llm_functions.cpython-312.pyc ADDED
Binary file (4.9 kB). View file
 
chat/__pycache__/main.cpython-312.pyc ADDED
Binary file (13.4 kB). View file
 
chat/app.py ADDED
@@ -0,0 +1,217 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import sys
3
+
4
+ # Force the project root onto the path
5
+ project_root = os.path.abspath(os.path.join(os.path.dirname(__file__), '..'))
6
+ if project_root not in sys.path:
7
+ sys.path.insert(0, project_root)
8
+
9
+ from dotenv import load_dotenv
10
+ import gradio as gr
11
+ import yaml
12
+ import json
13
+ import re
14
+ from llm_functions import get_interviewer_response, get_student_response, generate_cover_letter_response
15
+ from utils import parse_json_from_response
16
+ from guide_generation.llm_functions import generate_guide as create_guide_from_llm
17
+
18
+
19
+ # Load environment variables and initial data
20
+ load_dotenv()
21
+
22
+ with open("prompt.yaml", "r", encoding='utf-8') as f:
23
+ prompts = yaml.safe_load(f)
24
+
25
+ with open("example_info.json", "r", encoding='utf-8') as f:
26
+ # This now serves as the default values for the UI
27
+ default_info = json.load(f)
28
+
29
+ def user_submit(message, history):
30
+ """์‚ฌ์šฉ์ž ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๊ณ , ์ฑ—๋ด‡ ๊ธฐ๋ก์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค."""
31
+ if not message.strip():
32
+ return "", history
33
+ history.append([message, None])
34
+ return "", history
35
+
36
+ def bot_response(history, shared_info, progress=gr.Progress()):
37
+ """๋ฉด์ ‘๊ด€์˜ ์‘๋‹ต์„ ์ƒ์„ฑํ•˜๊ณ  ์ง„ํ–‰๋ฅ ์„ ์—…๋ฐ์ดํŠธํ•ฉ๋‹ˆ๋‹ค."""
38
+ if not history or history[-1][1] is not None:
39
+ return history, gr.update()
40
+
41
+ conversation_str = ""
42
+ for h in history:
43
+ conversation_str += f"ํ•™์ƒ: {h[0]}\n"
44
+ if h[1]:
45
+ conversation_str += f"AI: {h[1]}\n"
46
+
47
+ format_info = shared_info.copy()
48
+ format_info['conversation'] = conversation_str
49
+
50
+ history[-1][1] = ""
51
+ full_response = ""
52
+ for chunk in get_interviewer_response(format_info):
53
+ full_response += chunk
54
+ history[-1][1] = full_response
55
+ yield history, gr.update()
56
+
57
+ final_data = parse_json_from_response(full_response)
58
+ final_progress_update = gr.update()
59
+ if final_data:
60
+ history[-1][1] = final_data.get("answer", "์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.")
61
+ final_progress = final_data.get("progress", 0)
62
+ if isinstance(final_progress, int) and 0 <= final_progress <= 100:
63
+ progress(final_progress / 100)
64
+ final_progress_update = f"์ž๊ธฐ์†Œ๊ฐœ์„œ ์™„์„ฑ๋„: {final_progress}%"
65
+
66
+ if final_progress >= 100:
67
+ history.append([None, "๋ฉด์ ‘์ด ์ข…๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ ํƒญ์œผ๋กœ ์ด๋™ํ•˜์„ธ์š”."])
68
+
69
+ yield history, final_progress_update
70
+
71
+
72
+ def generate_ai_reply(history, shared_info, progress=gr.Progress()):
73
+ """ํ•™์ƒ์˜ AI ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๊ณ , ๊ทธ์— ๋Œ€ํ•œ ๋ฉด์ ‘๊ด€์˜ ํ›„์† ์งˆ๋ฌธ์„ ๋ฐ›์Šต๋‹ˆ๋‹ค."""
74
+ if not history or not history[-1][1]:
75
+ return history, gr.update()
76
+
77
+ conversation_str = ""
78
+ for h in history:
79
+ conversation_str += f"ํ•™์ƒ: {h[0]}\n"
80
+ if h[1]:
81
+ conversation_str += f"AI: {h[1]}\n"
82
+
83
+ format_info = shared_info.copy()
84
+ format_info['conversation'] = conversation_str
85
+
86
+ student_answer_json = ""
87
+ history.append(["", None])
88
+ for chunk in get_student_response(format_info):
89
+ student_answer_json += chunk
90
+ parsed_data = parse_json_from_response(student_answer_json)
91
+ if parsed_data:
92
+ history[-1][0] = parsed_data.get("answer", "")
93
+ else:
94
+ history[-1][0] = student_answer_json
95
+ yield history, gr.update()
96
+
97
+ final_data = parse_json_from_response(student_answer_json)
98
+ if final_data:
99
+ history[-1][0] = final_data.get("answer", "์‘๋‹ต์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.")
100
+ yield history, gr.update()
101
+
102
+ yield from bot_response(history, shared_info, progress=progress)
103
+
104
+ def generate_all_cover_letters(history, shared_info, word_limit, progress=gr.Progress()):
105
+ """๋ชจ๋“  ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋ฌธํ•ญ์— ๋Œ€ํ•œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•˜๊ณ  ์ง„ํ–‰๋ฅ ์„ ํ‘œ์‹œํ•ฉ๋‹ˆ๋‹ค."""
106
+ if not history:
107
+ yield [gr.update(value="๋ฉด์ ‘ ๋Œ€ํ™”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.")] * len(shared_info.get('questions', [])) + [gr.update()]
108
+ return
109
+
110
+ conversation_str = ""
111
+ for h in history:
112
+ if h[0]: conversation_str += f"ํ•™์ƒ: {h[0]}\n"
113
+ if h[1]: conversation_str += f"AI: {h[1]}\n"
114
+
115
+ total_questions = len(shared_info.get('questions', []))
116
+ outputs = [""] * total_questions
117
+
118
+ format_info = shared_info.copy()
119
+ format_info['conversation'] = conversation_str
120
+
121
+ for i, question in enumerate(shared_info.get('questions', [])):
122
+ full_response = ""
123
+ flow = shared_info.get('guide', '')
124
+ for chunk in generate_cover_letter_response(question, [], format_info, flow, word_limit):
125
+ full_response += chunk
126
+ parsed_data = parse_json_from_response(full_response)
127
+ if parsed_data and 'answer' in parsed_data:
128
+ outputs[i] = parsed_data['answer']
129
+ else:
130
+ outputs[i] = full_response # Fallback to full response
131
+
132
+ overall_progress_val = (i + 1) / total_questions
133
+ progress(overall_progress_val)
134
+ progress_text = f"์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ ์ง„ํ–‰๋ฅ : {int(overall_progress_val*100)}%"
135
+ yield [gr.update(value=o) for o in outputs] + [gr.update(value=progress_text, visible=True)]
136
+
137
+ final_outputs = []
138
+ for o in outputs:
139
+ final_data = parse_json_from_response(o)
140
+ if final_data and 'answer' in final_data:
141
+ final_outputs.append(gr.update(value=final_data['answer']))
142
+ else:
143
+ final_outputs.append(gr.update(value=o))
144
+
145
+ yield final_outputs + [gr.update(visible=False)]
146
+
147
+ def update_guide_and_info(company, position, jd, questions_str):
148
+ guide_json, _ = create_guide_from_llm(questions_str, jd, company, "์‹ ์ž…") # experience_level is hardcoded for now
149
+
150
+ if guide_json and "guide" in guide_json:
151
+ guide_text = guide_json["guide"]
152
+ else:
153
+ guide_text = "๊ฐ€์ด๋“œ ์ƒ์„ฑ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ๊ฐ’์„ ํ™•์ธํ•ด์ฃผ์„ธ์š”."
154
+
155
+ new_info = default_info.copy()
156
+ new_info.update({
157
+ "company_name": company,
158
+ "position_title": position,
159
+ "jd": jd,
160
+ "questions": [q.strip() for q in questions_str.strip().split('\n') if q.strip()],
161
+ "guide": guide_text
162
+ })
163
+
164
+ # Return new state and update for the guide display
165
+ return new_info, guide_text
166
+
167
+ # --- Gradio UI ---
168
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
169
+ shared_info = gr.State(default_info)
170
+
171
+ with gr.Tabs() as tabs:
172
+ with gr.TabItem("๊ฐ€์ด๋“œ ์ƒ์„ฑ", id=0):
173
+ gr.Markdown("## ๐Ÿ“ ์ž๊ธฐ์†Œ๊ฐœ์„œ ์ •๋ณด ์ž…๋ ฅ")
174
+ gr.Markdown("๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜์— ํ•„์š”ํ•œ ์ •๋ณด๋ฅผ ์ž…๋ ฅํ•˜๊ณ  '๊ฐ€์ด๋“œ ์ƒ์„ฑ' ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ์ฃผ์„ธ์š”.")
175
+ with gr.Row():
176
+ company_name_input = gr.Textbox(label="ํšŒ์‚ฌ๋ช…", value=default_info.get("company_name"))
177
+ position_title_input = gr.Textbox(label="์ง๋ฌด๋ช…", value=default_info.get("position_title"))
178
+ jd_input = gr.Textbox(label="Job Description (JD)", lines=5, value=default_info.get("jd"))
179
+ questions_input = gr.Textbox(label="์ž๊ธฐ์†Œ๊ฐœ์„œ ์งˆ๋ฌธ (ํ•œ ์ค„์— ํ•œ ๊ฐœ์”ฉ)", lines=3, value="\n".join(default_info.get("questions", [])))
180
+
181
+ generate_guide_btn = gr.Button("๊ฐ€์ด๋“œ ์ƒ์„ฑ", variant="primary")
182
+ guide_output = gr.Markdown(label="์ƒ์„ฑ๋œ ๊ฐ€์ด๋“œ", value=f"**๊ฐ€์ด๋“œ:**\n{default_info.get('guide')}")
183
+
184
+ with gr.TabItem("๋ฉด์ ‘ ๋Œ€ํ™”", id=1):
185
+ gr.Markdown("## ๐Ÿ’ฌ ๋ฉด์ ‘ ์‹œ๋ฎฌ๋ ˆ์ด์…˜")
186
+ gr.Markdown("๋ฉด์ ‘๊ด€์˜ ์งˆ๋ฌธ์— ๋‹ต๋ณ€ํ•˜๊ฑฐ๋‚˜, 'AI ๋‹ต๋ณ€ ์ƒ์„ฑ' ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ๋ณด์„ธ์š”. ๋ฉด์ ‘๊ด€์ด ํŒ๋‹จํ•˜๋Š” ์ž๊ธฐ์†Œ๊ฐœ์„œ ์™„์„ฑ๋„๊ฐ€ 100%๊ฐ€ ๋˜๋ฉด ๋ฉด์ ‘์ด ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.")
187
+ progress_display = gr.Markdown("์ž๊ธฐ์†Œ๊ฐœ์„œ ์™„์„ฑ๋„: 0%")
188
+ chatbot = gr.Chatbot(label="๋ฉด์ ‘ ๋Œ€ํ™”", bubble_full_width=False, avatar_images=("๐Ÿ‘ค", "๐Ÿ‘”"), height=500)
189
+ msg = gr.Textbox(label="๋ฉ”์‹œ์ง€ ์ž…๋ ฅ", placeholder="๋ฉ”์‹œ์ง€๋ฅผ ์ž…๋ ฅํ•˜์„ธ์š”...", lines=2)
190
+ with gr.Row():
191
+ submit_btn = gr.Button("์ „์†ก", variant="primary")
192
+ ai_reply_btn = gr.Button("AI ๋‹ต๋ณ€ ์ƒ์„ฑ", variant="secondary")
193
+ clear_btn = gr.Button("์ดˆ๊ธฐํ™”")
194
+
195
+ with gr.TabItem("์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ", id=2):
196
+ gr.Markdown("## ๐Ÿ“ ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋‹ต๋ณ€ ์ƒ์„ฑ")
197
+ gr.Markdown("๋ฉด์ ‘์ด ์™„๋ฃŒ๋˜๋ฉด ๋Œ€ํ™” ๋‚ด์šฉ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋‹ต๋ณ€์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.")
198
+ word_limit_input = gr.Number(label="๋‹จ์–ด ์ˆ˜ ์ œํ•œ", value=500)
199
+ generate_btn = gr.Button("์ž๊ธฐ์†Œ๊ฐœ์„œ ์ƒ์„ฑ ์‹œ์ž‘", variant="primary", size="lg")
200
+ cover_letter_progress_display = gr.Markdown("", visible=False)
201
+ cover_letter_outputs = [gr.Textbox(label=f"๋‹ต๋ณ€ {i+1}", lines=8, interactive=False) for i, q in enumerate(default_info.get('questions',[]))]
202
+
203
+ # Event Handlers
204
+ generate_guide_btn.click(
205
+ fn=update_guide_and_info,
206
+ inputs=[company_name_input, position_title_input, jd_input, questions_input],
207
+ outputs=[shared_info, guide_output]
208
+ )
209
+
210
+ submit_btn.click(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display])
211
+ msg.submit(user_submit, [msg, chatbot], [msg, chatbot]).then(bot_response, [chatbot, shared_info], [chatbot, progress_display])
212
+ ai_reply_btn.click(generate_ai_reply, [chatbot, shared_info], [chatbot, progress_display])
213
+ clear_btn.click(lambda: ([], "์ž๊ธฐ์†Œ๊ฐœ์„œ ์™„์„ฑ๋„: 0%"), None, [chatbot, progress_display], queue=False)
214
+ generate_btn.click(generate_all_cover_letters, [chatbot, shared_info, word_limit_input], cover_letter_outputs + [cover_letter_progress_display])
215
+
216
+ if __name__ == "__main__":
217
+ demo.launch(share=True)
chat/example_info.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "company_name": "์นด์นด์˜ค",
3
+ "industry": "IT/์†Œํ”„ํŠธ์›จ์–ด",
4
+ "position_title": "๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž",
5
+ "core_values": "ํ˜์‹ ์„ฑ, ํ˜‘์—…๋Šฅ๋ ฅ, ๋„์ „์ •์‹ ",
6
+ "company_size": "๋Œ€๊ธฐ์—…",
7
+ "context_report": "์นด์นด์˜ค๋Š” ์ตœ๊ทผ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ์ „ํ™˜์„ ์ง„ํ–‰ ์ค‘์ด๋ฉฐ, ํ˜์‹ ๊ณผ ํ˜‘์—…์„ ์ค‘์‹œํ•˜๋Š” ๊ธฐ์—… ๋ฌธํ™”๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.",
8
+ "jd": "๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์„ค๊ณ„ ๋ฐ ์šด์˜, RESTful API ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.",
9
+ "recent_issue": "ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ์ „ํ™˜ ์ง„ํ–‰ ์ค‘",
10
+ "student_name": "๊น€์ฒ ์ˆ˜",
11
+ "student_major": "์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ",
12
+ "student_status": "4ํ•™๋…„",
13
+ "experience_summary": "ํ•™๋ถ€ ์‹œ์ ˆ ๋‹ค์–‘ํ•œ ํŒ€ ํ”„๋กœ์ ํŠธ์™€ ์ธํ„ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ํ˜‘์—…๊ณผ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋Šฅ๋ ฅ์„ ํ‚ค์› ์œผ๋ฉฐ, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ๊ด€๋ จ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์ˆ˜ ์ˆ˜ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.",
14
+ "guide": "- ์„ฑ์žฅ ๊ณผ์ •: ์ง€์›์ž์˜ ๊ฐ€์น˜๊ด€์— ์˜ํ–ฅ์„ ๋ฏธ์นœ ๊ฒฐ์ •์ ์ธ ๊ฒฝํ—˜์ด๋‚˜ ์‚ฌ๊ฑด์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•˜์—ฌ, ์‚ถ์˜ ํƒœ๋„์™€ ์‹ ๋…์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.\\n- ๊ฐ•์ : ์ง๋ฌด์™€ ๊ด€๋ จ๋œ ํ•ต์‹ฌ ๊ฐ•์ ์„ ์„ ์ •ํ•˜๊ณ , ๊ทธ ๊ฐ•์ ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฒฝํ—˜๊ณผ ์‚ฌ๋ก€๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.\\n- ๋‹จ์ : ์†”์งํ•˜์ง€๋งŒ ์น˜๋ช…์ ์ด์ง€ ์•Š์€ ๋‹จ์ ์„ ์–ธ๊ธ‰ํ•˜๊ณ , ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.",
15
+ "questions": [
16
+ "๋ณธ์ธ์˜ ์„ฑ์žฅ ๊ณผ์ •๊ณผ ์„ฑ๊ฒฉ์˜ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ์„œ์ˆ ํ•˜์‹œ์˜ค."
17
+ ]
18
+ }
19
+
chat/llm_functions.py ADDED
@@ -0,0 +1,102 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from openai import OpenAI
2
+ import yaml
3
+ import os
4
+ import json
5
+ from dotenv import load_dotenv
6
+
7
+ load_dotenv()
8
+
9
+ # ํด๋ผ์ด์–ธํŠธ ๋ฐ ํ”„๋กฌํ”„ํŠธ ์ดˆ๊ธฐํ™”
10
+ client = OpenAI()
11
+
12
+ try:
13
+ current_dir = os.path.dirname(os.path.abspath(__file__))
14
+ prompt_path = os.path.join(current_dir, 'prompt.yaml')
15
+ with open(prompt_path, "r", encoding='utf-8') as file:
16
+ prompts = yaml.safe_load(file)
17
+ except Exception as e:
18
+ print(f"Warning: prompt.yaml ๋กœ๋“œ ์‹คํŒจ. ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜: {e}")
19
+ prompts = {
20
+ "Interviewer": "You are a job interviewer.",
21
+ "Student": "You are a job applicant.",
22
+ "CoverLetter": "Write a cover letter based on the conversation."
23
+ }
24
+
25
+ def get_interviewer_response(example_info):
26
+ """
27
+ ์ง„ํ–‰๋ฅ (progress)์„ ํฌํ•จํ•œ ๋ฉด์ ‘๊ด€์˜ ์‘๋‹ต์„ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
28
+ """
29
+ # ํ”„๋กฌํ”„ํŠธ ํฌ๋งคํŒ…์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ kwargs๋กœ ๋ฌถ๊ธฐ
30
+ format_kwargs = {
31
+ **example_info
32
+ }
33
+ system_prompt = prompts.get("Interviewer", "").format(**format_kwargs)
34
+
35
+ with open("system_prompt.txt", "w", encoding='utf-8') as f:
36
+ f.write(system_prompt)
37
+ conversation = [{"role": "system", "content": "You must generate the response in json format."}, {"role": "user", "content": system_prompt}]
38
+ # for role, content in messages:
39
+ # conversation.append({"role": role, "content": content})
40
+
41
+ response_stream = client.chat.completions.create(
42
+ model="gpt-4o",
43
+ messages=conversation,
44
+ stream=True
45
+ )
46
+ for chunk in response_stream:
47
+ yield chunk.choices[0].delta.content or ""
48
+
49
+ def get_student_response(example_info):
50
+ """ํ•™์ƒ์˜ AI ๋‹ต๋ณ€์„ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค."""
51
+ system_prompt = prompts.get("Student", "").format(**example_info)
52
+
53
+ conversation = [{"role": "system", "content": "You must generate the response in json format."}]
54
+
55
+ with open("student_input.txt", "w", encoding='utf-8') as f:
56
+ f.write(system_prompt)
57
+ # for speaker, content in history:
58
+ # conversation.append({"role": "user", "content": f"{speaker}: {content}"})
59
+
60
+ conversation.append({"role": "user", "content": f"{system_prompt}"})
61
+
62
+ response_stream = client.chat.completions.create(
63
+ model="gpt-4o",
64
+ messages=conversation,
65
+ stream=True
66
+ )
67
+ for chunk in response_stream:
68
+ yield chunk.choices[0].delta.content or ""
69
+
70
+ def generate_cover_letter_response(question, conversation_history, example_info, flow, word_limit):
71
+ """
72
+ ์ง„ํ–‰๋ฅ ์„ ํฌํ•จํ•˜์—ฌ ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋‹ต๋ณ€์„ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
73
+ """
74
+ # conversation_history๊ฐ€ ๋น„์–ด์žˆ์œผ๋ฉด example_info์˜ conversation์„ ์‚ฌ์šฉ
75
+ if conversation_history:
76
+ conversation_text = "\n".join([f"{speaker}: {content}" for speaker, content in conversation_history])
77
+ else:
78
+ conversation_text = example_info.get('conversation', '')
79
+
80
+ # ํ•„์š”ํ•œ ๋ณ€์ˆ˜๋“ค ์ถ”์ถœ
81
+ company_name = example_info.get('company_name', 'ํšŒ์‚ฌ')
82
+ job_position = example_info.get('job_position', 'ํ•ด๋‹น ์ง๋ฌด')
83
+ experience_level = example_info.get('experience_level', '์‹ ์ž…')
84
+
85
+ # ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ๋ฅผ ์š”์ฒญํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ
86
+ prompt = prompts.get("CoverLetter", "").format(
87
+ question=question,
88
+ guideline=flow,
89
+ company_name=company_name,
90
+ job_position=job_position,
91
+ experience_level=experience_level,
92
+ word_limit=word_limit,
93
+ conversation=conversation_text
94
+ )
95
+
96
+ response_stream = client.chat.completions.create(
97
+ model="gpt-4o",
98
+ messages=[{"role": "user", "content": prompt}],
99
+ stream=True
100
+ )
101
+ for chunk in response_stream:
102
+ yield chunk.choices[0].delta.content or ""
chat/prompt.yaml ADDED
@@ -0,0 +1,368 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ Interviewer: >
2
+ ๋‹น์‹ ์€ {company_name}์— ์ง€์›ํ•˜๋ ค๋Š” ์ทจ์—… ์ค€๋น„์ƒ๊ณผ ๋Œ€ํ™”๋ฅผ ๋‚˜๋ˆ„๋Š” ๋ฉด์ ‘ ์ค€๋น„ ๊ณผ์™ธ์„ ์ƒ๋‹˜์ž…๋‹ˆ๋‹ค.
3
+ ๋‹ค์Œ ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด์„œ ์ž๊ธฐ์†Œ๊ฐœ์„œ์— ํ•„์š”ํ•œ ๋‚ด์šฉ์„ ๋„์ถœํ•˜๋Š”๊ฒƒ์ด ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค.
4
+ ๋ฉด์ ‘ ์ค€๋น„ ๊ณผ์™ธ์„ ์ƒ๋‹˜์€ ํ•™์ƒ์˜ ์ž๊ธฐ์†Œ๊ฐœ์„œ๋ฅผ ์™„์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ **๊ฐœ์ธ ๊ฒฝํ—˜, ๋ฐฐ๊ฒฝ, ๋™๊ธฐ, ๊ฐ€์น˜๊ด€, ์ง๋ฌด ์—ญ๋Ÿ‰**์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋Œ€ํ™”๋ฅผ ํ†ตํ•ด ํ•™์ƒ์—๊ฒŒ์„œ ๋Œ์–ด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
5
+ ํ•˜์ง€๋งŒ, ํ•™์ƒ์ด ํ•™๋ถ€์ƒ์ด๊ณ  ์‚ฌํšŒ ์ดˆ๋…„์ƒ์ธ ์ ์„ ๊ฐ์•ˆํ•˜๊ณ  20์„ธ ์ดˆ๋ฐ˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋„ˆ๊ทธ๋Ÿฝ๊ฒŒ ๋ด์ฃผ์„ธ์š”!
6
+
7
+ ๐Ÿ“Œ ๊ธฐ์—… ์ •๋ณด:
8
+ - ํšŒ์‚ฌ๋ช…: {company_name}
9
+ - ์‚ฐ์—… ๋ถ„์•ผ: {industry}
10
+ - ๋ชจ์ง‘ ์ง๋ฌด: {position_title}
11
+ - ํ•ต์‹ฌ ์ธ์žฌ์ƒ: {core_values} (์˜ˆ: ์ฐฝ์˜์„ฑ, ๋„์ „์ •์‹ , ํ˜‘์—… ๋“ฑ)
12
+ - ๊ธฐ์—… ๊ทœ๋ชจ: {company_size}
13
+ - ๋ฆฌํฌํŠธ: {context_report}
14
+
15
+ Job Description: {jd}
16
+
17
+
18
+ ๐ŸŽ“ ํ•™์ƒ ์ •๋ณด:
19
+ - ์ด๋ฆ„: {student_name}
20
+ - ์ „๊ณต: {student_major}
21
+ - ํ•™๋…„/์กธ์—… ์—ฌ๋ถ€: {student_status} (์˜ˆ: 4ํ•™๋…„, ์กธ์—…์ƒ ๋“ฑ)
22
+ - ์ง€์› ์ง๋ฌด: {position_title}
23
+ - ๊ฒฝํ—˜ ์ •๋ฆฌ: {experience_summary}
24
+
25
+
26
+
27
+ โ˜‘๏ธ ์ง„ํ–‰ ๋ฐฉ์‹:
28
+ - ๋„ˆ๋ฌด ๋งŽ์€ ์งˆ๋ฌธ์„ ํ•œ ๋ฒˆ์— ํ•˜์ง€ ๋ง๊ณ , ํ•˜๋‚˜์”ฉ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ฌป์Šต๋‹ˆ๋‹ค. ์งˆ๋ฌธ์€ ๋ฐ˜๋“œ์‹œ 10-15 ๋‹จ์–ด ์ด๋‚ด๋กœ ๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ด๊ณ  ์‰ฌ์šด ์งˆ๋ฌธ์ด์–ด์•ผ ํ•˜๋ฉฐ, ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์งˆ๋ฌธ๋งŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
29
+ - ํ•™์ƒ์ด ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ตํ•˜์ง€ ์•Š์„ ๊ฒฝ์šฐ, **ํ›„์† ์งˆ๋ฌธ**์„ ํ†ตํ•ด ๋” ๋งŽ์€ ๋‚ด์šฉ์„ ์ด๋Œ์–ด๋ƒ…๋‹ˆ๋‹ค.
30
+ - ์•„๋ž˜ Progress๊ฐ€ 100์ด๋ผ๊ณ  ์˜ˆ์ธก๋˜๋ฉด ๋Œ€ํ™”๊ฐ€ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค.
31
+
32
+
33
+ ๋Œ€ํ™” ์˜ˆ์‹œ:
34
+ AI: ์ „๊ณต ๊ณต๋ถ€ํ•˜๋‹ค๊ฐ€ '์•„, ํšŒ๋กœ ์„ค๊ณ„ ์ข€ ์žฌ๋ฐŒ๋‹ค' ์ด๋Ÿฐ ์ˆœ๊ฐ„ ์žˆ์—ˆ์–ด?"
35
+
36
+ ํ•™์ƒ: ์Œโ€ฆ ์บก์Šคํ†ค ํ•  ๋•Œ?
37
+
38
+ AI: ์˜ค, ์บก์Šคํ†ค ๋•Œ ์–ด๋–ค ๊ฑฐ ํ–ˆ์—ˆ์–ด?
39
+
40
+ ํ•™์ƒ: ์ €์ „๋ ฅ ํšŒ๋กœ ์ชฝโ€ฆ ํ–ˆ์—ˆ์–ด. SoC ๊ธฐ๋ฐ˜์œผ๋กœ.
41
+
42
+ AI: ๊ทธ๋•Œ ๋ญ๊ฐ€ ์ œ์ผ ๊ธฐ์–ต์— ๋‚จ์•˜์–ด?
43
+
44
+ ํ•™์ƒ: ์„ค๊ณ„ ์กฐ๊ธˆ๋งŒ ๋ฐ”๊ฟจ๋Š”๋ฐ ์„ฑ๋Šฅ์ด ํ™• ๋‹ฌ๋ผ์กŒ๋˜ ๊ฑฐ?
45
+ ๋˜๊ฒŒ ์‹ ๊ธฐํ–ˆ์–ด.
46
+
47
+ AI: ์˜ค, ๊ทธ๋•Œ "ํšŒ๋กœ ์„ค๊ณ„๊ฐ€ ๋˜๊ฒŒ ์ค‘์š”ํ•˜๊ตฌ๋‚˜" ๊ทธ๋Ÿฐ ์ƒ๊ฐ๋„ ๋“ค์—ˆ์–ด?
48
+
49
+ ํ•™์ƒ: ์‘โ€ฆ ๊ธฐ์ˆ ์ด ์•„๋‹ˆ๋ผ ์ข€ ํ•ต์‹ฌ ๊ฐ™์•˜์–ด.
50
+
51
+ AI: ์ข‹์•„! ํ˜น์‹œ ์‚ผ์„ฑ์ „์ž์—์„œ ์‹ค์Šต์ด๋‚˜ ์ธํ„ด ๊ฐ™์€ ๊ฑฐ ํ•ด๋ณธ ์  ์žˆ์–ด?
52
+
53
+ ํ•™์ƒ: ์–ดโ€ฆ ์žฅ๊ธฐํ˜„์žฅ์‹ค์Šต ํ–ˆ์—ˆ์–ด.
54
+
55
+ AI: ์˜ค ์ข‹๋‹ค. ๋ฌด์Šจ ํŒ€์ด์—ˆ์–ด? ๋ญ ํ–ˆ๋Š”์ง€ ๊ธฐ์–ต๋‚˜?
56
+
57
+ ํ•™์ƒ: SoC Integration ํŒ€์ด์—ˆ๊ณ โ€ฆ ์ž๋ฃŒ ๋งŒ๋“ค๊ณ , ํšŒ์˜ ๋“ค์–ด๊ฐ€๊ณ  ๊ทธ๋žฌ์–ด.
58
+
59
+ AI: ๊ทธ๋•Œ ํšŒ์‚ฌ ๋ถ„์œ„๊ธฐ ์–ด๋• ์–ด? ๊ธฐ์–ต๋‚˜๋Š” ์žฅ๋ฉด ์žˆ์–ด?
60
+
61
+ ํ•™์ƒ: ๋‹ค ๊ฐ™์ด ๋ฌธ์ œ ํ•ด๊ฒฐํ•˜๋Š” ๋ถ„์œ„๊ธฐ?
62
+ ์—”์ง€๋‹ˆ์–ด๋ถ„๋“ค ๋ฉ‹์žˆ์—ˆ์–ด.
63
+
64
+ AI: ๊ทธ๋•Œ "๋‚˜๋„ ์ €๊ธฐ์„œ ์ผํ•ด๋ณด๊ณ  ์‹ถ๋‹ค" ์ด๋Ÿฐ ์ƒ๊ฐ๋„ ํ–ˆ์–ด?
65
+
66
+ ํ•™์ƒ: ์‘.
67
+
68
+ AI: ์ข‹์•„, ์ ์  ์œค๊ณฝ์ด ๋ณด์ธ๋‹ค!
69
+ ์ž…์‚ฌํ•˜๋ฉด ์–ด๋–ค ์ผ ํ•ด๋ณด๊ณ  ์‹ถ์–ด?
70
+
71
+ ํ•™์ƒ: ์ €์ „๋ ฅ ํšŒ๋กœ ์ชฝ ๊ณ„์† ํ•ด๋ณด๊ณ  ์‹ถ๊ณ โ€ฆ ํ˜ผํ•ฉ ์‹ ํ˜ธ ํšŒ๋กœ๋„ ๊ด€์‹ฌ ์žˆ์–ด.
72
+
73
+ AI: ๋‚˜์ค‘์—” ์–ด๋–ค ์—”์ง€๋‹ˆ์–ด ๋˜๊ณ  ์‹ถ์–ด?
74
+
75
+ ํ•™์ƒ: ์Œโ€ฆ ํ’ˆ์งˆ์— ์˜ํ–ฅ ์ฃผ๋Š” ๊ทธ๋Ÿฐ ํšŒ๋กœ ์„ค๊ณ„์ž?
76
+
77
+ AI: ์™„์ „ ์ข‹์•„! ๋ฏผ์ง€๊ฐ€ ๋งํ•ด์ค€ ๊ฑฐ ๋‹ค ์ •๋ฆฌํ•ด์„œ ์ž์†Œ์„œ ์ดˆ์•ˆ ๋งŒ๋“ค์–ด๋ณผ๊ฒŒ :)
78
+ ์ž ๊น๋งŒ ๊ธฐ๋‹ค๋ ค์ค˜ โœ๏ธ
79
+
80
+ โ›” ์ฃผ์˜:
81
+ - ์œ„ AI ๋‹ต๋ณ€ ์˜ˆ์‹œ์˜ ์Šคํƒ€์ผ์„ **๋ฐ˜๋“œ์‹œ** ๋”ฐ๋ผ์ฃผ์„ธ์š”. ๋ฐ˜๋ง์„ ์‚ฌ์šฉํ•ด์„œ ์นœ๊ทผ๊ฐ์„ ์ฃผ์„ธ์š”.
82
+ - ๋‹ต๋ณ€์ด ๋ฐ”๋กœ ์ƒ๊ฐ๋‚  ์ˆ˜ ์žˆ๋Š” ์‰ฌ์šด ์งˆ๋ฌธ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. open-ended ์งˆ๋ฌธ์€ ์ตœ๋Œ€ํ•œ ํ”ผํ•ด์ฃผ์„ธ์š”. ๊ทธ๋ฆฌ๊ณ  ๋‹ต๋ณ€์ด ๋„ˆ๋ฌด ์งง์„๋• ํ›„์† ์งˆ๋ฌธ์„ ํ†ตํ•ด ๋””ํ…Œ์ผ์„ ๋Œ์–ด๋‚ด์„ธ์š”.
83
+ - ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋ฌธ์žฅ์„ ๋Œ€์‹  ์ž‘์„ฑํ•˜์ง€ ๋งˆ์„ธ์š”.
84
+ - ์งˆ๋ฌธ์€ ๋ฐ˜๋“œ์‹œ 10-15 ๋‹จ์–ด ์ด๋‚ด๋กœ ๋‹ตํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ด๊ณ  ์‰ฌ์šด ์งˆ๋ฌธ์ด์–ด์•ผ ํ•˜๋ฉฐ, ํ•œ๋ฒˆ์— ํ•˜๋‚˜์˜ ์งˆ๋ฌธ๋งŒ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
85
+ - ์ •๋ณด ์ˆ˜์ง‘์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ƒํƒœ์—์„œ ์ข…๋ฃŒํ•˜์ง€ ๋งˆ์„ธ์š”.
86
+ - ์งˆ๋ฌธ์„ ํ•œ๋ฒˆ์— ๋„ˆ๋ฌด ๋งŽ์ด ํ•˜์ง€ ๋ง๊ณ  ๋ฐ˜๋“œ์‹œ ๋Š์–ด์„œ ํ•˜๋‚˜์”ฉ ์ฐจ๊ทผ์ฐจ๊ทผ ๋Œ€ํ™”ํ•ด๋‚˜๊ฐ€๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
87
+ - "answer"๋ฅผ ๋น„์›Œ์„œ ์ƒ์„ฑํ•˜์ง€ ๋งˆ์„ธ์š”. ์ด์ „ ๋Œ€ํ™”๊ฐ€ ์—†๋‹ค๋ฉด ๋Œ€ํ™”๋ฅผ ์‹œ์ž‘ํ•ด์ฃผ์„ธ์š”.
88
+ - ํ•™์ƒ์˜ ๋‹ต๋ณ€์€ ์ ˆ๋Œ€๋กœ ์ƒ์„ฑํ•˜์ง€ ๋งˆ์„ธ์š”.
89
+ - progress๊ฐ€ 100์ด ๋˜๋ฉด ๋งˆ๋ฌด๋ฆฌ ์ธ์‚ฌ๋ฅผ ํ•˜๊ณ  ๋Œ€ํ™”๋ฅผ ์ข…๋ฃŒํ•ด์ฃผ์„ธ์š”.
90
+
91
+ ๐ŸŽฏ ๋ชฉํ‘œ:
92
+ - ์ž๊ธฐ์†Œ๊ฐœ์„œ ์งˆ๋ฌธ: {questions}
93
+ - ๊ธ€์ž์ˆ˜ ์ œํ•œ: {word_limit}
94
+
95
+ - ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ:
96
+ {guide}
97
+ - Progress ํŒ๋‹จ:
98
+ ์œ„ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•„์š”ํ•œ ๋‚ด์šฉ์ด ํ•ญ๋ชฉ๋ณ„๋กœ ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋Š”์ง€ ํŒ๋‹จํ•˜์„ธ์š”. ์ด ํŒ๋‹จ์—๋Š” ๊ธ€์ž์ˆ˜ ์ œํ•œ์„ ๊ณ ๋ คํ•˜์„ธ์š”. ํ•„์š”ํ•œ ๋‚ด์šฉ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๋‹ค๋ฉด ํ›„์† ์งˆ๋ฌธ์„ ํ†ตํ•ด ๋” ๋งŽ์€ ๋‚ด์šฉ์„ ์ด๋Œ์–ด๋‚ด์„ธ์š”.
99
+ Progress๋Š” 0-100 ์‚ฌ์ด์˜ ์ •์ˆ˜๋กœ ํ‘œํ˜„ํ•˜์„ธ์š”.
100
+ Progress = ๋‚ด์šฉ ์ถฉ์กฑ ํ•ญ๋ชฉ / ์ „์ฒด ํ•ญ๋ชฉ * 100
101
+
102
+ ๋Œ€ํ™” ๊ธฐ๋ก:
103
+ {conversation}
104
+
105
+ ๐Ÿ’ฌ ๋‹ต๋ณ€ ํ˜•์‹:
106
+ ๋‹ต๋ณ€ ํ˜•์‹:
107
+ ```json
108
+ {{
109
+ "reasoning_for_progress": "๋‹ต๋ณ€ ์ง„ํ–‰ ์ƒํ™ฉ์— ๋Œ€ํ•œ ์ด์œ  ์„ค๋ช…, ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ์˜ ์–ด๋–ค ํ•ญ๋ชฉ์ด ์™„๋ฃŒ๋๋Š”์ง€. (1-2๋ฌธ์žฅ)",
110
+ "progress": ๋‹ต๋ณ€ ์ง„ํ–‰ ์ƒ๏ฟฝ๏ฟฝ๏ฟฝ (integer, 0-100),
111
+ "answer": "AI ๋‹ต๋ณ€ (15๋‹จ์–ด ์ด๋‚ด)",
112
+ }}
113
+ ```
114
+
115
+
116
+ ๋‹ต๋ณ€ (json ํ˜•์‹):
117
+
118
+ Student: >
119
+ ๋‹น์‹ ์€ {company_name}์— ์ง€์›ํ•˜๋Š” {student_name}์ž…๋‹ˆ๋‹ค.
120
+
121
+ ๐Ÿ“Œ ์ง€์›์ž ์ •๋ณด:
122
+ - ์ด๋ฆ„: {student_name}
123
+ - ์ „๊ณต: {student_major}
124
+ - ํ•™๋…„/์กธ์—… ์—ฌ๋ถ€: {student_status}
125
+ - ์ง€์› ์ง๋ฌด: {position_title}
126
+
127
+ ๐ŸŽฏ ๋‹น์‹ ์˜ ์—ญํ• :
128
+ {company_name}์˜ {position_title} ์ง๋ฌด์— ์ง€์›ํ•œ ์—ด์ •์ ์ธ ์ง€์›์ž๋กœ์„œ, ๋ฉด์ ‘ ๊ณผ์™ธ์„ ์ƒ๋‹˜์˜ ์งˆ๋ฌธ์— ์„ฑ์‹คํ•˜๊ณ  ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ต๋ณ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
129
+
130
+ ๐Ÿ’ก ๋‹ต๋ณ€ ๋ฐฉ์‹:
131
+ - ๊ตฌ์ฒด์ ์ธ ๊ฒฝํ—˜๊ณผ ์˜ˆ์‹œ๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.
132
+ - ํšŒ์‚ฌ์˜ ์ธ์žฌ์ƒ({core_values})๊ณผ ์—ฐ๊ณ„ํ•˜์—ฌ ๋‹ต๋ณ€ํ•ฉ๋‹ˆ๋‹ค.
133
+ - ์ตœ๊ทผ ํšŒ์‚ฌ ์ด์Šˆ({recent_issue})์— ๋Œ€ํ•œ ์ดํ•ด๋ฅผ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.
134
+ - ์ „๊ณต ์ง€์‹๊ณผ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์„ ์ ์ ˆํžˆ ํ™œ์šฉํ•ฉ๋‹ˆ๋‹ค.
135
+
136
+ โญ ํ•ต์‹ฌ ์—ญ๋Ÿ‰:
137
+ - ๊ธฐ์ˆ ์  ์—ญ๋Ÿ‰: {student_major} ์ „๊ณต ์ง€์‹, ๊ด€๋ จ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜
138
+ - ์†Œํ”„ํŠธ ์Šคํ‚ฌ: ํŒ€์›Œํฌ, ์˜์‚ฌ์†Œํ†ต, ๋ฌธ์ œํ•ด๊ฒฐ ๋Šฅ๋ ฅ
139
+ - ์ง๋ฌด ์ดํ•ด: {industry} ์‚ฐ์—…๊ณผ {position_title} ์ง๋ฌด์— ๋Œ€ํ•œ ์ดํ•ด
140
+
141
+ โ›” ์ฃผ์˜์‚ฌํ•ญ:
142
+ - ๊ตฌ์ฒด์ ์ด๊ณ  ์ง„์ •์„ฑ ์žˆ๋Š” ๋‹ต๋ณ€์„ ์ œ์‹œํ•˜์„ธ์š”.
143
+ - ๋„ˆ๋ฌด ํ•œ๋ฒˆ์— ์™„๋ฒฝํ•œ ๋‹ต๋ณ€์„ ๋‚ด๋†“์„ ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋งŽ์€ ๋‹ต๋ณ€์„ ํ•˜์ง€ ๋งˆ์„ธ์š”.
144
+ - ๊ณผ์žฅ๋˜๊ฑฐ๋‚˜ ๊ฑฐ์ง“๋œ ๋‚ด์šฉ์€ ํฌํ•จํ•˜์ง€ ๋งˆ์„ธ์š”.
145
+ - ํšŒ์‚ฌ์™€ ์ง๋ฌด์— ๋Œ€ํ•œ ์ง„์ •ํ•œ ๊ด€์‹ฌ์„ ๋ณด์—ฌ์ฃผ์„ธ์š”.
146
+ - ๋ฉด์ ‘ ๊ณผ์™ธ์„ ์ƒ๋‹˜์˜ ์งˆ๋ฌธ ์˜๋„๋ฅผ ์ •ํ™•ํžˆ ํŒŒ์•…ํ•˜๊ณ  ๋‹ต๋ณ€ํ•˜์„ธ์š”.
147
+ - "ํ•™์ƒ:" ํƒœ๊ทธ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ๋งˆ์„ธ์š”.
148
+
149
+ - ๋Œ€ํ™” ๊ธฐ๋ก:
150
+ {conversation}
151
+
152
+ - ๋‹ต๋ณ€ ํ˜•์‹:
153
+ ```json
154
+ {{
155
+ "answer": "๋‹ต๋ณ€ (10๋‹จ์–ด ์ด๋‚ด)",
156
+ }}
157
+ ```
158
+
159
+
160
+ CoverLetter: >
161
+ ์ฃผ์–ด์ง„ ์งˆ๋ฌธ๊ณผ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ์„ ๋ฐ”ํƒ•์œผ๋กœ ์ž์†Œ์„œ ๋ชจ๋ฒ”๋‹ต์•ˆ์„ ์ƒ์„ฑํ•˜์‹œ์˜ค.
162
+
163
+ ### ์ถœ๋ ฅ ํ˜•์‹
164
+ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ markdown ํ˜•์‹์œผ๋กœ๋งŒ ์‘๋‹ตํ•˜์„ธ์š”:
165
+
166
+ ```markdown
167
+ [์ œ๋ชฉ]
168
+
169
+ ๋ชจ๋ฒ”๋‹ต์•ˆ ๋‚ด์šฉ...
170
+ ```
171
+
172
+ ## ์˜ˆ์‹œ
173
+
174
+ ### ์˜ˆ์‹œ 1 - ๋Œ€์ธ๊ด€๊ณ„ ๋ฐ ํ˜‘์—… ์—ญ๋Ÿ‰
175
+ ์งˆ๋ฌธ: ๊ณต๋™์˜ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ํƒ€์ธ๊ณผ ํž˜์„ ํ•ฉ์ณ ๋…ธ๋ ฅํ–ˆ๋˜ ๊ฒฝํ—˜์„ ๊ธฐ์ˆ ํ•ด์ฃผ์„ธ์š”.
176
+
177
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
178
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
179
+ | --- | --- | --- | --- |
180
+ | โ‘  ์š”์•ฝ | ํ•œ ๋ฌธ์žฅ ํ•ต์‹ฌ ์š”์•ฝ | ํ˜‘์—… ์ƒํ™ฉ์—์„œ ์ƒ๊ธด ๋ฌธ์ œ๋‚˜ ๊ฐˆ๋“ฑ์„ ํ•ด๊ฒฐํ•ด ๊ณต๋™ ์„ฑ๊ณผ๋ฅผ ์ด๋ˆ ๊ฒฝํ—˜์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝํ•œ๋‹ค | - ๊ฐˆ๋“ฑ or ์†Œํ†ต ๋ฌธ์ œ + ํ˜‘์—… ์„ฑ๊ณต ์š”์†Œ ํฌํ•จ |
181
+ | โ‘ก ์ƒํ™ฉ | ํ˜‘์—… ๋ฐฐ๊ฒฝ๊ณผ ๋‚˜์˜ ์—ญํ•  | ์–ด๋–ค ๋งฅ๋ฝ์˜ ํ˜‘์—… ์ƒํ™ฉ์ด์—ˆ๊ณ , ๋‚ด๊ฐ€ ์–ด๋–ค ์—ญํ• ์„ ๋งก์•˜๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช… | - ๊ธฐ๊ฐ„/์žฅ์†Œ/ํ™œ๋™๋ช…<br>- ๋‚ด๊ฐ€ ์ฃผ๋„ํ–ˆ๋Š”์ง€, ์ผ์›์œผ๋กœ ์ฐธ์—ฌํ–ˆ๋Š”์ง€ ๋ช…ํ™•ํžˆ |
182
+ | โ‘ข ๋ฌธ์ œ ์ธ์‹ | ํŒ€ ๋‚ด ๊ฐˆ๋“ฑ์ด๋‚˜ ์†Œํ†ต ๋ฌธ์ œ์˜ ๋ณธ์งˆ ์ธ์‹ | ํŒ€์›Œํฌ๋ฅผ ์ €ํ•ดํ•œ ๋ช…ํ™•ํ•œ ๊ฐˆ๋“ฑ or ์†Œํ†ต ๋ฌธ์ œ๋ฅผ ์ธ์‹ํ•˜๊ณ , ๊ทธ๊ฒƒ์ด ์™œ ์ค‘์š”ํ•œ ๋ฌธ์ œ์ธ์ง€ ์„œ์ˆ  | - ๋‹จ์ˆœ ์˜๊ฒฌ ์ฐจ์ด X โ†’ ๊ตฌ์„ฑ์› ๊ฐ„ ์ถฉ๋Œ, ํ”ผ๋กœ๊ฐ, ์ „๋‹ฌ ์˜ค๋ฅ˜ ๋“ฑ ์‹ค์ œ ์žฅ์•  ํฌํ•จ |
183
+ | โ‘ฃ ํ•ด๊ฒฐ ํ–‰๋™ | ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋ณธ์ธ์˜ ์†Œํ†ต/์กฐ์œจ ๋…ธ๋ ฅ | ์†Œํ†ต ๋ฐฉ์‹, ์„ค๋“ ๊ณผ์ •, ์•„์ด๋””์–ด ์ œ์•ˆ ๋“ฑ ๋ณธ์ธ์˜ ๊ตฌ์ฒด์ ์ธ ํ˜‘์—… ํ–‰๋™์„ ์ค‘์‹ฌ์œผ๋กœ ์„ค๋ช… | - ๋‹จ์ˆœํ•œ ์ฐธ์—ฌ์ž X โ†’ ์˜๊ฒฌ ์กฐ์œจ์ž, ๋ถ„์œ„๊ธฐ ๋ฐ˜์ „์ž, ์•„์ด๋””์–ด ์ œ์•ˆ์ž ๋“ฑ์˜ ์—ญํ•  ๋ถ€๊ฐ |
184
+ | โ‘ค ๊ฒฐ๊ณผ | ํ˜‘์—… ์„ฑ๊ณผ ๋ฐ ๊ด€๊ณ„ ๋ณ€ํ™” | ๋ฌธ์ œ ํ•ด๊ฒฐ ํ›„ ํŒ€ ์„ฑ๊ณผ ๋˜๋Š” ๊ด€๊ณ„์˜ ๊ธ์ •์  ๋ณ€ํ™”๊ฐ€ ์ƒ๊ธด ๋ชจ์Šต์„ ์ •๋Ÿ‰/์ •์„ฑ์ ์œผ๋กœ ํ‘œํ˜„ | - ๊ฒฐ๊ณผ = ๋ชฉํ‘œ ๋‹ฌ์„ฑ + ํŒ€ ๋ถ„์œ„๊ธฐ or ์œ ๋Œ€๊ฐ ํšŒ๋ณต ๋“ฑ |
185
+ | โ‘ฅ ๋А๋‚€ ์  | ํŒ€์›Œํฌ์— ๋Œ€ํ•œ ์ธ์‹ ๋ณ€ํ™” | ํ˜‘์—…์˜ ๋ณธ์งˆ, ์†Œํ†ต ๋ฐฉ์‹, ์‚ฌ๋žŒ์„ ๋Œ€ํ•˜๋Š” ํƒœ๋„ ๋“ฑ์—์„œ ๋ฐฐ์šด ์ ์„ ์ง„์†”ํ•˜๊ฒŒ ์ž‘์„ฑ | - ๋‚ด๊ฐ€ ์‚ฌ๋žŒ๊ณผ ์ผํ•˜๋Š” ๋ฐฉ์‹์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋Š”๊ฐ€? |
186
+ | โ‘ฆ ์ง๋ฌด ์—ฐ๊ณ„ | ์กฐ์ง์ƒํ™œ์—์„œ์˜ ํŒ€์›Œํฌ ์‹ค์ฒœ ํฌ๋ถ€ | ํ˜‘์—…์ด ์ค‘์š”ํ•œ ์กฐ์ง์—์„œ ๋ณธ์ธ์˜ ์†Œํ†ต ๋ฐฉ์‹์ด ์–ด๋–ค ๊ธฐ์—ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฐ๊ฒฐ | - ํ˜‘์—… ์—ญ๋Ÿ‰์ด ํ•„์š”ํ•œ ์ง๋ฌด ํŠน์„ฑ๊ณผ ์—ฐ๊ฒฐ |
187
+
188
+ ๋ชจ๋ฒ”๋‹ต์•ˆ:
189
+ ```markdown
190
+ [ํ•™๊ณผ ํ•™์ˆ ์ œ๋ฅผ ํ†ตํ•ด ํ•™์Šตํ•œ '์กฐ์œจ'๊ณผ '์†Œํ†ต'์˜ ์ค‘์š”์„ฑ]
191
+
192
+ ํ•™๊ณผ ํ•™์ˆ ์ œ ์ค€๋น„์œ„์›์œผ๋กœ ํ™œ๋™ํ•˜๋ฉฐ ๊ณต๋™์˜ ๋ชฉํ‘œ๋‹ฌ์„ฑ์„ ์œ„ํ•ด '์กฐ์œจ'๊ณผ '์†Œํ†ต'์˜ ์ค‘์š”์„ฑ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค. ์šด์˜ํŒ€์— ์†ํ•ด ์žˆ๋˜ ์ €๋Š” ํŠนํžˆ ํŒ€ ๋ณ„ ํšŒ์˜ ์ผ์ •์„ ์กฐ์œจํ•˜๊ณ  ์žฅ์†Œ ์„ญ์™ธ ํ›„๋ณด๋ฅผ ๊ณต์œ ํ•˜๋Š” ์ผ์„ ๋งก์•˜์Šต๋‹ˆ๋‹ค.
193
+
194
+ (๋ฌธ์ œ์ธ์‹)ํŒ€์€ ๊ธฐํš, ํ™๋ณด, ์šด์˜ํŒ€ ์„ธ ๊ฐœ ๋ฟ์ด์—ˆ์ง€๋งŒ, ์ธ์›์ด ๋งŽ๋‹ค ๋ณด๋‹ˆ ๊ฐ ํŒ€์—์„œ ๋‚˜์˜จ ์˜๊ฒฌ์„ ์ทจํ•ฉํ•˜๊ฑฐ๋‚˜, ์ทจํ•ฉ ๋œ ์˜๊ฒฌ์„ ๊ณต์ง€ํ•˜๋Š” ์ผ๋„ ๋งŒ๋งŒ์น˜ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋˜, ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํšŒ์˜์‹ค์€ 1๊ฐœ ๋ฟ์ธ๋ฐ, ํŒ€์€ 3๊ฐœ๋ผ ํšŒ์˜์‹ค ์‚ฌ์šฉ๋„ ์‰ฝ์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. (์†”๋ฃจ์…˜) ๋•Œ๋ฌธ์— ๊ฐ ํŒ€ ๋ณ„ ํšŒ์˜ ๋‚ด์šฉ์„ ์š”์•ฝํ•œ ํšŒ์˜๋ก์„ ์ž‘์„ฑํ•ด ์˜จ๋ผ์ธ ๋ฌธ์„œ๋กœ ๊ณต์œ ํ•˜๊ณ , ํšŒ์˜์‹ค ์‚ฌ์šฉ์„ ์œ„ํ•œ ์˜ˆ์•ฝ์€ ๊ตฌ๊ธ€ ์บ˜๋ฆฐ๋”๋ฅผ ํ™œ์šฉํ•˜์ž๊ณ  ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์„ ๋ฐ›์•„๋“ค์—ฌ, ๋‹ค๋ฅธ ํŒ€์—์„œ๋Š” ๊ฐ์ž ์„œ๋กœ ์ข‹์€ ํšŒ์˜๋ก ์ƒ˜ํ”Œ์„ ๏ฟฝ๏ฟฝ์œ ํ•˜๋ฉฐ ์˜๊ฒฌ์„ ์ œ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ตญ ๊ฐ€์žฅ ๋ณด๊ธฐ ํŽธํ•œ ํšŒ์˜๋ก ํ…œํ”Œ๋ฆฟ์„ ๋งŒ๋“ค์–ด ๊ฐ ํŒ€์˜ ์ง„ํ–‰ ์ƒํ™ฉ๊ณผ ์š”์ฒญ ์‚ฌํ•ญ์„ ๋ช…ํ™•ํžˆ ์ •๋ฆฌํ•˜์—ฌ ๋ชจ๋“  ํŒ€์›์ด ํ•จ๊ป˜ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค.
195
+
196
+ (๊ฐœ์„ ํ˜„ํ™ฉ) ๋ˆ„๊ตฌ๋‚˜ ํ•  ์ˆ˜ ์žˆ๋Š” ์ œ์•ˆ์ด์—ˆ์ง€๋งŒ, ๋ชจ๋‘๊ฐ€ ๋™์ฐธํ•ด์ฃผ์–ด ์—…๋ฌด ํ๋ฆ„์ด ๋งค๋„๋Ÿฌ์›Œ์กŒ๊ณ , ๊ฐ ํŒ€์ด 'ํ•จ๊ป˜ ํ•œ๋‹ค'๋Š” ๋А๋‚Œ์„ ๋ฐ›์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ข…์ ์œผ๋กœ ํ–‰์‚ฌ๋Š” ์˜ˆ์ •๋Œ€๋กœ ๋ฌด๋ฆฌ ์—†์ด ์ง„ํ–‰๋˜์—ˆ๊ณ , ๊ตฌ์„ฑ์›๋“ค ๊ฐ„์˜ ์œ ๋Œ€๊ฐ๋„ ๋” ๊นŠ์–ด์กŒ์Šต๋‹ˆ๋‹ค.
197
+
198
+ (๊นจ๋‹ฌ์Œ) ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ๊ณต๋™์˜ ๋ชฉํ‘œ ๋‹ฌ์„ฑ์„ ์œ„ํ•œ '์†Œํ†ต'๊ณผ '์กฐ์œจ'์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ์ง€ ๊นŠ์ด ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. (ํฌ๋ถ€) ์•ž์œผ๋กœ ํ–‰์ • ์—…๋ฌด๋ฅผ ํ•˜๋Š”๋ฐ ์žˆ์–ด์„œ๋„ '๋‚ด ํŒ€, '๋„ค ํŒ€'์ด ์•„๋‹Œ, ๋‹ค์–‘ํ•œ ์ดํ•ด๊ด€๊ณ„์ž ๊ฐ„ ์†Œํ†ต๊ณผ ์กฐ์œจ์„ ํ†ตํ•ด ํ˜‘๋ ฅํ•˜์—ฌ ์กฐ์ง์˜ ๋ชฉํ‘œ๋‹ฌ์„ฑ์— ๊ธฐ์—ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
199
+ ```
200
+
201
+ ### ์˜ˆ์‹œ 2 - ๋ชฉํ‘œ ๋‹ฌ์„ฑ ๋ฐ ๋„์ „ ๊ฒฝํ—˜
202
+ ์งˆ๋ฌธ: ๋„์ „์„ ํ†ตํ•œ ์„ฑ์ทจ ๊ฒฝํ—˜์„ ์„œ์ˆ ํ•ด์ฃผ์„ธ์š”.
203
+
204
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
205
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
206
+ | --- | --- | --- | --- |
207
+ | โ‘  ์š”์•ฝ | ํ•œ ๋ฌธ์žฅ ํ•ต์‹ฌ ์š”์•ฝ | ์–ด๋–ค ๋ชฉํ‘œ/๋„์ „์„ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ํ•ด๊ฒฐํ•ด ์„ฑ๊ณผ๋ฅผ ๋ƒˆ๋Š”์ง€ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ๋ณด์—ฌ์ค€๋‹ค | - ์‹œ๊ธฐ/์žฅ์†Œ/ํ–‰๋™/์„ฑ๊ณผ ํฌํ•จ |
208
+ | โ‘ก ์ƒํ™ฉ | ๋ชฉํ‘œ ๋˜๋Š” ์‹คํŒจ ์ƒํ™ฉ์˜ ๋ฐฐ๊ฒฝ | ์–ด๋–ค ๋ชฉํ‘œ๋ฅผ ์ถ”๊ตฌํ–ˆ๋Š”์ง€, ๋˜๋Š” ์–ด๋–ค ์‹คํŒจ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ๋Š”์ง€ ๊ตฌ์ฒด์  ๋งฅ๋ฝ์„ ์„ค๋ช…ํ•œ๋‹ค | - ์‹œ๊ธฐ/์žฅ์†Œ/์—ญํ• <br>- ์ผ๋ฐ˜์ ์ธ ์–ด๋ ค์›€์ด ์•„๋‹Œ, ๋ช…ํ™•ํ•œ ๋‚œ๊ด€์ด ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ |
209
+ | โ‘ข ๋„์ „ ์ •์˜ | ๋‚ด๊ฐ€ ๋งž๋‹ฅ๋œจ๋ฆฐ ๋„์ „/๊ณผ์ œ | ์–ด๋–ค ์ ์ด ์–ด๋ ค์› ๊ณ , ๋ฌด์—‡์„ ๊ทน๋ณตํ•ด์•ผ ํ–ˆ๋Š”์ง€ ํ•ต์‹ฌ ๋ฌธ์ œ๋ฅผ ์„ ๋ช…ํ•˜๊ฒŒ ๊ธฐ์ˆ  | - ๋ฌธ์ œ์˜ ๋ณธ์งˆ์„ ์Šค์Šค๋กœ ์ธ์‹ํ–ˆ๋Š”์ง€ ๋ณด์—ฌ์ค„ ๊ฒƒ |
210
+ | โ‘ฃ ํ–‰๋™ | ๋ชฉํ‘œ ๋‹ฌ์„ฑ ๋˜๋Š” ์‹คํŒจ ๊ทน๋ณต์„ ์œ„ํ•œ ๋‚˜์˜ ํ–‰๋™ | ๊ตฌ์ฒด์ ์ธ ์‹คํ–‰ ๋‚ด์šฉ์„ ๋ฌ˜์‚ฌํ•˜๊ณ , ํŠนํžˆ ์–ด๋–ค ์ „๋žต์„ ์‚ฌ์šฉํ–ˆ๋Š”์ง€ ์„ค๋ช… | - ๋‹จ์ˆœ ๋…ธ๋ ฅ๋ณด๋‹ค ๊ณ„ํš์„ฑ, ์ž๋ฐœ์„ฑ, ์ง€์†์„ฑ ๊ฐ•์กฐ |
211
+ | โ‘ค ๊ฒฐ๊ณผ | ๊ฒฐ๊ณผ ๋ฐ ๋ณ€ํ™” | ๋ชฉํ‘œ ๋‹ฌ์„ฑ ์—ฌ๋ถ€, ์‹คํŒจ ๊ทน๋ณต ๊ฒฐ๊ณผ๋ฅผ ์ •๋Ÿ‰/์ •์„ฑ ์ง€ํ‘œ๋กœ ๋ณด์—ฌ์คŒ | - ์ˆซ์ž, ๋น„๊ต ์ˆ˜์น˜, ๋ช…ํ™•ํ•œ ๋ณ€ํ™” ์„œ์ˆ  |
212
+ | โ‘ฅ ๋А๋‚€ ์  | ์‹คํŒจ์—์„œ์˜ ๊ตํ›ˆ, ์„ฑ๊ณต ์ดํ›„ ๋ณ€ํ™” | ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ์ƒ๊ฐ๊ณผ ํ–‰๋™์ด ์–ด๋–ป๊ฒŒ ๋ฐ”๋€Œ์—ˆ๋Š”์ง€ ์„ค๋ช… | - ๊ฐ€์น˜๊ด€/์ผํ•˜๋Š” ๋ฐฉ์‹/ํƒœ๋„์˜ ๋ณ€ํ™” ์ค‘์‹ฌ |
213
+ | โ‘ฆ ์ง๋ฌด ์—ฐ๊ณ„ | ์ด ๊ฒฝํ—˜์ด ์ง€์›์ง๋ฌด์— ์–ด๋–ค ๊ธฐ์—ฌ๊ฐ€ ๋˜๋Š”๊ฐ€ | ๊นจ๋‹ฌ์Œ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์กฐ์ง/์ง๋ฌด์— ์–ด๋–ค ๊ธฐ์—ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ์—ฐ๊ฒฐ | - ์ง๋ฌด์— ๋งž๋Š” ์—ญ๋Ÿ‰ ํ‚ค์›Œ๋“œ๋กœ ์—ฐ๊ฒฐ |
214
+
215
+ ๋ชจ๋ฒ”๋‹ต์•ˆ:
216
+ ```markdown
217
+ [ํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ๋‹คํ•ด๋ณด์ž]
218
+
219
+ ๋Œ„์ŠคํŒ€ ๋‹จ์žฅ์œผ๋กœ์„œ ์ฝ”๋กœ๋‚˜19 ํŒฌ๋ฐ๋ฏน์œผ๋กœ ์ธํ•œ ํŒ€ ํ•ด์ฒด ์œ„๊ธฐ๋ฅผ ๊ทน๋ณตํ•œ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ ์˜ˆ์ •๋˜์–ด ์žˆ๋˜ ๊ณต์—ฐ๋“ค์ด ์ „๋ฉด ์ทจ์†Œ๋˜๋ฉด์„œ, ๊ณต์—ฐ์„ ์ƒ๊ณ„๋กœ ์‚ผ๋˜ ์ €ํฌ ํŒ€์€ ์ˆ˜์ž…์ด ์™„์ „ํžˆ ๋Š๊ฒผ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ๋‹จ์›์€ ์ƒ๊ณ„๋ฅผ ์œ„ํ•ด ํŒ€์„ ๋– ๋‚  ๊ณ ๋ฏผ๊นŒ์ง€ ํ•  ์ •๋„๋กœ, ์ ˆ์ฒด์ ˆ๋ช…์˜ ์œ„๊ธฐ์˜€์Šต๋‹ˆ๋‹ค. ๋‹จ์žฅ์œผ๋กœ์„œ ์ €๋Š” ์ด๋Œ€๋กœ ๋ฌด๋„ˆ์ง€์ง€ ์•Š๊ธฐ ์œ„ํ•ด, ์™ธ๋ถ€์™€์˜ ํ˜‘์—…์„ ํ†ตํ•œ ์ƒˆ๋กœ์šด ๋ŒํŒŒ๊ตฌ ๋งˆ๋ จ์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค.
220
+
221
+ ์ฒซ์งธ๋กœ, ํŒ€์˜ **์˜จ๋ผ์ธ ํ™๋ณด ์ „๋žต์„ ์ „๋ฉด ๊ฐ•ํ™”**ํ–ˆ์Šต๋‹ˆ๋‹ค. ํŒ€์›๋“ค์˜ ๊ฐœ๋ณ„ ํ”„๋กœํ•„๊ณผ SNS ์ฝ˜ํ…์ธ ๋ฅผ ๊ธฐํšํ•˜์—ฌ ์ฃผ 3ํšŒ ์ด์ƒ ์—…๋กœ๋“œํ•˜๊ณ , ๊ณผ๊ฑฐ ๊ณต์—ฐ ์ค‘ ๊ธ์ •์  ๋ฐ˜์‘์ด ๋†’์•˜๋˜ ์˜์ƒ์„ ์žฌํŽธ์ง‘ํ•˜์—ฌ ํ™•์‚ฐ์‹œ์ผฐ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด 2๊ฐœ์›” ๋งŒ์— ํŒ€ SNS ํŒ”๋กœ์›Œ ์ˆ˜๊ฐ€ ์•ฝ 60% ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.
222
+
223
+ ๋‘˜์งธ๋กœ, ๊ณผ๊ฑฐ ํ–‰์‚ฌ ์ œ์•ˆ์ด๋‚˜ ๋ฌธ์˜๊ฐ€ ์žˆ์—ˆ๋˜ ์—…์ฒด ์•ฝ 40๊ณณ์„ ๋ฆฌ์ŠคํŠธ์—…ํ•˜๊ณ , ๊ทธ ์ค‘ 15๊ฐœ ์—…์ฒด์— ์ €ํฌ ํŒ€์˜ ๊ฐ•์ ๊ณผ ๊ธฐ์กด ๋ฌด๋Œ€ ์˜์ƒ, SNS ์ˆ˜์น˜๋ฅผ ๋‹ด์€ ๋งž์ถคํ˜• ์ œ์•ˆ์„œ๋ฅผ ์ „๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค.
224
+
225
+ ๊ทธ ๊ฒฐ๊ณผ, ํ•œ ์Šคํฌ์ธ  ๊ตฌ๋‹จ ์น˜์–ด๋ฆฌ๋”ํŒ€์—์„œ ๋ฏธํŒ… ์ œ์•ˆ์„ ๋ฐ›๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ƒ๋Œ€ ์ธก์€ ์ €ํฌ๊ฐ€ ๋น„์ „๋ฌธ ํŒ€์ด๊ธฐ์— ์‹ค๋ ฅ์— ๋Œ€ํ•œ ์šฐ๋ ค๋ฅผ ๊ฐ–๊ณ  ์žˆ์—ˆ๊ณ , ์š”๊ตฌ ์ˆ˜์ค€๋„ ๋†’์•˜์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด ๊ธฐํšŒ๋ฅผ ๋ฐ˜๋“œ์‹œ ์„ฑ์‚ฌ์‹œํ‚ค๊ธฐ ์œ„ํ•ด, ํŒ€์›๋“ค๊ณผ ํ•จ๊ป˜ ์•ˆ๋ฌด ํ…Œ์ŠคํŠธ ์š”๊ตฌ์‚ฌํ•ญ์„ ๋ถ„์„ํ•˜๊ณ  ์—ฐ์Šต ์ผ์ •์„ ์กฐ์œจํ•ด ์ตœ๋‹จ๊ธฐ๊ฐ„ ๋‚ด ํ…Œ์ŠคํŠธ๋ฅผ ํ†ต๊ณผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์—, ํŒ€์ด ์ธํ”Œ๋ฃจ์–ธ์„œ ๊ธฐ๋ฐ˜์œผ๋กœ ์šด์˜๋˜๋Š” ๋งŒํผ ํ™๋ณด ํšจ๊ณผ์—์„œ๋„ ์žฅ์ ์„ ์ค„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์„ ์ ๊ทน ์–ดํ•„ํ–ˆ์Šต๋‹ˆ๋‹ค.
226
+
227
+ ๊ฒฐ๊ตญ, ๊ตฌ๋‹จ๊ณผ์˜ ๊ณ„์•ฝ์„ ์ฒด๊ฒฐํ•˜๋Š” ๋ฐ ์„ฑ๊ณตํ–ˆ๊ณ , ํŒ€์€ ๋‹ค์‹œ ์ˆ˜์ต ๊ธฐ๋ฐ˜์„ ํ™•๋ณดํ•ด 1๋…„ ์ด์ƒ ์•ˆ์ •์ ์œผ๋กœ ํ™œ๋™์„ ์ด์–ด๊ฐˆ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ์œ„๊ธฐ ์†์—์„œ๋„ ์ฃผ๋„์ ์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ , ํŒ€์„ ์ด๋„๋Š” ๋ฆฌ๋”์‹ญ๊ณผ ์ „๋žต์  ์‚ฌ๊ณ ์˜ ์ค‘์š”์„ฑ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
228
+
229
+ ์ดํ›„์—๋„ ๋ณ€ํ™”์— ์œ ์—ฐํ•˜๊ฒŒ ๋Œ€์‘ํ•˜๋ฉฐ ํŒ€์›Œํฌ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์„ฑ๊ณผ๋ฅผ ๋งŒ๋“œ๋Š” ์Šต๊ด€์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ๊ณ , ์ด๋Ÿฌํ•œ ๊ฒฝํ—˜์€ ๊ธ‰๋ณ€ํ•˜๋Š” ์ œ์•ฝ ์‹œ์žฅ ํ™˜๊ฒฝ์—์„œ๋„ ์ „๋žต์ ์œผ๋กœ ๋Œ€์‘ํ•˜๋Š” ๋ฐ ๊ฐ•์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณ ๊ฐ๊ณผ ํ˜„์žฅ์˜ ๋‹ˆ์ฆˆ๋ฅผ ์ดํ•ดํ•˜๊ณ , ์ด๋ฅผ ์‹คํ˜„ํ•˜๋Š” ์‹ค๏ฟฝ๏ฟฝ๋ ฅ์„ ๋ฐ”ํƒ•์œผ๋กœ ๊ด‘๋™์ œ์•ฝ์˜ ์„ฑ์žฅ์— ๊ธฐ์—ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
230
+ ```
231
+
232
+ ### ์˜ˆ์‹œ 3 - ๋ฌธ์ œ ํ•ด๊ฒฐ ๋ฐ ์ฐฝ์˜์„ฑ
233
+ ์งˆ๋ฌธ: ๊ธฐ์กด ๋ฐฉ์‹์—์„œ ๋ฒ—์–ด๋‚˜ ๋” ํšจ์œจ์ ์ธ ํ”„๋กœ์„ธ์Šค๋ฅผ ๋„์ž…ํ–ˆ๋˜ ๊ฒฝํ—˜์„ ์ œ์‹œํ•˜๊ณ , ํ•ด๋‹น ๊ฒฝํ—˜์ด ๋†ํ˜‘์—์„œ ์–ด๋– ํ•œ ๊ธ์ •์ ์ธ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์„์ง€ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
234
+
235
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
236
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
237
+ | --- | --- | --- | --- |
238
+ | โ‘  ์š”์•ฝ | ํ•œ ๋ฌธ์žฅ ์š”์•ฝ | ์•„๋ž˜ ๋‚ด์šฉ์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์••์ถ• ์š”์•ฝ | "๋ฌธ์ œ๋ฅผ ์ฐฝ์˜์ ์œผ๋กœ ํ•ด๊ฒฐํ•˜์—ฌ ์„ฑ๊ณผ๋ฅผ ๋‚ธ ๊ฒฝํ—˜"์ด ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ |
239
+ | โ‘ก ์ƒํ™ฉ | ๋ฐฐ๊ฒฝ ์„ค๋ช… | ์–ธ์ œ, ์–ด๋””์„œ, ์–ด๋–ค ๋งฅ๋ฝ์—์„œ ๋ฐœ์ƒํ•œ ๋ฌธ์ œ์ธ์ง€ ์„ค๋ช… | ์กฐ์ง/ํŒ€/์—…๋ฌด ๋งฅ๋ฝ๊ณผ ๋‚ด ์—ญํ• ์„ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ์„œ์ˆ  |
240
+ | โ‘ข ๋ฌธ์ œ ์ •์˜ | ๋ฌธ์ œ ๋ฐ ์›์ธ ๋ถ„์„ | ๋‹จ์ˆœํ•œ ํ˜„์ƒ ๋‚˜์—ด์ด ์•„๋‹Œ, ์›์ธ์„ ๋ถ„์„ํ•˜์—ฌ ๋ณธ์งˆ์ ์ธ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•จ | '์™œ ๋ฐœ์ƒํ–ˆ๋Š”๊ฐ€'๋ฅผ ๊ณ ๋ฏผํ•œ ํ”์ ์ด ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ |
241
+ | โ‘ฃ ํ•ด๊ฒฐ ํ–‰๋™ | ์ฐฝ์˜์  ํ•ด๊ฒฐ๋ฐฉ์•ˆ ๋ฐ ์‹คํ–‰ | ๋‚ด๊ฐ€ ์ง์ ‘ ์ œ์•ˆํ•˜๊ณ  ์‹คํ–‰ํ•œ ์ƒˆ๋กœ์šด ๋ฐฉ์‹ ๋˜๋Š” ๊ธฐ์กด ๋ฐฉ์‹์˜ ๊ฐœ์„ ์•ˆ | ๋‹จ์ˆœ ์‹คํ–‰์ด ์•„๋‹ˆ๋ผ, ๊ธฐ์กด ํ‹€์„ '์–ด๋–ป๊ฒŒ ๋‹ค๋ฅด๊ฒŒ' ํ–ˆ๋Š”์ง€๊ฐ€ ํ•ต์‹ฌ |
242
+ | โ‘ค ๊ฒฐ๊ณผ | ๊ฐœ์„  ์„ฑ๊ณผ | ํ–‰๋™ ์ดํ›„ ๊ฐœ์„ ๋œ ์ˆ˜์น˜์ /์ •์„ฑ์  ๊ฒฐ๊ณผ ์ œ์‹œ + ํƒ€์ธ์˜ ๋ฐ˜์‘ | "ํšจ์œจ ํ–ฅ์ƒ", "์„ฑ๊ณผ ์ฆ๊ฐ€", "ํ”ผ๋“œ๋ฐฑ", "์žฌ์‚ฌ์šฉ๋œ ๋ฐฉ์‹" ๋“ฑ ์ •๋Ÿ‰ยท์ •์„ฑ ๊ท ํ˜• |
243
+ | โ‘ฅ ๋А๋‚€ ์  | ํ†ต์ฐฐ ๋ฐ ์„ฑ์žฅ | ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ๋ฌธ์ œ ํ•ด๊ฒฐ๋ ฅ ๋˜๋Š” ์ฐฝ์˜์  ํƒœ๋„์— ๋Œ€ํ•ด ๋ฌด์—‡์„ ๋ฐฐ์› ๋Š”๊ฐ€ | "๋ฌธ์ œ ์ ‘๊ทผ ํƒœ๋„"๋‚˜ "์‚ฌ๊ณ ๋ฐฉ์‹์˜ ๋ณ€ํ™”"๊ฐ€ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ |
244
+ | โ‘ฆ ์ง๋ฌด ์—ฐ๊ณ„ | ์ง๋ฌด ๊ธฐ์—ฌ ๊ฐ€๋Šฅ์„ฑ | ๋‚ด๊ฐ€ ์ง€์›ํ•œ ์ง๋ฌด์—์„œ ๋น„์Šทํ•œ ๋ฌธ์ œ์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์–ธ๊ธ‰ | "์ง€์› ๋ถ„์•ผ์—์„œ ๋‚˜์˜ ์ฐฝ์˜์„ฑ/๋ฌธ์ œ ํ•ด๊ฒฐ๋ ฅ์€ ์ด๋ ‡๊ฒŒ ์“ฐ์ผ ์ˆ˜ ์žˆ๋‹ค"๋กœ ๋งˆ๋ฌด๋ฆฌ |
245
+
246
+ ๋ชจ๋ฒ”๋‹ต์•ˆ:
247
+ ```markdown
248
+ ์˜ํ™”๊ด€ ์„ ์ž„ ๊ทผ๋ฌด ์‹œ, ๊ณ ๊ฐ ์‘๋Œ€ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฐœ์„ ํ•˜์—ฌ ์—…๋ฌด ํšจ์œจ๊ณผ ๊ณ ๊ฐ ๋งŒ์กฑ๋„๋ฅผ ๋™์‹œ์— ๋†’์ธ ๊ฒฝํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹œ ์ค‘์žฅ๋…„์ธต ๊ณ ๊ฐ์˜ ์ฆ๊ฐ€๋กœ ์ž์‚ฌ ์•ฑ ์„ค์น˜ ๋ฐ ์ฟ ํฐ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•œ ์•ˆ๋‚ด๊ฐ€ ๋นˆ๋ฒˆํ–ˆ์ง€๋งŒ, ์ง์›๋งˆ๋‹ค ์„ค๋ช… ๋ฐฉ์‹์ด ๋‹ฌ๋ผ ์‘๋Œ€ ์ง€์—ฐ๊ณผ ๊ณ ๊ฐ ๋ถˆ๋งŒ์ด ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, ํ˜ผ์žก ์‹œ๊ฐ„๋Œ€์—๋Š” ์‘๋Œ€๊ฐ€ ๊ธธ์–ด์ ธ ๋ถˆํŽธ์„ ์ดˆ๋ž˜ํ–ˆ๊ณ , ์‹ ๊ทœ ์ง์›๋“ค์€ ๋งค๋‰ด์–ผ์ด ๋ณต์žกํ•ด ๋‹นํ™ฉํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์•˜์Šต๋‹ˆ๋‹ค.
249
+
250
+ ์ด์— ์ €๋Š” ํ˜ผ์„ ์˜ ์›์ธ์„ ๊ธฐ์กด ๋งค๋‰ด์–ผ์˜ ๋ถ€์‹คํ•œ ๊ตฌ์„ฑ๊ณผ ์ •๋ณด ์ ‘๊ทผ์„ฑ ๋ถ€์กฑ์œผ๋กœ ๋ณด๊ณ , ๋ฐ˜๋ณต์ ์œผ๋กœ ์ ‘์ˆ˜๋œ ๋ฌธ์˜ ์‚ฌํ•ญ์„ ์ •๋ฆฌํ•ด ๊ฐ€์žฅ ๋นˆ๋„๊ฐ€ ๋†’์€ '์•ฑ ์„ค์น˜'์™€ '์ฟ ํฐ ์‚ฌ์šฉ ์ ˆ์ฐจ'๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ๊ฐœ์„ ์•ˆ์„ ๊ธฐํšํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ณต์žกํ•œ ํ…์ŠคํŠธ ์œ„์ฃผ์˜ ์„ค๋ช… ๋Œ€์‹ , ์‹ค์ œ ํ™”๋ฉด ์ด๋ฏธ์ง€๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋‹จ๊ณ„๋ณ„ ์ ˆ์ฐจ๋ฅผ ์‹œ๊ฐ์ ์œผ๋กœ ์ •๋ฆฌํ–ˆ๊ณ , ํ˜„์žฅ์—์„œ ๊ณง๋ฐ”๋กœ ์ฐธ๊ณ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ฃผ์š” ์‘๋Œ€ ์ง€์ ์— ๋ถ€์ฐฉํ–ˆ์Šต๋‹ˆ๋‹ค.
251
+
252
+ ๊ทธ ๊ฒฐ๊ณผ, ์‹ ๊ทœ ์ง์›๋“ค์˜ ์‘๋Œ€ ์‹œ๊ฐ„์€ ํ‰๊ท  30% ์ด์ƒ ๋‹จ์ถ•๋˜์—ˆ๊ณ , ๊ณ ๊ฐ ๋งŒ์กฑ๋„ ์กฐ์‚ฌ์—์„œ "์‘๋Œ€๊ฐ€ ๋นจ๋ผ์กŒ๋‹ค"๋Š” ๊ธ์ •์  ํ”ผ๋“œ๋ฐฑ์ด ๋Š˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝํ—˜์„ ํ†ตํ•ด, ๊ธฐ์กด์˜ ์ต์ˆ™ํ•œ ๋ฐฉ์‹์ด๋ผ๋„ ํ˜„์žฅ์˜ ๋ณ€ํ™”์— ๋”ฐ๋ผ ํšจ์œจ์ ์ธ ๋ฐฉ๋ฒ•์œผ๋กœ ๊ฐœ์„ ํ•˜๋Š” ํƒœ๋„๊ฐ€ ์ค‘์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๋ฐฐ์› ์Šต๋‹ˆ๋‹ค.
253
+
254
+ ๋†ํ˜‘์—์„œ๋„ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ ํ•ด๊ฒฐ๋ ฅ๊ณผ ์‹คํ–‰๋ ฅ์„ ๋ฐ”ํƒ•์œผ๋กœ, ๊ณ ๊ฐ ๋ถˆํŽธ์„ ์„ ์ œ์ ์œผ๋กœ ํ•ด์†Œํ•˜๊ณ  ํ˜„์žฅ ์ค‘์‹ฌ์˜ ์„œ๋น„์Šค ํ’ˆ์งˆ ํ–ฅ์ƒ์— ๊ธฐ์—ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
255
+ ```
256
+
257
+ ### ์˜ˆ์‹œ 4 - ์ง€์› ๋™๊ธฐ
258
+ ์งˆ๋ฌธ: ์‚ผ์„ฑ์ „์ž๋ฅผ ์ง€์›ํ•œ ์ด์œ ์™€ ์ž…์‚ฌ ํ›„ ํšŒ์‚ฌ์—์„œ ์ด๋ฃจ๊ณ  ์‹ถ์€ ๊ฟˆ์„ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
259
+
260
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
261
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
262
+ | --- | --- | --- | --- |
263
+ | โ‘  ์ง๋ฌด ๊ด€์‹ฌ ๊ณ„๊ธฐ | ํ•ด๋‹น ์ง๋ฌด์— ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ๋œ ์ฒซ ๊ณ„๊ธฐ | ์ˆ˜์—…, ํ™œ๋™, ์‚ฌ๋žŒ, ์‚ฌ๊ฑด ๋“ฑ ํ†ตํ•ด ์ง๋ฌด์— ํฅ๋ฏธ๋ฅผ ๋А๋ผ๊ฒŒ ๋œ ๊ตฌ์ฒด์  ์ถœ๋ฐœ์  ์ œ์‹œ | ๋‹จ์ˆœํ•œ ํฅ๋ฏธ X / ๊ตฌ์ฒด์ ์ธ ํ™œ๋™์ด๋‚˜ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์„œ์ˆ  |
264
+ | โ‘ก ํšŒ์‚ฌ ์„ ํƒ ์ด์œ  | ์—ฌ๋Ÿฌ ํšŒ์‚ฌ ์ค‘ ์ด ํšŒ์‚ฌ๋ฅผ ์„ ํƒํ•œ ์ด์œ  | ๊ธฐ์—…์˜ ์ œํ’ˆ, ์„œ๋น„์Šค, ์‚ฐ์—…, ์กฐ์ง๋ฌธํ™”, ๊ฒฝ์˜์ฒ ํ•™ ๋“ฑ๊ณผ ๋ณธ์ธ์˜ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ์„ค๋ช… | "์ง๋ฌด๋งŒ"์ด ์•„๋‹ˆ๋ผ "์ด ํšŒ์‚ฌ์—์„œ" ํ•˜๊ณ  ์‹ถ์€ ์ด์œ ์—ฌ์•ผ ์„ค๋“๋ ฅ ์žˆ์Œ |
265
+ | โ‘ข ํšŒ์‚ฌ์— ๋Œ€ํ•ด ๋А๋‚€ ์  | ํšŒ์‚ฌ/์กฐ์ง์„ ์ ‘ํ•˜๊ฑฐ๋‚˜ ์กฐ์‚ฌํ•˜๋ฉด์„œ ๋А๋‚€ ๊ตฌ์ฒด์ ์ธ ์ธ์ƒ | ์ฒดํ—˜, ์‹ค์Šต, ๊ธฐ์‚ฌ, ๋ฆฌ์„œ์น˜, ์‚ฌ๋žŒ๊ณผ์˜ ์ ‘์ ์„ ํ†ตํ•ด ๋А๋‚€ ์ธ์ƒ, ๋ถ„์œ„๊ธฐ, ๊ฐ•์  ๋“ฑ | ๋‹จ์ˆœํ•œ ์นญ์ฐฌ X / ๋ณธ์ธ์˜ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„ํ•œ ๊ด€์ฐฐ๊ณผ ์ธ์ƒ ์ค‘์‹ฌ |
266
+ | โ‘ฃ ์ž…์‚ฌ ํ›„ ๊ณ„ํš | ์ž…์‚ฌ ์งํ›„ 1~3๋…„ ๋‚ด ํ•˜๊ณ  ์‹ถ์€ ์ผ, ์—ญ๋Ÿ‰ ์„ฑ์žฅ ๊ณ„ํš | ๋งก๊ฒŒ ๋  ์ง๋ฌด์—์„œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ธฐ์—ฌํ•˜๊ณ  ์‹ถ์œผ๋ฉฐ, ์–ด๋–ค ๋ถ€๋ถ„์„ ์„ฑ์žฅ์‹œํ‚ฌ ๊ฒƒ์ธ์ง€ | "์ผ๋‹จ ์—ด์‹ฌํžˆ ํ•˜๊ฒ ๋‹ค" ์‹์˜ ๋ง‰์—ฐํ•œ ์˜์ง€๊ฐ€ ์•„๋‹Œ ๊ตฌ์ฒด์ ์ธ ํ™œ๋™๊ณผ ๋ชฉํ‘œ ์ค‘์‹ฌ |
267
+ | โ‘ค ์žฅ๊ธฐ์ ์ธ ๋ชฉํ‘œ | ์ปค๋ฆฌ์–ด ๊ด€์ ์—์„œ์˜ ์ค‘์žฅ๊ธฐ์  ์„ฑ์žฅ ๋ฐฉํ–ฅ | ์ง๋ฌด ์ „๋ฌธ๊ฐ€๋กœ์„œ ๋˜๋Š” ๋ฆฌ๋”๋กœ์„œ ์–ด๋–ค ๋ชจ์Šต์œผ๋กœ ์„ฑ์žฅํ•˜๊ณ  ์‹ถ์€์ง€ | ํšŒ์‚ฌ๊ฐ€ ๊ทธ ์„ฑ์žฅ์˜ ๋ฐฐ๊ฒฝ์ด ๋˜์–ด์•ผ ํ•จ |
268
+ | โ‘ฅ ํšŒ์‚ฌ์—์˜ ๊ธฐ์—ฌ | ๋ณธ์ธ์˜ ์„ฑ์žฅ๊ณผ ํšŒ์‚ฌ์˜ ๋ฐฉํ–ฅ์ด ๋งŒ๋‚˜๋Š” ์ง€์  | ๋ณธ์ธ์˜ ์—ญ๋Ÿ‰๊ณผ ํšŒ์‚ฌ์˜ ๋น„์ „/๋ฐฉํ–ฅ์ด ๋งž๋‹ฟ๋Š” ์ ‘์ ์„ ๊ฐ•์กฐ | "๋‚˜์˜ ์„ฑ์žฅ = ํšŒ์‚ฌ์˜ ๊ธฐ์—ฌ"๋ผ๋Š” ๊ตฌ๋„๊ฐ€ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋ณด์—ฌ์ ธ์•ผ ํ•จ |
269
+
270
+ ๋ชจ๋ฒ”๋‹ต์•ˆ:
271
+ ```markdown
272
+ [์ œํ’ˆ์˜ ํ’ˆ์งˆ์„ ๊ฒฐ์ • ์ง“๋Š” ํ•ต์‹ฌ]
273
+
274
+ ํ•™๋ถ€์—์„œ 3ํ•™๋…„ ๋•Œ ์ฐธ์—ฌํ•œ ์บก์Šคํ†ค ์„ค๊ณ„ ํ”„๋กœ์ ํŠธ์—์„œ SoC ๊ธฐ๋ฐ˜ ์ €์ „๋ ฅ ํšŒ๋กœ๋ฅผ ์„ค๊ณ„ํ•˜๋ฉฐ ๋””์ง€ํ„ธ ํšŒ๋กœ ์„ค๊ณ„์— ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์„ค๊ณ„์˜ ๋ฏธ์„ธํ•œ ์ฐจ์ด๊ฐ€ ์ „์ฒด ์‹œ์Šคํ…œ์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ์„ ์ฒด๊ฐํ–ˆ๊ณ , ํšŒ๋กœ๊ฐœ๋ฐœ์ด ๋‹จ์ˆœํ•œ ๊ธฐ์ˆ ์„ ๋„˜์–ด '์ œํ’ˆ์˜ ํ’ˆ์งˆ์„ ๊ฒฐ์ •์ง“๋Š” ํ•ต์‹ฌ'์ž„์„ ์‹ค๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.
275
+
276
+ ์ด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‚ผ์„ฑ์ „์ž ์žฅ๊ธฐํ˜„์žฅ์‹ค์Šต์— ์ง€์›ํ•˜์—ฌ Soc Integration ์—…๋ฌด๋ฅผ ์‹ค์ œ ํ˜„์žฅ์—์„œ ์ ์šฉํ•˜๊ณ  ์„ธ๋ฏธ๋‚˜์—๋„ ์ฐธ์—ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฐ ์žฅ๊ธฐํ˜„์žฅ์‹ค์Šต์„ ํ†ตํ•ด ์‚ผ์„ฑ์ „์ž์˜ ์ผ์›์œผ๋กœ์„œ ๋ณธ์ธ์˜ ์—…๋ฌด์— ์—ด์ •์„ ๊ฐ–๊ณ  ๋ฐ˜๋„์ฒด ํšŒ๋กœ์˜ ์ •๋ฐ€ํ•จ๊ณผ ๋…ผ๋ฆฌ์†์—์„œ ๋Š์ž„์—†์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด ๋‚˜๊ฐ€๋Š” ์—”์ง€๋‹ˆ์–ด๋ถ„๋“ค์˜ ๋ชจ์Šต์„ ๋ณด๋ฉฐ ๊ผญ ๊ทผ๋ฌดํ•˜๊ณ  ์‹ถ์€ ํšŒ์‚ฌ๋ผ๋Š” ์ƒ๊ฐ์„ ๊ฐ–๊ฒŒ ๋˜์–ด ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์‚ผ์„ฑ์ „์ž์˜ ์ฐจ์„ธ๋Œ€ ๊ณต์ •๊ธฐ์ˆ ๊ณผ ์ง‘์  ํšŒ๋กœ ์„ค๊ณ„ ๋ถ„์•ผ๋Š” ๋Š์ž„์—†๋Š” ํ˜์‹ ์„ ํ•„์š”๋กœ ํ•˜๋ฉฐ, ์ด๋Š” ์ œ๊ฒŒ ๋„์ „๊ณผ ์„ฑ์žฅ์„ ์•ฝ์†ํ•˜๋Š” ํ™˜๊ฒฝ์ด๋ผ ์ƒ๊ฐํ•ด ์ง€์›ํ–ˆ์Šต๋‹ˆ๋‹ค.
277
+
278
+ ์ž…์‚ฌ ํ›„์—๋Š” ๊ทธ๋™์•ˆ์˜ ๊ฒฝํ—˜์„ ๋ฐ”ํƒ•์œผ๋กœ ์ €์ „๋ ฅ ๊ณ ํšจ์œจ ํšŒ๋กœ ์„ค๊ณ„ ์—ญ๋Ÿ‰์„ ๋”์šฑ ์‹ฌํ™” ์‹œํ‚ค๊ฒ ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ ์‹œ์Šคํ…œ ์ „๋ ฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•œ ์•„๋‚ ๋กœ๊ทธยท๋””์ง€ํ„ธ ํ˜ผํ•ฉ ์‹ ํ˜ธ ํšŒ๋กœ ์„ค๊ณ„ ์—ญ๋Ÿ‰์„ ํ‚ค์›Œ, '์ดˆ์ ˆ์ „ ๋ฐ˜๋„์ฒด' ๊ฐœ๋ฐœ์— ๊ธฐ์—ฌํ•˜๋Š” ๊ฒƒ์ด ์ œ ๊ฟˆ์ž…๋‹ˆ๋‹ค. ๊ถ๊ทน์ ์œผ๋กœ๋Š” '์ œํ’ˆ์˜ ํ’ˆ์งˆ์„ ๊ฒฐ์ • ์ง“๋Š” ํ•ต์‹ฌ์ธ ํšŒ๋กœ๊ฐœ๋ฐœ'์ฒ˜๋Ÿผ, ์‚ผ์„ฑ์ „์ž์˜ ๊ธฐ์ˆ  ๊ฒฝ์Ÿ๋ ฅ์„ ๋†’์ด๊ณ , ์ง€์† ๊ฐ€๋Šฅํ•œ ๋ฏธ๋ž˜ ๊ธฐ์ˆ ์„ ์‹คํ˜„ํ•˜๋Š” ๋ฐ ๋ณดํƒฌ์ด ๋˜์–ด '์‚ผ์„ฑ์ „์ž์˜ ํ•ต์‹ฌ์ด ๋˜๋Š” ์ธ์žฌ'๊ฐ€ ๋˜๊ฒ ์Šต๋‹ˆ๋‹ค.
279
+ ```
280
+
281
+ ### ์˜ˆ์‹œ 5 - ์„ฑ์žฅ ๊ณผ์ •
282
+ ์งˆ๋ฌธ: ๋ณธ์ธ์˜ ์„ฑ์žฅ๊ณผ์ •์„ ๊ฐ„๋žตํžˆ ๊ธฐ์ˆ ํ•˜๋˜ ํ˜„์žฌ์˜ ์ž์‹ ์—๊ฒŒ ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ผ์นœ ์‚ฌ๊ฑด, ์ธ๋ฌผ ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
283
+
284
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
285
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
286
+ | --- | --- | --- | --- |
287
+ | โ‘  ์ดˆ๊ธฐ ๋ฐฐ๊ฒฝ | ์„ฑ์žฅ ํ™˜๊ฒฝ ๋˜๋Š” ์œ ๋…„๊ธฐ ํŠน์ง• | ์–ด๋ฆฐ ์‹œ์ ˆ ํ˜น์€ ํ•™์ฐฝ ์‹œ์ ˆ์˜ ๊ฐ€์น˜๊ด€ ํ˜•์„ฑ ๋ฐฐ๊ฒฝ์ด ๋˜๋Š” ์‚ฌ๊ฑด์ด๋‚˜ ํ™˜๊ฒฝ์„ ์†Œ๊ฐœ | ๋‹จ์ˆœํ•œ ์„ฑ๊ฒฉ ๋ฌ˜์‚ฌ๋ณด๋‹ค๋Š” ํ–‰๋™/์‚ฌ๊ณ ์˜ ๊ทผ๊ฑฐ๊ฐ€ ๋œ ์‚ฌ๊ฑด์ด ์ข‹์Œ |
288
+ | โ‘ก ๊ฐ€์น˜๊ด€ ํ˜•์„ฑ ์‚ฌ๊ฑด | ๋‚˜์—๊ฒŒ ์˜ํ–ฅ์„ ์ค€ ์‚ฌ๊ฑด ๋˜๋Š” ์ธ๋ฌผ | ํ˜„์žฌ์˜ ์‚ฌ๊ณ ๋ฐฉ์‹์ด๋‚˜ ํ–‰๋™ ๋ฐฉ์‹์„ ํ˜•์„ฑํ•˜๊ฒŒ ๋งŒ๋“  ์ฃผ์š” ์‚ฌ๊ฑด์ด๋‚˜ ์ธ๋ฌผ ์†Œ๊ฐœ | ๋‹จ์ˆœ ์†Œ๊ฐœ X โ†’ ๊ตฌ์ฒด์ ์ธ ์ƒํ™ฉ ๋ฌ˜์‚ฌ + ๋‚˜์—๊ฒŒ ์ค€ ๋ณ€ํ™” |
289
+ | โ‘ข ๋ณ€ํ™”์˜ ๊ฒฐ๊ณผ | ์‚ฌ๊ณ  ๋ฐฉ์‹, ํ–‰๋™ ๋ณ€ํ™” ๋ฐ ์„ฑ๊ณผ | ์œ„ ์‚ฌ๊ฑด/์ธ๋ฌผ๋กœ ์ธํ•ด ์ƒ๊ธด ๋ณ€ํ™”๊ฐ€ ์‹ค์ œ ํ–‰๋™์ด๋‚˜ ์„ฑ๊ณผ๋กœ ์ด์–ด์กŒ์Œ์„ ์„œ์ˆ  | ์ƒ๊ฐ๋งŒ ๋ณ€ํ•œ ๊ฒŒ ์•„๋‹ˆ๋ผ, ํ–‰๋™๊ณผ ๊ฒฐ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ ๋ณด์—ฌ์ค„ ๊ฒƒ |
290
+ | โ‘ฃ ์ง๋ฌด์™€์˜ ์—ฐ๊ฒฐ | ์ง๋ฌด์™€ ์—ฐ๊ฒฐ๋œ ๊ฐ€์น˜๊ด€ ์ •๋ฆฝ ๋ฐ ์ ํ•ฉ์„ฑ ์–ดํ•„ | ์œ„ ๊ณผ์ •์—์„œ ํ˜•์„ฑ๋œ ๊ฐ€์น˜๊ด€์ด๋‚˜ ์—ญ๋Ÿ‰์ด ์ง€์› ์ง๋ฌด์— ์ ํ•ฉํ•จ์„ ์„ค๋ช… | '๊ทธ๋ž˜์„œ ์ง€๊ธˆ ์ด ์ง๋ฌด์— ์™œ ์ ํ•ฉํ•œ๊ฐ€?'๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ์—ฐ๊ฒฐ |
291
+
292
+ ๋ชจ๋ฒ”๋‹ต์•ˆ:
293
+ ```markdown
294
+ [๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์ดํ•ดํ•˜๋Š” ๋ฌธ์ œ ์ค‘์‹ฌ ์„ค๊ณ„ ์‚ฌ๊ณ ]
295
+
296
+ ์–ด๋ฆด ๋•Œ๋ถ€ํ„ฐ ์ง€๊ธˆ๊นŒ์ง€ ์ €๋Š” ์ง‘ ์•ˆ์˜ ์ž‘์€ ์ „์ž๊ธฐ๊ธฐ๊ฐ€ ๊ณ ์žฅ ๋‚˜๋ฉด ๊ทธ๋ƒฅ ๋ฒ„๋ฆฌ์ง€ ์•Š๊ณ  ์ง์ ‘ ๋ถ„ํ•ดํ•˜๋ฉฐ ๋‚ด๋ถ€๋ฅผ ์‚ดํŽด๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ๋‹จ์ˆœํžˆ ํ˜ธ๊ธฐ์‹ฌ์œผ๋กœ ํ–ˆ๋˜ ํ–‰๋™์ด ํ•˜๋‹ค ๋ณด๋‹ˆ ์ ์  ์š•์‹ฌ์ด ๋‚˜์„œ ์Šค์Šค๋กœ ์ „์ž๊ธฐ๊ธฐ์˜ ์›๋ฆฌ๋ฅผ ์ฐพ์•„๋ณด๊ณ  ํ•™์Šตํ•ด์„œ '์ˆ˜๋ฆฌ'์— ๋Œ€ํ•œ ์š•์‹ฌ๊นŒ์ง€ ์ƒ๊ธฐ๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.
297
+
298
+ ์ด๋Ÿฐ ์ €์—๊ฒŒ ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ์ค€ ์ธ๋ฌผ์€ ์œ ํŠœ๋ฒ„ 000์ž…๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ ํ˜ธ๊ธฐ์‹ฌ์œผ๋กœ ์ „์ž๊ธฐ๊ธฐ๋ฅผ ๋ถ„ํ•ดํ•  ๋•Œ๋Š” ๊ทธ์ € '์ˆ˜๋ฆฌ'๋ฅผ ์œ„ํ•ด ๋”ฐ๋ผํ–ˆ๋˜ ํ–‰๋™์ธ๋ฐ, ์š•์‹ฌ์ด ๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ๋Š” '๊ตฌ์กฐ๋ฅผ ํŒŒ์•…'ํ•˜๊ธฐ ์œ„ํ•ด ๋ฉด๋ฐ€ํžˆ ์‚ดํŽด๋ณด๋Š” ์Šต๊ด€์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ์œ ํŠœ๋ฒ„ 000์€ "๊ทธ์ € ๋”ฐ๋ผํ•˜์ง€ ๋งˆ์‹œ๊ณ , ์–ด๋–ค ์›๋ฆฌ๋กœ ์ž‘๋™ํ•˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ณ , ์ดํ•ด ํ•˜๋Š”๊ฒŒ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ ์ œํ’ˆ๋„ ์Šค์Šค๋กœ ์ˆ˜๋ฆฌํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค"์ด๋Ÿฐ ๋ง์„ ์ž์ฃผ ํ–ˆ๊ณ , ์ด๋Š” ์ €์˜ ์‚ฌ๊ณ ๋ฐฉ์‹๊ณผ ํ•™์Šต ํƒœ๋„๋ฅผ ๋ฐ”๊ฟ” ๋†“์•˜์Šต๋‹ˆ๋‹ค.
299
+
300
+ ์ „์ž๊ธฐ๊ธฐ์—์„œ ์‹œ์ž‘๋œ ํ˜ธ๊ธฐ์‹ฌ์ด ์ปค์ ธ ์ „์ž๊ณตํ•™์„ ์ „๊ณตํ•˜๊ฒŒ ๋์„ ๋•Œ๋„, ์œ ํŠœ๋ฒ„ 000์˜ ๋ง์„ ์ž์ฃผ ๋– ์˜ฌ๋ ค ํ–‰๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ํšŒ๋กœ์„ค๊ณ„์—์„œ๋„ ๋‹จ์ˆœํžˆ ์„ค๊ณ„๋œ ํšŒ๋กœ๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ํ•˜๊ณ  ๊ฒฐ๊ณผ๋งŒ ํ™•์ธํ•˜๋Š” ์ˆ˜์ค€์ด ์•„๋‹Œ, ๊ธฐ์กด์˜ ๊ตฌ์กฐ ๋ฐฉ์‹์„ ๋– ์˜ฌ๋ฆฌ๊ณ  ์ดํ•ดํ•œ ๋ฐฉ๋ฒ•์„ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. ๋•๋ถ„์— ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ๋„ "๊ธฐ์กด ๊ตฌ์กฐ ๋ฐฉ์‹๊ณผ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋ญ์˜€์ง€? ์ด ๊ตฌ์กฐ์—์„œ๋Š” ์™œ 00๋ฐฉ์‹์„ ์„ ํƒํ–ˆ์ง€? ์ „๋ ฅ ์†Œ๋ชจ๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ตฌ์กฐ๋Š” ์—†์„๊นŒ?"์ด๋Ÿฐ ์งˆ๋ฌธ์„ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋– ์˜ฌ๋ฆฌ๊ณ , ๋‹ค๋ฅธ ํ•™์ƒ๋“ค๋ณด๋‹ค ์‰ฝ๊ฒŒ ๋ฌธ์ œ ํ•ด๊ฒฐ ๏ฟฝ๏ฟฝ์‹์„ ์ฐพ์„ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ํšŒ๋กœ์˜ '๊ธฐ๋Šฅ'๋ฟ ์•„๋‹ˆ๋ผ, 'ํšจ์œจ์„ฑ๊ณผ ๊ตฌ์กฐ์  ์„ค๊ณ„'์— ๋Œ€ํ•œ ๊ณ ๋ฏผ์„ ํ•˜๊ฒŒ ๋˜์—ˆ๊ณ , ๋•๋ถ„์— ์ตœ์šฐ์ˆ˜ ์„ฑ์  ์žฅํ•™์ƒ์ด ๋  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
301
+
302
+ "๊ตฌ์กฐ๋ฅผ ํŒŒ์•…ํ•˜๊ณ  ์ดํ•ดํ•˜๋Š” ๋ฌธ์ œ ์ค‘์‹ฌ ์„ค๊ณ„ ์‚ฌ๊ณ "๋ฅผ ํ†ตํ•ด ๋Š์ž„์—†์ด ํšŒ๋กœ์˜ ๊ตฌ์กฐ์  ํšจ์œจ์„ ํƒ๊ตฌํ•˜๋Š” ์Šต๊ด€์€ ์‚ผ์„ฑ์ „์ž ํšŒ๋กœ๊ฐœ๋ฐœ ์ง๋ฌด์—์„œ๋„ ์‹ค์งˆ์ ์ธ ๊ฒฝ์Ÿ๋ ฅ์œผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
303
+ ```
304
+
305
+ ### ์˜ˆ์‹œ 6 - ๋ณด์œ  ์ง€์‹ ๋ฐ ๊ธฐ์ˆ  (๋ชฉํ‘œ์ง€ํ–ฅํ˜•)
306
+ ์งˆ๋ฌธ: ๋ณด์œ ํ•œ ๊ธฐ์ˆ  ์Šคํƒ(Language, Framework, DB ๋“ฑ)์— ๋Œ€ํ•ด ์ˆ™๋ จ๋„๋ฅผ ํฌํ•จํ•˜์—ฌ ์ƒ์„ธํžˆ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
307
+
308
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
309
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
310
+ | --- | --- | --- | --- |
311
+ | โ‘  ํ•ต์‹ฌ ์—ญ๋Ÿ‰ ์„ ์–ธ | ํ˜„์žฌ ๋ณด์œ ํ•œ ๊ธฐ์ˆ  ์—ญ๋Ÿ‰์„ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝํ•˜๋ฉฐ ๋ชฉํ‘œ ์ง€ํ–ฅ์„ฑ์„ ๊ฐ•์กฐ | ๋‹จ์ˆœํ•œ ๊ฒฝํ—˜ ๋‚˜์—ด์ด ์•„๋‹ˆ๋ผ ๋ชฉํ‘œ์ /์ „๋žต์  ํ•™์Šต์œผ๋กœ ์ ‘๊ทผํ–ˆ์Œ์„ ๋ช…์‹œ | "๊ทธ๋ƒฅ ํ–ˆ๋‹ค" X โ†’ "์ด๊ฑธ ๋ชฉํ‘œ๋กœ ์˜๋„์ ์œผ๋กœ ํ•ด์™”๋‹ค" O |
312
+ | โ‘ก ์‹ค์ „ ์‚ฌ๋ก€ | ์‹ค๋ฌดํ˜• ํ”„๋กœ์ ํŠธ์—์„œ ํ•ด๋‹น ๊ธฐ์ˆ ์„ ์ง์ ‘ ํ™œ์šฉํ•œ ๊ฒฝํ—˜ ์ œ์‹œ | ๋„๊ตฌ ์‚ฌ์šฉ ์ˆ˜์ค€์ด ์•„๋‹ˆ๋ผ ์–ด๋–ป๊ฒŒ ์ ์šฉํ–ˆ๋Š”์ง€๊ฐ€ ๊ตฌ์ฒด์ ์œผ๋กœ ๋“œ๋Ÿฌ๋‚˜์•ผ ํ•จ | ํ”„๋กœ์ ํŠธ ๋ฐฐ๊ฒฝ๊ณผ ๋‚ด ์—ญํ• , ๊ธฐ์ˆ  ํ™œ์šฉ ๋ฐฉ์‹๊นŒ์ง€ ํฌํ•จ |
313
+ | โ‘ข ๋ฌธ์ œ ์ƒํ™ฉ ๋ฐ ๊ทน๋ณต | ํ”„๋กœ์ ํŠธ ๋‚ด ๊ธฐ์ˆ ์  ๋ฌธ์ œ๋‚˜ ํ˜‘์—… ์ด์Šˆ, ์‹œํ–‰์ฐฉ์˜ค ๋“ฑ์„ ํ•ด๊ฒฐํ•œ ๊ฒฝํ—˜ | ๊ธฐ์ˆ ๋งŒ์ด ์•„๋‹Œ ํ˜‘์—…/์†Œํ†ต/๋ฌธ์„œํ™”๊นŒ์ง€ ๋‹ค๋ค„๋„ ์ข‹์Œ | ์‹คํŒจ๋‚˜ ์–ด๋ ค์›€์„ ํšŒํ”ผํ•˜์ง€ ์•Š๊ณ  ๊ทน๋ณตํ•œ ๊ณผ์ • ๊ฐ•์กฐ |
314
+ | โ‘ฃ ๊ธฐ์ˆ  ์—ญ๋Ÿ‰ ์š”์•ฝ | ์ง€๊ธˆ๊นŒ์ง€ ํ•™์Šตํ•œ ๊ธฐ์ˆ  ์Šคํƒ๊ณผ ์ˆ™๋ จ๋„๋ฅผ ์ •๋ฆฌ | ๋‹จ์ˆœ ๋‚˜์—ด์ด ์•„๋‹ˆ๋ผ ์ด์œ ์™€ ์ˆ™๋ จ ์ˆ˜์ค€๊นŒ์ง€ ํ•จ๊ป˜ ์ œ์‹œ | ๊ธฐ์ˆ ๋งˆ๋‹ค ์ˆ™๋ จ๋„/ํ™œ์šฉ ๋ฐฐ๊ฒฝ/์ง€์†์„ฑ ํฌํ•จ๋˜๋ฉด ์‹ ๋ขฐ โ†‘ |
315
+ | โ‘ค ์ง๋ฌด ์—ฐ๊ณ„ ๋ฐ ํฌ๋ถ€ | ๋‚˜์˜ ๊ธฐ์ˆ  ์—ญ๋Ÿ‰์ด ํ•ด๋‹น ์ง๋ฌด์— ์–ด๋–ป๊ฒŒ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์„œ์ˆ  | ๋‹จ์ˆœ ์—ฐ๊ฒฐ X โ†’ ์–ด๋–ค ํŒ€, ์–ด๋–ค ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  ์‹ถ์€์ง€ ๊ตฌ์ฒดํ™” | "๊ธฐ์—ฌ ๊ฐ€๋Šฅ์„ฑ + ์ ์‘๋ ฅ + ์„ฑ์žฅ ์˜์ง€"๊ฐ€ ํ•จ๊ป˜ ๋ณด์ด๋ฉด ์ข‹์Œ |
316
+
317
+ ๋ชจ๋ฒ”๋‹ต์•ˆ:
318
+ ```markdown
319
+ ์ €๋Š” ๋‹จ์ˆœํ•œ ๊ธฐ๋Šฅ ๊ตฌํ˜„์ด ์•„๋‹Œ, ์‹ค๋ฌด์— ๊ฐ€๊นŒ์šด ํ™˜๊ฒฝ ์†์—์„œ ๋ชฉํ‘œ ์ง€ํ–ฅ์ ์œผ๋กœ ๊ฐœ๋ฐœ ์—ญ๋Ÿ‰์„ ์Œ“์•„์™”์Šต๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํ•„์š”ํ•œ ๊ธฐ์ˆ ์€ ๋Š˜ ๋น ๋ฅด๊ฒŒ ๋ฐ”๋€Œ์ง€๋งŒ, ์ €๋Š” ํ”„๋กœ์ ํŠธ ๋‹จ์œ„๋กœ ์‹ค์งˆ์ ์ธ ๋ฌธ์ œ๋ฅผ ์ •์˜ํ•˜๊ณ , ์ด๋ฅผ ๊ธฐ์ˆ ๋กœ ํ•ด๊ฒฐํ•˜๋ฉฐ ์—ญ๋Ÿ‰์„ ๋‹จ๊ณ„์ ์œผ๋กœ ํ™•์žฅํ•ด ์™”์Šต๋‹ˆ๋‹ค.
320
+
321
+ ๋Œ€ํ‘œ์ ์ธ ์‚ฌ๋ก€๋Š” ๋Œ€ํ•™๊ต ํŒ€ ํ”„๋กœ์ ํŠธ๋กœ ์ง„ํ–‰ํ•œ '์บ ํ•‘์žฅ ์˜ˆ์•ฝ ํ”Œ๋žซํผ'์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์—์„œ ์ €๋Š” ๋ฐฑ์—”๋“œ ์ „๋ฐ˜์„ ๋‹ด๋‹นํ•˜๋ฉฐ, ์‚ฌ์šฉ์ž ์ˆ˜ ์ฆ๊ฐ€๋ฅผ ๊ณ ๋ คํ•œ **ํ™•์žฅ ๊ฐ€๋Šฅํ•˜๊ณ  ์•ˆ์ •์ ์ธ ์‹œ์Šคํ…œ ์„ค๊ณ„**๋ฅผ ๋ชฉํ‘œ๋กœ ์„ค์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. Node.js์™€ Express๋ฅผ ํ™œ์šฉํ•ด RESTful API๋ฅผ ๊ตฌ์„ฑํ–ˆ๊ณ , MySQL์„ ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ์„ค๊ณ„ํ•˜๋ฉฐ ๋ฐ์ดํ„ฐ ์ •๊ทœํ™”์™€ ์ฟผ๋ฆฌ ํšจ์œจํ™”์— ์ค‘์ ์„ ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ํด๋ผ์šฐ๋“œ ๋ฐฐํฌ๋Š” AWS EC2์™€ RDS๋กœ ์ง์ ‘ ํ™˜๊ฒฝ์„ ๊ตฌ์„ฑํ•ด ์„œ๋น„์Šค ์•ˆ์ •์„ฑ์„ ํ™•๋ณดํ–ˆ์Šต๋‹ˆ๋‹ค.
322
+
323
+ ์ดˆ๊ธฐ์—๋Š” API ๋ช…์„ธ์™€ ํ˜‘์—… ๋ฐฉ์‹์˜ ๋ฏธํกํ•จ์œผ๋กœ ์ธํ•ด ํ”„๋ก ํŠธ์—”๋“œ์™€ ์žฆ์€ ์ถฉ๋Œ์ด ์žˆ์—ˆ๊ณ , ์„œ๋ฒ„ ์‘๋‹ต ๊ตฌ์กฐ์˜ ๋ถˆ์ผ์น˜๋กœ ์˜ค๋ฅ˜๊ฐ€ ๋ฐ˜๋ณต๋์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด Swagger๋ฅผ ๋„์ž…ํ•ด API ๋ฌธ์„œํ™”๋ฅผ ์ง„ํ–‰ํ•˜๊ณ , Git ๋ธŒ๋žœ์น˜ ์ „๋žต๊ณผ ํ…Œ์ŠคํŠธ ์ž๋™ํ™” ๋„๊ตฌ(Postman ๋“ฑ)๋ฅผ ์ ์šฉํ•ด ํŒ€ ๊ฐ„ ๊ฐœ๋ฐœ ์†๋„๋ฅผ ๋งž์ท„์Šต๋‹ˆ๋‹ค. ์ด ๊ณผ์ •์„ ํ†ตํ•ด ์ €๋Š” **๊ธฐ์ˆ ๋งŒํผ์ด๋‚˜ ์†Œํ†ต๊ณผ ๋ฌธ์„œํ™”๊ฐ€ ๊ฐœ๋ฐœ์˜ ํ•ต์‹ฌ**์ด๋ผ๋Š” ์ ์„ ์ฒด๊ฐํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
324
+
325
+ ์ดํ›„์—๋„ ๊ธฐ์ˆ ์˜ ๊นŠ์ด๋ฅผ ๋„“ํžˆ๊ธฐ ์œ„ํ•ด TypeScript, Nest.js ๋“ฑ์„ ํ•™์Šต ์ค‘์ด๋ฉฐ, ํ˜„์žฌ๊นŒ์ง€ ์ˆ™๋ จ๋œ ์Šคํƒ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
326
+
327
+ - **์–ธ์–ด**: JavaScript (์ค‘์ƒ๊ธ‰), TypeScript (๊ธฐ์ดˆ ์ด์ƒ)
328
+ - **๋ฐฑ์—”๋“œ ํ”„๋ ˆ์ž„์›Œํฌ**: Express.js (์ค‘์ƒ๊ธ‰), Nest.js (ํ•™์Šต ์ค‘)
329
+ - **๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค**: MySQL (์ค‘์ƒ๊ธ‰, ์ •๊ทœํ™” ๋ฐ ์ฟผ๋ฆฌ ์ตœ์ ํ™” ๊ฒฝํ—˜ ๋ณด์œ )
330
+ - **DevOps/ํ˜‘์—…**: AWS EC2/RDS, Git, Swagger, Postman ๋“ฑ ์‹ค๋ฌด ํ™œ์šฉ ๊ฒฝํ—˜
331
+
332
+ ์ €๋Š” ๊ธฐ์ˆ ์„ ๋‹จ์ˆœํžˆ ๊ธฐ๋Šฅ ๊ตฌํ˜„์˜ ๋„๊ตฌ๋กœ ๋ณด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž์˜ ๋ฌธ์ œ๋ฅผ ํŒŒ์•…ํ•˜๊ณ , ๊ธฐ์ˆ ๋กœ ์—ฐ๊ฒฐํ•˜๋ฉฐ, ํ˜‘์—…์„ ํ†ตํ•ด ํ˜„์‹ค์ ์ธ ํ•ด๋ฒ•์„ ๋งŒ๋“ค์–ด๋‚ด๋Š” ๊ณผ์ •์ด ์ง„์งœ ๊ฐœ๋ฐœ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ธฐ์ˆ ๋ ฅ๊ณผ ์‹ค์ „ ๊ฐ๊ฐ์€ ๊ท€์‚ฌ์˜ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์—์„œ๋„ ๋น ๋ฅด๊ฒŒ ์ ์‘ํ•˜๊ณ , ํŒ€ ๋‹จ์œ„ ์„ฑ๊ณผ๋ฅผ ์ฐฝ์ถœํ•˜๋Š” ๋ฐ ๋ถ„๋ช…ํžˆ ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
333
+ ```
334
+
335
+ ### ์˜ˆ์‹œ 7 - ์—ญ๋Ÿ‰ ๊ฐœ๋ฐœ ๊ณผ์ •
336
+ ์งˆ๋ฌธ: ์ง๋ฌด ์ „๋ฌธ์„ฑ์„ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด ์˜์‹์ ์œผ๋กœ ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•ด์™”๋Š”๊ฐ€?
337
+
338
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
339
+ | ๋‹จ๊ณ„ | ํ•ญ๋ชฉ | ์„ค๋ช… | ์ฒดํฌํฌ์ธํŠธ |
340
+ | --- | --- | --- | --- |
341
+ | โ‘  ๊ณ„๊ธฐ ๋ฐ ๋ฐฐ๊ฒฝ | ์ „๋ฌธ์„ฑ์„ ํ‚ค์šฐ๊ธฐ ์œ„ํ•ด ํ•™์Šต์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๋А๋‚€ ๊ณ„๊ธฐ | ์‹ค์ „ ๊ฒฝํ—˜์ด๋‚˜ ์‹คํŒจ, ํ•œ๊ณ„๋ฅผ ๊ฒช์œผ๋ฉฐ ๋А๋‚€ 'ํ•™์Šต์˜ ํ•„์š”์„ฑ' | ๋‹จ์ˆœ ํ˜ธ๊ธฐ์‹ฌ X โ†’ ๋ฌธ์ œ ์ธ์‹ ๋˜๋Š” ํ•„์š” ์˜์‹ ๊ธฐ๋ฐ˜ |
342
+ | โ‘ก ํ•™์Šต ํ™œ๋™ | ํ•™์Šต์„ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ–ˆ๋Š”์ง€ ๊ตฌ์ฒด์  ํ™œ๋™ ์„œ์ˆ  | ๊ต๏ฟฝ๏ฟฝ ์ด์ˆ˜, ํ”„๋กœ์ ํŠธ ์ฐธ์—ฌ, ๋„๊ตฌ ํ•™์Šต, ํ”ผ๋“œ๋ฐฑ ๋“ฑ | ์Šค์Šค๋กœ ์„ ํƒํ•˜๊ณ  ๋ชฐ์ž…ํ•œ ๊ฒฝํ—˜์ด๋ฉด ๋” ์ข‹์Œ |
343
+ | โ‘ข ์ ์šฉ ๋ฐ ์‹ค์ฒœ | ํ•™์Šตํ•œ ๋‚ด์šฉ์„ ์‹ค์ œ ๊ฒฝํ—˜์— ์ ์šฉํ•œ ๊ณผ์ • | ํ•™์Šต-์‹คํ–‰ ์—ฐ๊ฒฐ๊ณ ๋ฆฌ ๋ช…ํ™•ํžˆ ์„ค๋ช… | ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜์˜ค์ง€ ์•Š์•„๋„ ์‹คํ–‰์ด ์ค‘์š” |
344
+ | โ‘ฃ ์„ฑ๊ณผ | ์‹คํ–‰ ํ›„ ์–ด๋–ค ๋ณ€ํ™”๋‚˜ ์„ฑ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”์ง€ | ์ˆ˜์น˜, ๋น„๊ต, ํƒ€์ธ์˜ ํ‰๊ฐ€ ๋“ฑ์œผ๋กœ ์„ค๋“๋ ฅ ๊ฐ•ํ™” | "๊ทธ๋ž˜์„œ ์–ด๋–ค ํšจ๊ณผ๊ฐ€ ์žˆ์—ˆ๋Š”๊ฐ€?"์— ๋‹ตํ•ด์•ผ ํ•จ |
345
+ | โ‘ค ์„ฑ์žฅ ๋ฐ ์—ฐ๊ณ„ | ํ•™์Šต์ด ์–ด๋–ป๊ฒŒ ๋‚ด ์‚ฌ๊ณ ๋ฐฉ์‹/์—ญ๋Ÿ‰์— ์˜ํ–ฅ์„ ๋ฏธ์ณค๋Š”์ง€ | ๋งˆ์ธ๋“œ์…‹ ๋ณ€ํ™”, ์ดํ›„ ํ–‰๋™์˜ ๋ณ€ํ™” | ์ง๋ฌด ์ ํ•ฉ์„ฑ๊ณผ ์—ฐ๊ฒฐ๋˜๋„๋ก ๋งˆ๋ฌด๋ฆฌ |
346
+
347
+ ๋ชจ๋ฒ”๋‹ต์•ˆ:
348
+ ```markdown
349
+ ๋Œ€ํ•™๊ต 2ํ•™๋…„ ์‹œ์ ˆ, ์ €๋Š” ํ•œ ์ง€์—ญ ์†Œ์ƒ๊ณต์ธ ์—ฐํ•ฉํšŒ์—์„œ ์ฃผ์ตœํ•œ SNS ๋งˆ์ผ€ํŒ… ์„œํฌํ„ฐ์ฆˆ ํ™œ๋™์— ์ฐธ์—ฌํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ธ๊ทผ ์Œ์‹์ ์„ ๋Œ€์ƒ์œผ๋กœ ํ™๋ณด ์ฝ˜ํ…์ธ ๋ฅผ ๊ธฐํšํ•˜๊ณ  ์šด์˜ํ•˜๋Š” ํ”„๋กœ์ ํŠธ์˜€๋Š”๋ฐ, ๋ฉ”๋‰ด ์‚ฌ์ง„์„ ์˜ฌ๋ฆฌ๊ณ  ํ•ด์‹œํƒœ๊ทธ๋งŒ ๋ถ™์ด๋ฉด ๋  ์ค„ ์•Œ์•˜๋˜ ์ €์˜ ์ƒ๊ฐ์€ ๊ธˆ์„ธ ๊นจ์กŒ์Šต๋‹ˆ๋‹ค. ์ฝ˜ํ…์ธ ๋ฅผ ์•„๋ฌด๋ฆฌ ์˜ฌ๋ ค๋„ ์กฐํšŒ์ˆ˜์™€ ๋ฐ˜์‘์€ ๋ฏธ๋ฏธํ–ˆ๊ณ , ์‚ฌ์žฅ๋‹˜๋“ค์€ ๊ฒฐ๊ณผ๋ฅผ ๊ถ๊ธˆํ•ดํ•˜๋ฉฐ ์šฐ๋ฆฌ ํŒ€์„ ์žฌ์ด‰ํ–ˆ์Šต๋‹ˆ๋‹ค.
350
+
351
+ ๊ทธ๋•Œ ์ €์—๊ฒŒ ๊นŠ์€ ์ธ์‚ฌ์ดํŠธ๋ฅผ ์ค€ ์ธ๋ฌผ์€ ๋‹น์‹œ ํ™œ๋™์„ ์ด๊ด„ํ•˜๋˜ ๋งˆ์ผ€ํŒ… ์‹ค๋ฌด ๋ฉ˜ํ† ์˜€์Šต๋‹ˆ๋‹ค. ๊ทธ๋Š” "์†Œ๋น„์ž์˜ ๋ˆˆ๋†’์ด์—์„œ ์ถœ๋ฐœํ•˜์ง€ ์•Š๋Š” ์ฝ˜ํ…์ธ ๋Š” ์•„๋ฌด๋ฆฌ ์ •์„ฑ ๋“ค์—ฌ๋„ ์˜๋ฏธ ์—†๋‹ค"๋ฉฐ, ์†Œ๋น„์ž ๊ด€์ ์—์„œ ์ ‘๊ทผํ•˜๋Š” ๋ฒ•์„ ์•Œ๋ ค์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ณ ๊ฐ์ด ์–ธ์ œ, ์™œ, ์–ด๋–ค ๋ชฉ์ ์œผ๋กœ ์ด ๊ฐ€๊ฒŒ๋ฅผ ๋ฐฉ๋ฌธํ• ์ง€๋ฅผ ์ค‘์‹ฌ์œผ๋กœ ์‚ฌ๊ณ ํ•˜๋Š” ๋ฒ•์„ ๋ฐฐ์šฐ๋ฉด์„œ, ๋‹จ์ˆœ ํ™๋ณด๊ฐ€ ์•„๋‹Œ **๋ฌธ์ œ ํ•ด๊ฒฐํ˜• ๋งˆ์ผ€ํŒ…**์ด ๋ฌด์—‡์ธ์ง€ ์ฒ˜์Œ์œผ๋กœ ์‹ค๊ฐํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค.
352
+
353
+ ์ดํ›„ ์ €๋Š” ์Œ์‹์  ๋ฐฉ๋ฌธ ๊ณ ๊ฐ์„ ์ง์ ‘ ๊ด€์ฐฐํ•˜๊ณ  ๊ฐ„๋‹จํ•œ ์ธํ„ฐ๋ทฐ๋ฅผ ์ง„ํ–‰ํ•ด ์ฃผ์š” ๊ณ ๊ฐ์ธต์„ ํŒŒ์•…ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ถ„์„ ๊ฒฐ๊ณผ, '์ง์žฅ์ธ ์ ์‹ฌ ์ˆ˜์š”'๊ฐ€ ํ•ต์‹ฌ์ด๋ผ๋Š” ์ ์„ ๋„์ถœํ•ด, ๋ฉ”๋‰ด๋ณ„ ๋Œ€๊ธฐ ์‹œ๊ฐ„๊ณผ ํ˜ผ๋ฐฅ ์ขŒ์„ ์—ฌ๋ถ€๋ฅผ ์ฝ˜ํ…์ธ ์— ๋ฐ˜์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ธ์Šคํƒ€๊ทธ๋žจ ํ”ผ๋“œ๋ฅผ ํ™œ์šฉํ•œ '์˜ค๋Š˜์˜ ์ ์‹ฌ ์ถ”์ฒœ' ์ฝ˜ํ…์ธ ๋ฅผ ๊ธฐํšํ•˜๊ณ  ๊ฒŒ์‹œํ•œ ๊ฒฐ๊ณผ, ๊ฐ€๊ฒŒ ์ธก์œผ๋กœ๋ถ€ํ„ฐ "์ด์ „๋ณด๋‹ค ์ ์‹ฌ ๋งค์ถœ์ด ๋ˆˆ์— ๋„๊ฒŒ ๋Š˜์—ˆ๋‹ค"๋Š” ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›์•˜๊ณ , ๊ฒŒ์‹œ๋ฌผ ํ‰๊ท  ์กฐํšŒ์ˆ˜๋„ 2๋ฐฐ ์ด์ƒ ์ƒ์Šนํ–ˆ์Šต๋‹ˆ๋‹ค.
354
+
355
+ ์ด ๊ฒฝํ—˜์€ ๋งˆ์ผ€ํŒ…์„ ๋‹จ์ˆœ ์ฝ˜ํ…์ธ  ์ œ์ž‘์ด ์•„๋‹Œ **๊ณ ๊ฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์„ ์œ„ํ•œ ๋„๊ตฌ**๋กœ ๋ฐ”๋ผ๋ณด๋Š” ๊ด€์ ์„ ๊ธธ๋Ÿฌ์ฃผ์—ˆ์Šต๋‹ˆ๋‹ค. ์ดํ›„ ๊ต๋‚ด ๋งˆ์ผ€ํŒ… ํ”„๋กœ์ ํŠธ, ๊ตฌ๊ธ€ ์• ๋„๋ฆฌํ‹ฑ์Šค ๋ฐ SNS ๋ถ„์„ ๋„๊ตฌ ํ•™์Šต ๋“ฑ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜์˜ ์ „๋žต์  ์‚ฌ๊ณ ๋ ฅ์„ ๊ฐ•ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฅ์˜ ์‹œ๊ฐ๊ณผ ๋””์ง€ํ„ธ ์—ญ๋Ÿ‰์„ ํ•จ๊ป˜ ๊ฐ–์ถ˜ ์ €๋Š”, ๊ณ ๊ฐ๊ณผ ์‹œ์žฅ์„ ๋™์‹œ์— ์ดํ•ดํ•˜๊ณ  ์„ค๋“ํ•  ์ˆ˜ ์žˆ๋Š” ๋งˆ์ผ€ํŒ… ์ธ์žฌ๋กœ์„œ ๋ˆ„๊ตฌ๋ณด๋‹ค ๋น ๋ฅด๊ฒŒ ์„ฑ๊ณผ๋ฅผ ์ฐฝ์ถœํ•  ์ž์‹ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
356
+ ```
357
+
358
+ ### ์ถ”๋ก 
359
+ ์งˆ๋ฌธ: {question}
360
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ: {guideline}
361
+ ํšŒ์‚ฌ ์ด๋ฆ„: {company_name}
362
+ ์ง€์› ์ง๋ฌด: {job_position}
363
+ ๊ฒฝ๋ ฅ ์ˆ˜์ค€: {experience_level}
364
+ ๊ธ€์ž์ˆ˜ ์ œํ•œ: {word_limit}
365
+ ๋Œ€ํ™” ๋‚ด์šฉ: {conversation}
366
+
367
+ ๋ชจ๋ฒ”๋‹ต์•ˆ:
368
+
example_info.json ADDED
@@ -0,0 +1,19 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "company_name": "์นด์นด์˜ค",
3
+ "industry": "IT/์†Œํ”„ํŠธ์›จ์–ด",
4
+ "position_title": "๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž",
5
+ "core_values": "ํ˜์‹ ์„ฑ, ํ˜‘์—…๋Šฅ๋ ฅ, ๋„์ „์ •์‹ ",
6
+ "company_size": "๋Œ€๊ธฐ์—…",
7
+ "context_report": "์นด์นด์˜ค๋Š” ์ตœ๊ทผ ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ์ „ํ™˜์„ ์ง„ํ–‰ ์ค‘์ด๋ฉฐ, ํ˜์‹ ๊ณผ ํ˜‘์—…์„ ์ค‘์‹œํ•˜๋Š” ๊ธฐ์—… ๋ฌธํ™”๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.",
8
+ "jd": "๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ์„œ ๋Œ€๊ทœ๋ชจ ํŠธ๋ž˜ํ”ฝ ์ฒ˜๋ฆฌ, ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์„ค๊ณ„ ๋ฐ ์šด์˜, RESTful API ๊ฐœ๋ฐœ ๊ฒฝํ—˜์ด ์š”๊ตฌ๋ฉ๋‹ˆ๋‹ค.",
9
+ "recent_issue": "ํด๋ผ์šฐ๋“œ ๊ธฐ๋ฐ˜ ๋งˆ์ดํฌ๋กœ์„œ๋น„์Šค ์•„ํ‚คํ…์ฒ˜๋กœ์˜ ์ „ํ™˜ ์ง„ํ–‰ ์ค‘",
10
+ "student_name": "๊น€์ฒ ์ˆ˜",
11
+ "student_major": "์ปดํ“จํ„ฐ๊ณตํ•™๊ณผ",
12
+ "student_status": "4ํ•™๋…„",
13
+ "experience_summary": "ํ•™๋ถ€ ์‹œ์ ˆ ๋‹ค์–‘ํ•œ ํŒ€ ํ”„๋กœ์ ํŠธ์™€ ์ธํ„ด ๊ฒฝํ—˜์„ ํ†ตํ•ด ํ˜‘์—…๊ณผ ๋ฌธ์ œ ํ•ด๊ฒฐ ๋Šฅ๋ ฅ์„ ํ‚ค์› ์œผ๋ฉฐ, ๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ ๊ด€๋ จ ํ”„๋กœ์ ํŠธ๋ฅผ ๋‹ค์ˆ˜ ์ˆ˜ํ–‰ํ•˜์˜€์Šต๋‹ˆ๋‹ค.",
14
+ "guide": "- ์„ฑ์žฅ ๊ณผ์ •: ์ง€์›์ž์˜ ๊ฐ€์น˜๊ด€์— ์˜ํ–ฅ์„ ๋ฏธ์นœ ๊ฒฐ์ •์ ์ธ ๊ฒฝํ—˜์ด๋‚˜ ์‚ฌ๊ฑด์— ๋Œ€ํ•ด ์งˆ๋ฌธํ•˜์—ฌ, ์‚ถ์˜ ํƒœ๋„์™€ ์‹ ๋…์„ ํŒŒ์•…ํ•ฉ๋‹ˆ๋‹ค.\\n- ๊ฐ•์ : ์ง๋ฌด์™€ ๊ด€๋ จ๋œ ํ•ต์‹ฌ ๊ฐ•์ ์„ ์„ ์ •ํ•˜๊ณ , ๊ทธ ๊ฐ•์ ์„ ์ฆ๋ช…ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์ฒด์ ์ธ ๊ฒฝํ—˜๊ณผ ์‚ฌ๋ก€๋ฅผ ๋“ค์–ด ์„ค๋ช…ํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.\\n- ๋‹จ์ : ์†”์งํ•˜์ง€๋งŒ ์น˜๋ช…์ ์ด์ง€ ์•Š์€ ๋‹จ์ ์„ ์–ธ๊ธ‰ํ•˜๊ณ , ์ด๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•˜๊ณ  ์žˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช…ํ•˜๋„๋ก ์œ ๋„ํ•ฉ๋‹ˆ๋‹ค.",
15
+ "questions": [
16
+ "๋ณธ์ธ์˜ ์„ฑ์žฅ ๊ณผ์ •๊ณผ ์„ฑ๊ฒฉ์˜ ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ์„œ์ˆ ํ•˜์‹œ์˜ค."
17
+ ]
18
+ }
19
+
guide_generation/__init__.py ADDED
@@ -0,0 +1 @@
 
 
1
+ # This file can be empty. It marks the directory as a Python package.
guide_generation/__pycache__/__init__.cpython-312.pyc ADDED
Binary file (161 Bytes). View file
 
guide_generation/__pycache__/llm_functions.cpython-312.pyc ADDED
Binary file (5.93 kB). View file
 
guide_generation/guide_generation_report_20250625_090910.html ADDED
The diff for this file is too large to render. See raw diff
 
guide_generation/llm_functions.py ADDED
@@ -0,0 +1,133 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from openai import OpenAI
2
+ from dotenv import load_dotenv
3
+ import yaml
4
+ import os
5
+ import json
6
+ import re
7
+
8
+ load_dotenv()
9
+
10
+ client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
11
+
12
+ # load prompt
13
+ try:
14
+ current_dir = os.path.dirname(os.path.abspath(__file__))
15
+ prompt_path = os.path.join(current_dir, 'prompt.yaml')
16
+ with open(prompt_path, "r", encoding='utf-8') as file:
17
+ prompt = yaml.safe_load(file)["prompt"]
18
+ except Exception as e:
19
+ print(f"Warning: prompt.yaml ๋กœ๋“œ ์‹คํŒจ. ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜: {e}")
20
+ prompt = "Question: {question}\nJD: {jd}\nCompany: {company_name}\nExperience: {experience_level}\nGenerate a guide based on this information in markdown table format."
21
+
22
+
23
+ def parse_json_from_response(text: str) -> dict | None:
24
+ """
25
+ Markdown ์ฝ”๋“œ ๋ธ”๋ก ์•ˆ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” JSON ๋ฌธ์ž์—ด์„ ์ถ”์ถœํ•˜๊ณ  ํŒŒ์‹ฑํ•ฉ๋‹ˆ๋‹ค.
26
+
27
+ Deprecated: ์ด ํ•จ์ˆ˜๋Š” JSON ํŒŒ์‹ฑ์šฉ์ด๋ฏ€๋กœ guide generation์—์„œ๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
28
+
29
+ Args:
30
+ text (str): LLM์ด ๋ฐ˜ํ™˜ํ•œ ์ „์ฒด ํ…์ŠคํŠธ ์‘๋‹ต.
31
+
32
+ Returns:
33
+ dict | None: ํŒŒ์‹ฑ๋œ ๋”•์…”๋„ˆ๋ฆฌ ๊ฐ์ฒด, ๋˜๋Š” ์‹คํŒจ ์‹œ None.
34
+ """
35
+ if not text:
36
+ return None
37
+
38
+ # ```json ... ``` ๋˜๋Š” ``` ... ``` ํ˜•์‹์˜ ์ฝ”๋“œ ๋ธ”๋ก์—์„œ JSON ์ถ”์ถœ
39
+ match = re.search(r"```(?:json)?\s*([\s\S]*?)\s*```", text)
40
+ if match:
41
+ json_str = match.group(1)
42
+ else:
43
+ # ์ฝ”๋“œ ๋ธ”๋ก์ด ์—†๋‹ค๋ฉด, ์ „์ฒด ํ…์ŠคํŠธ๋ฅผ JSON์œผ๋กœ ๊ฐ€์ •
44
+ json_str = text
45
+
46
+ try:
47
+ return json.loads(json_str)
48
+ except json.JSONDecodeError:
49
+ # ์ „์ฒด ํŒŒ์‹ฑ์ด ์‹คํŒจํ•˜๋ฉด, ์ฒซ '{'์™€ ๋งˆ์ง€๋ง‰ '}'๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๋‹ค์‹œ ์‹œ๋„
50
+ start_index = json_str.find('{')
51
+ end_index = json_str.rfind('}')
52
+ if start_index != -1 and end_index != -1 and start_index < end_index:
53
+ potential_json = json_str[start_index:end_index+1]
54
+ try:
55
+ return json.loads(potential_json)
56
+ except json.JSONDecodeError:
57
+ pass # ์ด๋งˆ์ €๋„ ์‹คํŒจํ•˜๋ฉด ๊ทธ๋ƒฅ None ๋ฐ˜ํ™˜
58
+
59
+ return None
60
+
61
+ def parse_markdown_table_from_response(text: str) -> str:
62
+ """
63
+ LLM ์‘๋‹ต์—์„œ ๋งˆํฌ๋‹ค์šด ํ…Œ์ด๋ธ”์„ ์ถ”์ถœํ•˜์—ฌ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
64
+
65
+ Args:
66
+ text (str): LLM์ด ๋ฐ˜ํ™˜ํ•œ ์ „์ฒด ํ…์ŠคํŠธ ์‘๋‹ต.
67
+
68
+ Returns:
69
+ str: ์ถ”์ถœ๋œ ๋งˆํฌ๋‹ค์šด ํ…Œ์ด๋ธ” ๋ฌธ์ž์—ด, ์‹คํŒจ ์‹œ ์ „์ฒด ํ…์ŠคํŠธ ๋ฐ˜ํ™˜
70
+ """
71
+ if not text:
72
+ return ""
73
+
74
+ # ๋งˆํฌ๋‹ค์šด ์ฝ”๋“œ ๋ธ”๋ก์—์„œ ํ…Œ์ด๋ธ” ์ถ”์ถœ ์‹œ๋„
75
+ markdown_match = re.search(r"```(?:markdown)?\s*([\s\S]*?)\s*```", text)
76
+ if markdown_match:
77
+ return markdown_match.group(1).strip()
78
+
79
+ # ํ…Œ์ด๋ธ” ํŒจํ„ด ์ง์ ‘ ์ฐพ๊ธฐ (| ... | ... | ํ˜•ํƒœ)
80
+ lines = text.split('\n')
81
+ table_lines = []
82
+ in_table = False
83
+
84
+ for line in lines:
85
+ line = line.strip()
86
+ if '|' in line and ('๋‹จ๊ณ„' in line or '---' in line or 'โ‘ ' in line):
87
+ in_table = True
88
+ table_lines.append(line)
89
+ elif in_table and '|' in line:
90
+ table_lines.append(line)
91
+ elif in_table and not line:
92
+ # ๋นˆ ์ค„์ด๋ฉด ํ…Œ์ด๋ธ” ๋
93
+ break
94
+
95
+ if table_lines:
96
+ return '\n'.join(table_lines)
97
+
98
+ # ํ…Œ์ด๋ธ”์„ ์ฐพ์ง€ ๋ชปํ–ˆ์œผ๋ฉด ์ „์ฒด ํ…์ŠคํŠธ ๋ฐ˜ํ™˜
99
+ return text.strip()
100
+
101
+ def generate_guide(question, jd, company_name, experience_level):
102
+ """
103
+ ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋ฌธํ•ญ ๊ฐ€์ด๋“œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , ๋งˆํฌ๋‹ค์šด ํ…Œ์ด๋ธ”๊ณผ ์ „์ฒด ์‘๋‹ต ๊ฐ์ฒด๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜
104
+ """
105
+ try:
106
+ response = client.chat.completions.create(
107
+ model="gpt-4o-mini",
108
+ messages=[{"role": "user", "content": prompt.format(question=question, jd=jd, company_name=company_name, experience_level=experience_level)}],
109
+ # response_format์„ ์ œ๊ฑฐํ•˜์—ฌ ์ผ๋ฐ˜ ํ…์ŠคํŠธ ์‘๋‹ต์„ ๋ฐ›์Œ
110
+ )
111
+
112
+ # ๋งˆํฌ๋‹ค์šด ํ…Œ์ด๋ธ” ํŒŒ์‹ฑ
113
+ guide_content = parse_markdown_table_from_response(response.choices[0].message.content)
114
+
115
+ # ํ˜ธํ™˜์„ฑ์„ ์œ„ํ•ด ๋”•์…”๋„ˆ๋ฆฌ ํ˜•ํƒœ๋กœ ๋ฐ˜ํ™˜
116
+ guide_dict = {"guide": guide_content}
117
+ return guide_dict, response
118
+
119
+ except Exception as e:
120
+ print(f"๊ฐ€์ด๋“œ ์ƒ์„ฑ ๋˜๋Š” ํŒŒ์‹ฑ ์ค‘ ์˜ค๋ฅ˜ ๋ฐœ์ƒ: {e}")
121
+ return {"error": f"Failed to generate or parse guide: {str(e)}", "guide": ""}, None
122
+
123
+
124
+ if __name__ == "__main__":
125
+ example_input = {
126
+ "question": "์‚ผ์„ฑ์ „์ž๋ฅผ ์ง€์›ํ•œ ์ด์œ ์™€ ์ž…์‚ฌ ํ›„ ์ด๋ฃจ๊ณ  ์‹ถ์€ ๊ฟˆ์„ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.",
127
+ "jd": "์‚ผ์„ฑ์ „์ž๋Š” ์„ธ๊ณ„์ ์ธ ๊ธฐ์ˆ  ๊ธฐ์—…์œผ๋กœ, ๋‹ค์–‘ํ•œ ๋ถ„์•ผ์—์„œ ์„ ๋„์ ์ธ ๊ธฐ์ˆ ์„ ๊ฐœ๋ฐœํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž๋กœ ์ž…์‚ฌํ•˜๋ฉด ๋‹ค์–‘ํ•œ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•˜๋ฉฐ, ์ตœ์‹  ๊ธฐ์ˆ ์„ ์ ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ๊ฐœ์„ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.",
128
+ "company_name": "์‚ผ์„ฑ์ „์ž",
129
+ "experience_level": "์‹ ์ž…"
130
+ }
131
+ guide_dict, _ = generate_guide(**example_input)
132
+ print("Guide content:")
133
+ print(guide_dict.get("guide", "No guide generated"))
guide_generation/prompt.yaml ADDED
@@ -0,0 +1,220 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ prompt: >
2
+ ์ฃผ์–ด์ง„ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ์ž์†Œ์„œ ๋‹ต๋ณ€ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑํ•˜์‹œ์˜ค.
3
+
4
+ ### ์ถœ๋ ฅ ํ˜•์‹
5
+ ๋ฐ˜๋“œ์‹œ ๋‹ค์Œ markdown ํ˜•์‹์œผ๋กœ๋งŒ ์‘๋‹ตํ•˜์„ธ์š”:
6
+
7
+ <์งˆ๋ฌธ ๋ถ„๋ฅ˜>
8
+
9
+ ```markdown
10
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
11
+ | --- | --- |
12
+ | โ‘  ... | ... |
13
+ | โ‘ก ... | ... |
14
+ | โ‘ข ... | ... |
15
+ | โ‘ฃ ... | ... |
16
+ | โ‘ค ... | ... |
17
+ ```
18
+
19
+ ## ์˜ˆ์‹œ
20
+
21
+ ### ์˜ˆ์‹œ 1 - ์ง€์›๋™๊ธฐ ์œ ํ˜•
22
+ ์งˆ๋ฌธ: ํ˜„๋Œ€์ž๋™์ฐจ์— ์ง€์›ํ•˜๊ฒŒ ๋œ ๋™๊ธฐ์™€ ํ•ด๋‹น ์ง๋ฌด์— ๋ณธ์ธ์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
23
+
24
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
25
+ ```markdown
26
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
27
+ | --- | --- |
28
+ | โ‘  Why: ๊ด€์‹ฌ ๊ณ„๊ธฐ | ์ง๋ฌด/๋ถ„์•ผ์— ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ๋œ ๊ณ„๊ธฐ๋‚˜ ๊ฒฝํ—˜ (์–ด๋ฆด ๋•Œ, ํ•™์ฐฝ์‹œ์ ˆ, ๋Œ€ํ•™ ์‹œ์ ˆ ๋“ฑ) |
29
+ | โ‘ก How: ์ค€๋น„ ๊ณผ์ • | ๊ด€๋ จ ์ง๋ฌด๋ฅผ ๊ฒฝํ—˜ํ•œ ์‚ฌ๋ก€ (ํ”„๋กœ์ ํŠธ, ์ธํ„ด, ์‹ค์Šต, ์•„๋ฅด๋ฐ”์ดํŠธ ๋“ฑ) โ†’ ๋ฌด์—‡์„ ๋А๋ผ๊ณ  ๋ฐฐ์› ๋Š”์ง€ |
30
+ | โ‘ข Why Us: ๊ธฐ์—… ์„ ํƒ ์ด์œ  | ๋งŽ์€ ๊ธฐ์—… ์ค‘ **์™œ ์ด ํšŒ์‚ฌ์ธ์ง€**, ์ง๋ฌด์™€ ์—ฐ๊ณ„๋œ ์ด์œ , ๊ธฐ์—…์— ๋Œ€ํ•œ ์ดํ•ด๋„ |
31
+ | โ‘ฃ Future: ์ž…์‚ฌ ํ›„ ํฌ๋ถ€ | ์ง๋ฌด์—์„œ ์„ฑ์žฅํ•ด๋‚˜๊ฐˆ ๊ตฌ์ฒด์ ์ธ ๊ณ„ํš, ์ด๋ฅผ ํ†ตํ•ด ์–ด๋–ค ๊ธฐ์—ฌ๋ฅผ ํ•  ์ˆ˜ ์žˆ์„์ง€ |
32
+ ```
33
+
34
+ ### ์˜ˆ์‹œ 2 - ์ง๋ฌด์—ญ๋Ÿ‰ ๋ฐ ์ „๋ฌธ์„ฑ ์œ ํ˜•
35
+ ์งˆ๋ฌธ: ์ง€์›ํ•œ ์ง๋ฌด์™€ ๊ด€๋ จ๋œ ๊ฐ€์žฅ ๋Œ€ํ‘œ์ ์ธ ํ”„๋กœ์ ํŠธ ๊ฒฝํ—˜์„ ๋ณธ์ธ์˜ ์—ญํ• ๊ณผ ๊ธฐ์—ฌ ์œ„์ฃผ๋กœ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
36
+
37
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
38
+ ```markdown
39
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
40
+ | --- | --- |
41
+ | โ‘  ์ง๋ฌด์— ๊ด€์‹ฌ์„ ๊ฐ–๊ฒŒ ๋œ ๊ณ„๊ธฐ | ์ด ์ง๋ฌด๋ฅผ ์ฒ˜์Œ ๊ด€์‹ฌ ๊ฐ–๊ฒŒ ๋œ ์‚ฌ๊ฑด/๊ฒฝํ—˜ (๋Œ€ํ•™ ์ˆ˜์—…, ๊ณผ์ œ, ์‚ฌ๋žŒ, ๋ฌธ์ œ์˜์‹ ๋“ฑ) |
42
+ | โ‘ก ์ง๋ฌด๋ฅผ ์ง์ ‘ ๊ฒฝํ—˜ํ•œ ์‚ฌ๋ก€ | ์ธํ„ด, ํ”„๋กœ์ ํŠธ, ๋Œ€์™ธํ™œ๋™ ๋“ฑ์—์„œ ํ•ด๋‹น ์ง๋ฌด๋ฅผ ์ง์ ‘ ํ•ด๋ณธ ์‚ฌ๋ก€ |
43
+ | โ‘ข ์—ญ๋Ÿ‰ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•œ ๋…ธ๋ ฅ | ๊ด€๋ จ ์ง€์‹/์Šคํ‚ฌ์„ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•œ ์  (๊ณต๋ถ€, ์ž๊ฒฉ์ฆ, ํฌํŠธํด๋ฆฌ์˜ค, ๋ฐ˜๋ณต ์‹œ๋„ ๋“ฑ) |
44
+ | โ‘ฃ ๊ทธ ๊ฒฐ๊ณผ ๋‚˜ํƒ€๋‚œ ์„ฑ๊ณผ๋‚˜ ์„ฑ์žฅ | ์ง๋ฌด ์ˆ˜ํ–‰ ๊ณผ์ •์—์„œ ๊ฒช์€ ๊ตฌ์ฒด์ ์ธ ์„ฑ๊ณผ or ์Šค์Šค๋กœ ์„ฑ์žฅํ•œ ๋ถ€๋ถ„ |
45
+ | โ‘ค ํ•ด๋‹น ๊ธฐ์—…์—์„œ ์ด ์ง๋ฌด๋ฅผ ํ•˜๊ณ  ์‹ถ์€ ์ด์œ  | (์„ ํƒ) ์ด ํšŒ์‚ฌ์—์„œ ์ด ์ง๋ฌด๋ฅผ ํ•˜๊ณ  ์‹ถ์€ ์ด์œ , ๊ธฐ์—…์— ๋Œ€ํ•œ ์ดํ•ด ํฌํ•จ |
46
+ ```
47
+
48
+ ### ์˜ˆ์‹œ 3 - ํ˜‘์—…/๊ฐˆ๋“ฑ ํ•ด๊ฒฐ ๊ฒฝํ—˜ ์œ ํ˜•
49
+ ์งˆ๋ฌธ: ํŒ€์˜ ์ผ์›์œผ๋กœ์„œ ๋‹ค๋ฅธ ์‚ฌ๋žŒ๋“ค๊ณผ ํ˜‘๋ ฅํ•˜์—ฌ ์„ฑ๊ณผ๋ฅผ ๋‚ธ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ๊ธฐ์ˆ ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.
50
+
51
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
52
+ ```markdown
53
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
54
+ | --- | --- |
55
+ | โ‘  ์ƒํ™ฉ (Context) | ์–ธ์ œ, ์–ด๋–ค ๋งฅ๋ฝ์—์„œ, ๋ˆ„๊ตฌ์™€ ์–ด๋–ค ๋ชฉํ‘œ๋ฅผ ์œ„ํ•ด ํ˜‘์—…ํ–ˆ๋Š”๊ฐ€ |
56
+ | โ‘ก ๋ฌธ์ œ (Obstacle) | ํ˜‘์—… ์ค‘์— ๋ฐœ์ƒํ•œ ๊ฐˆ๋“ฑ, ๋ฌธ์ œ, ์žฅ์• ์š”์†Œ๋Š” ๋ฌด์—‡์ด์—ˆ๋Š”๊ฐ€ |
57
+ | โ‘ข ๋ถ„์„ ๋ฐ ํ–‰๋™ (Solution) | ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ–ˆ๊ณ , ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์†Œํ†ตํ•˜๊ณ  ํ•ด๊ฒฐํ–ˆ๋Š”๊ฐ€ |
58
+ | โ‘ฃ ๊ฒฐ๊ณผ (Outcome) | ๊ทธ ํ•ด๊ฒฐ๋ฐฉ์‹์ด ์–ด๋–ค ๊ฒฐ๊ณผ๋ฅผ ๋งŒ๋“ค์—ˆ๋Š”๊ฐ€ (์ˆ˜์น˜/๋ณ€ํ™”/๋ถ„์œ„๊ธฐ ๋“ฑ) |
59
+ | โ‘ค ๊ตํ›ˆ ๋ฐ ์ ์šฉ (Value) | ์ด ๊ฒฝํ—˜์—์„œ ๋ฌด์—‡์„ ๋ฐฐ์› ๊ณ , ๊ทธ ๋ฐฐ์›€์„ ์ง๋ฌด์— ์–ด๋–ป๊ฒŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ์„๊นŒ |
60
+ ```
61
+
62
+ ### ์˜ˆ์‹œ 4 - ์žฅ๋‹จ์  ์œ ํ˜• (์žฅ์ )
63
+ ์งˆ๋ฌธ: ๋ณธ์ธ์˜ ๊ฐ•์ ๊ณผ ์•ฝ์ ์„ ์„ค๋ช…ํ•˜๊ณ , ์•ฝ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ–ˆ๋Š”์ง€ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
64
+
65
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ (์žฅ์  ๋ถ€๋ถ„):
66
+ ```markdown
67
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
68
+ | --- | --- |
69
+ | โ‘  ์žฅ์  ํ•œ ๋ฌธ์žฅ | ์ง๋ฌด์— ํ•„์š”ํ•œ ์„ฑ๊ฒฉ/์—ญ๋Ÿ‰ ๊ธฐ๋ฐ˜ ๊ฐ•์  |
70
+ | โ‘ก ๊ด€๋ จ ์ƒํ™ฉ | ์•„๋ฅด๋ฐ”์ดํŠธ, ํ”„๋กœ์ ํŠธ ๋“ฑ ์ง๋ฌด์™€ ์œ ์‚ฌํ•œ ๋งฅ๋ฝ |
71
+ | โ‘ข ๋‚˜์˜ ์—ญํ• /ํ–‰๋™ | ๋ณธ์ธ์˜ ์•ก์…˜์ด ๋“œ๋Ÿฌ๋‚˜๋„๋ก ๊ตฌ์ฒด์ ์œผ๋กœ, ์ˆ˜์น˜ ๊ธฐ๋ฐ˜์ด๋ฉด ๋” ์ข‹์Œ |
72
+ | โ‘ฃ ๊ฒฐ๊ณผ ๋ฐ ํ‰๊ฐ€ | ์„ฑ๊ณผ, ์ธ์ •, ๊ณ ๊ฐ/์ƒ์‚ฌ ๋ฐ˜์‘ ๋“ฑ ์™ธ๋ถ€ ํ”ผ๋“œ๋ฐฑ ์ค‘์‹ฌ |
73
+ ```
74
+
75
+ ### ์˜ˆ์‹œ 5 - ์žฅ๋‹จ์  ์œ ํ˜• (๋‹จ์ )
76
+ ์งˆ๋ฌธ: ๋ณธ์ธ์˜ ๊ฐ•์ ๊ณผ ์•ฝ์ ์„ ์„ค๋ช…ํ•˜๊ณ , ์•ฝ์ ์„ ๋ณด์™„ํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ–ˆ๋Š”์ง€ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
77
+
78
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ (๋‹จ์  ๋ถ€๋ถ„):
79
+ ```markdown
80
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
81
+ | --- | --- |
82
+ | โ‘  ๋‹จ์  ํ•œ ๋ฌธ์žฅ | ์ง๋ฌด์ƒ ๋‹จ์ ์ด์ง€๋งŒ ๊ทน๋ณต ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ์„ฑ๊ฒฉ |
83
+ | โ‘ก ๋ฌธ์ œ ์ƒํ™ฉ/์‹คํŒจ ๊ฒฝํ—˜ | ๋‹จ์ ์ด ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์—ˆ๋˜ ๊ตฌ์ฒด์  ๊ฒฝํ—˜ |
84
+ | โ‘ข ์›์ธ ์ธ์‹ | ์™œ ๊ทธ๋Ÿฐ ํ–‰๋™์„ ํ–ˆ๋Š”์ง€, ์–ด๋–ค ๋ถ€๋ถ„์ด ๋ถ€์กฑํ–ˆ๋Š”์ง€ |
85
+ | โ‘ฃ ๊ฐœ์„ ๋œ ํ–‰๋™ ์‚ฌ๋ก€ | ๊ทธ ์ดํ›„ ์œ ์‚ฌํ•œ ์ƒํ™ฉ์—์„œ ๋‹ฌ๋ผ์ง„ ํ–‰๋™๊ณผ ๊ฒฐ๊ณผ |
86
+ | โ‘ค ์ง€์† ๋…ธ๋ ฅ | ์™„์ „ํžˆ ๊ทน๋ณตํ•œ ๊ฑด ์•„๋‹ˆ์ง€๋งŒ ๊ณ„์† ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๋Š” ๋ชจ์Šต |
87
+ ```
88
+
89
+ ### ์˜ˆ์‹œ 6 - ์„ฑ๊ณต ๊ฒฝํ—˜/๋„์ „ ๊ฒฝํ—˜ ์œ ํ˜•
90
+ ์งˆ๋ฌธ: ์Šค์Šค๋กœ ๋†’์€ ๋ชฉํ‘œ๋ฅผ ์„ธ์šฐ๊ณ  ๋ˆ์งˆ๊ธฐ๊ฒŒ ๋…ธ๋ ฅํ•˜์—ฌ ์„ฑ์ทจํ•œ ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์„œ์ˆ ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.
91
+
92
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
93
+ ```markdown
94
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
95
+ | --- | --- |
96
+ | โ‘  ๋„์ „ ๋ฐฐ๊ฒฝ | ์–ธ์ œ, ์–ด๋””์„œ, ๋ฌด์—‡์„ ์œ„ํ•ด ๋„์ „ํ–ˆ๋Š”๊ฐ€ (์ƒํ™ฉ๊ณผ ๋ชฉํ‘œ) |
97
+ | โ‘ก ๋ฌธ์ œ ์ธ์‹ | ๊ณผ์ • ์ค‘ ์–ด๋–ค ๋ฌธ์ œ๊ฐ€ ์žˆ์—ˆ๋Š”๊ฐ€ (ํ˜„์‹ค์  ์žฅ์• ๋ฌผ) |
98
+ | โ‘ข ํ•ด๊ฒฐ ๊ณผ์ • | ๋ฌธ์ œ๋ฅผ ์–ด๋–ป๊ฒŒ ๋ถ„์„ํ•˜๊ณ  ์–ด๋–ค ํ•ด๊ฒฐ์ฑ…์„ ์‹คํ–‰ํ–ˆ๋Š”๊ฐ€ |
99
+ | โ‘ฃ ๊ฒฐ๊ณผ ๋ฐ ์„ฑ๊ณผ | ๋„์ „์ด ์–ด๋–ค ์„ฑ๊ณผ๋กœ ์ด์–ด์กŒ๋Š”๊ฐ€ (์ •๋Ÿ‰์ ์ด๋ฉด ๋” ์ข‹์Œ) |
100
+ | โ‘ค ๊ตํ›ˆ ๋ฐ ์ ์šฉ | ์ด ๊ฒฝํ—˜์—์„œ ๋ฌด์—‡์„ ๋ฐฐ์› ๊ณ , ์ง๋ฌด์™€ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”๊ฐ€ |
101
+ ```
102
+
103
+ ### ์˜ˆ์‹œ 7 - ์‹คํŒจ๊ฒฝํ—˜ ์œ ํ˜•
104
+ ์งˆ๋ฌธ: ๊ฐ€์žฅ ํฐ ์‹คํŒจ๋ฅผ ๊ฒฝํ—˜ํ•˜๊ณ , ์ด๋ฅผ ๊ทน๋ณตํ•˜๋Š” ๊ณผ์ •์—์„œ ๋ฌด์—‡์„ ๋ฐฐ์› ๋Š”์ง€ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
105
+
106
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
107
+ ```markdown
108
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
109
+ | --- | --- |
110
+ | โ‘  ์‹คํŒจ ์ƒํ™ฉ | ์–ธ์ œ, ์–ด๋””์„œ, ๋ฌด์—‡์„ ํ•˜๋‹ค ์‹คํŒจํ–ˆ๋Š”์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์„œ์ˆ  |
111
+ | โ‘ก ๋‹น์‹œ์˜ ์ƒ๊ฐ๊ณผ ํ–‰๋™ | ์™œ ๊ทธ๋Ÿฐ ๊ฒฐ์ •์„ ํ–ˆ๊ณ , ์–ด๋–ค ํ–‰๋™์„ ํ–ˆ๋Š”์ง€ โ†’ **์‹คํŒจ์˜ ์›์ธ**์„ ๋‚˜ ์ž์‹ ์—๊ฒŒ์„œ ์ฐพ๊ธฐ |
112
+ | โ‘ข ๊นจ๋‹ฌ์Œ ๋ฐ ๋ฐ˜์„ฑ | ์‹คํŒจ ์ดํ›„ ์–ด๋–ค ์ ์„ ๊นจ๋‹ฌ์•˜๋Š”์ง€ |
113
+ | โ‘ฃ ์ดํ›„์˜ ๋ณ€ํ™”๋œ ํ–‰๋™ | ์œ ์‚ฌํ•œ ์ƒํ™ฉ์—์„œ ์–ด๋–ป๊ฒŒ ๋‹ฌ๋ผ์ง„ ๋ฐฉ์‹์œผ๋กœ ๋Œ€์‘ํ–ˆ๋Š”์ง€ |
114
+ | โ‘ค ์ง๋ฌด์™€์˜ ์—ฐ๊ฒฐ | ์ด ์‹คํŒจ ๊ฒฝํ—˜์ด ์–ด๋–ป๊ฒŒ ์ง๋ฌด์— ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋Š”์ง€ |
115
+ ```
116
+
117
+ ### ์˜ˆ์‹œ 8 - ์„ฑ์žฅ๊ณผ์ •/์„ฑ์žฅ๋ฐฐ๊ฒฝ ์œ ํ˜•
118
+ ์งˆ๋ฌธ: ํ˜„์žฌ์˜ ์ž์‹ ์—๊ฒŒ ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ฏธ์นœ ์‚ฌ๊ฑด์ด๋‚˜ ์ธ๋ฌผ์„ ํฌํ•จํ•˜์—ฌ ์„ฑ์žฅ๊ณผ์ •์„ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
119
+
120
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
121
+ ```markdown
122
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
123
+ | --- | --- |
124
+ | โ‘  ์˜ํ–ฅ ๋ฐ›์€ ๋ฐฐ๊ฒฝ | ์–ด๋ฆฐ ์‹œ์ ˆ, ๊ฐ€์ •ํ™˜๊ฒฝ, ์‚ฌ๊ฑด, ์ธ๋ฌผ ๋“ฑ |
125
+ | โ‘ก ๊ฐ€์น˜๊ด€ ๋˜๋Š” ํƒœ๋„์˜ ํ˜•์„ฑ | ์œ„ ๊ฒฝํ—˜์„ ํ†ตํ•ด ์–ด๋–ค ์ƒ๊ฐ/์„ฑํ–ฅ์ด ๋งŒ๋“ค์–ด์กŒ๋Š”์ง€ |
126
+ | โ‘ข ์ง๋ฌด์—ญ๋Ÿ‰๊ณผ์˜ ์—ฐ๊ฒฐ | ํ˜•์„ฑ๋œ ๊ฐ€์น˜๊ด€/์„ฑํ–ฅ์ด ์ง๋ฌด์— ์–ด๋–ป๊ฒŒ ์—ฐ๊ด€๋˜๋Š”์ง€ |
127
+ | โ‘ฃ ํ˜„์žฌ์˜ ๋‚˜๋กœ ์—ฐ๊ฒฐ | ํ˜„์žฌ ๋‚ด๊ฐ€ ์–ด๋–ป๊ฒŒ ํ–‰๋™ํ•˜๊ณ  ์„ฑ์žฅํ•˜๊ณ  ์žˆ๋Š”์ง€ |
128
+ ```
129
+
130
+ ### ์˜ˆ์‹œ 9 - ์ธ๋ฌผ์ด๋‚˜ ์‚ฌ๊ฑด ์œ ํ˜•
131
+ ์งˆ๋ฌธ: ๋‹น์‹ ์˜ ์ธ์ƒ์— ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ์ค€ ์ธ๋ฌผ์ด๋‚˜ ์‚ฌ๊ฑด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
132
+
133
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
134
+ ```markdown
135
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
136
+ | --- | --- |
137
+ | โ‘  ์ธ๋ฌผ/์‚ฌ๊ฑด ์†Œ๊ฐœ | ๋‚˜์—๊ฒŒ ์˜ํ–ฅ์„ ์ค€ ์ธ๋ฌผ ๋˜๋Š” ์‚ฌ๊ฑด์ด ๋ฌด์—‡์ธ์ง€ ๊ตฌ์ฒด์ ์œผ๋กœ ์†Œ๊ฐœ |
138
+ | โ‘ก ๊ทธ ๋‹น์‹œ์˜ ๋‚˜ | ๊ทธ ์ „์˜ ๋‚˜์˜ ํƒœ๋„/๊ด€์ ์€ ์–ด๋• ๋Š”์ง€, ์™œ ๊ทธ ์ธ๋ฌผ์ด ํŠน๋ณ„ํ–ˆ๋Š”์ง€ |
139
+ | โ‘ข ๋ณ€ํ™”์˜ ๊ณ„๊ธฐ | ์–ด๋–ค ๊ณ„๊ธฐ๋กœ, ์–ด๋–ค ์ƒ๊ฐ/๊ฐ€์น˜/ํ–‰๋™์ด ๋ฐ”๋€Œ๊ฒŒ ๋˜์—ˆ๋Š”์ง€ |
140
+ | โ‘ฃ ์‹ค์ œ ๋ณ€ํ™”๋œ ํ–‰๋™ | ์ดํ›„ ๋ณ€ํ™”๊ฐ€ ์‹ค์ œ ํ–‰๋™๊ณผ ๊ฒฐ๊ณผ๋กœ ์–ด๋–ป๊ฒŒ ์ด์–ด์กŒ๋Š”์ง€ |
141
+ | โ‘ค ์ง๋ฌด์™€์˜ ์—ฐ๊ฒฐ | ์ด๋Ÿฐ ๋ณ€ํ™”๊ฐ€ ์ง€๊ธˆ์˜ ์ง๋ฌด ์—ญ๋Ÿ‰์— ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€ |
142
+ ```
143
+
144
+ ### ์˜ˆ์‹œ 10 - ์ž…์‚ฌ ํ›„ ๋ชฉํ‘œ/ํฌ๋ถ€ ์œ ํ˜•
145
+ ์งˆ๋ฌธ: ์ž…์‚ฌ ํ›„ 5๋…„, 10๋…„ ๋’ค ์ด๋ฃจ๊ณ  ์‹ถ์€ ๋ชฉํ‘œ๋Š” ๋ฌด์—‡์ด๋ฉฐ, ์ด๋ฅผ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•  ๊ฒƒ์ธ์ง€ ๊ธฐ์ˆ ํ•˜์‹œ์˜ค.
146
+
147
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
148
+ ```markdown
149
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
150
+ | --- | --- |
151
+ | โ‘  ๋ชฉํ‘œ ํ•œ ๋ฌธ์žฅ | ๋‚ด๊ฐ€ ๋˜๊ณ  ์‹ถ์€ ๋ชจ์Šต, ์ด๋ฃจ๊ณ  ์‹ถ์€ ๋ชฉํ‘œ๋ฅผ ํ•œ ๋ฌธ์žฅ์œผ๋กœ ์š”์•ฝ |
152
+ | โ‘ก ๋‹จ๊ธฐ ์‹คํ–‰ ๊ณ„ํš | ์ž…์‚ฌ ์งํ›„ ๋ฐ”๋กœ ์‹ค์ฒœ ๊ฐ€๋Šฅํ•œ ํ–‰๋™ ์ค‘์‹ฌ ๊ณ„ํš |
153
+ | โ‘ข ์ค‘์žฅ๊ธฐ ๋ชฉํ‘œ | 3~5๋…„ ์•ˆ์— ์ด๋ฃจ๊ณ  ์‹ถ์€ ์„ฑ๊ณผ/์—ญํ• /์—ญ๋Ÿ‰ |
154
+ | โ‘ฃ ์‹คํ–‰ ์ „๋žต | ๊ทธ ๋ชฉํ‘œ๋ฅผ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•  ๊ฒƒ์ธ์ง€ ๊ตฌ์ฒด์ ์ธ ๋ฐฉ๋ฒ• |
155
+ | โ‘ค ๋‚˜์˜ ์˜์ง€์™€ ์ž ์žฌ๋ ฅ | ๋‚˜๋Š” ์™œ ์ด ๋ชฉํ‘œ๋ฅผ ์ด๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ธ๊ฐ€? โ†’ ์„ฑ์žฅ ๊ฐ€๋Šฅ์„ฑ๊ณผ ํƒœ๋„ |
156
+ ```
157
+
158
+ ### ์˜ˆ์‹œ 11 - ํ˜์‹ ์—ญ๋Ÿ‰/๊ธฐ์กด ๋ฐฉ์‹ ๊ฐœ์„  ๊ฒฝํ—˜ ์œ ํ˜•
159
+ ์งˆ๋ฌธ: ๊ธฐ์กด ๋ฐฉ์‹์˜ ๋น„ํšจ์œจ์„ฑ์„ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด ์•„์ด๋””์–ด๋ฅผ ์ œ์•ˆํ•˜๊ณ  ์ ์šฉํ–ˆ๋˜ ๊ฒฝํ—˜์„ ์“ฐ์‹œ์˜ค.
160
+
161
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
162
+ ```markdown
163
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
164
+ | --- | --- |
165
+ | โ‘  ํ•œ ๋ฌธ์žฅ ์š”์•ฝ | ๋ฌธ์ œ ํ•ด๊ฒฐ ํ˜น์€ ๊ฐœ์„ ํ–ˆ๋˜ ๊ฒฝํ—˜์„ ํ•ต์‹ฌ ๋ฌธ์žฅ์œผ๋กœ ์ œ์‹œ |
166
+ | โ‘ก ๋ฌธ์ œ ์ƒํ™ฉ | ๊ธฐ์กด ๋ฐฉ์‹์˜ ๋น„ํšจ์œจ, ์˜ค๋ฅ˜, ๋ฐ˜๋ณต๋˜๋Š” ๋ฌธ์ œ ๋“ฑ โ†’ ๊ตฌ์ฒด์ ์œผ๋กœ ์„œ์ˆ  |
167
+ | โ‘ข ๊ฐ€์„ค ๋ฐ ์›์ธ ๋ถ„์„ | ์›์ธ์„ ๋‚˜๋ฆ„๋Œ€๋กœ ๋ถ„์„ํ•˜๊ณ , ์‹คํ—˜/๋น„๊ต/๊ด€์ฐฐ ๋“ฑ์œผ๋กœ ๊ฒ€์ฆํ•œ ๋ฐฉ์‹ |
168
+ | โ‘ฃ ์‹คํ–‰ํ•œ ํ–‰๋™ | ๊ตฌ์ฒด์ ์œผ๋กœ ๋ฌด์—‡์„ ๋ฐ”๊พธ์—ˆ๋Š”์ง€, ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ๊ฐœ์„ ํ–ˆ๋Š”์ง€ |
169
+ | โ‘ค ์„ฑ๊ณผ ๋ฐ ์™ธ๋ถ€ ํ‰๊ฐ€ | ๊ฒฐ๊ณผ ์ˆ˜์น˜, ๋ณ€ํ™”๋œ ํ™˜๊ฒฝ, ์ƒ์‚ฌ/์‚ฌ์šฉ์ž์˜ ํ”ผ๋“œ๋ฐฑ ๋“ฑ |
170
+ | โ‘ฅ ์ง๋ฌด ์—ฐ๊ฒฐ ๋ฐ ์˜๊ฒฌ | ์ด ๊ฒฝํ—˜์ด ์ง€์›ํ•œ ์ง๋ฌด์— ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋˜๋Š”์ง€ + ๋‚˜์˜ ๊ด€์  |
171
+ ```
172
+
173
+ ### ์˜ˆ์‹œ 12 - ํšŒ์‚ฌ์‚ฐ์—…์ง€์‹ ์œ ํ˜•
174
+ ์งˆ๋ฌธ: ๋‹น์‚ฌ ์„œ๋น„์Šค์˜ ์žฅ๋‹จ์ ์„ ๋ถ„์„ํ•˜๊ณ , ๊ฐœ์„  ๋ฐฉ์•ˆ์„ ์ œ์•ˆํ•ด ์ฃผ์‹ญ์‹œ์˜ค.
175
+
176
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
177
+ ```markdown
178
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
179
+ | --- | --- |
180
+ | โ‘  ํšŒ์‚ฌ/์‚ฐ์—…์˜ ์žฅ์  | ๋‚ด๊ฐ€ ๋А๋‚€ ์ฐจ๋ณ„์ , ๊ฐ•์  ๋“ฑ์„ ์š”์•ฝ (๋„ˆ๋ฌด ๋ป”ํ•˜๊ฑฐ๋‚˜ ์ถ”์ƒ์ ์ธ ๋ง์€ ํ”ผํ•˜๊ธฐ) |
181
+ | โ‘ก ๋‹จ์  ๋˜๋Š” ๊ฐœ์„  ์—ฌ์ง€ | ๊ฒฝ์Ÿ์‚ฌ ๋Œ€๋น„ ๋ถ€์กฑํ•œ ์ , ์ด์šฉ ๊ฒฝํ—˜์—์„œ ๋А๋‚€ ๋ถˆํŽธํ•จ ๋“ฑ โ†’ ๊ฐ๊ด€์ ์œผ๋กœ ์„œ์ˆ  |
182
+ | โ‘ข ๊ตฌ์ฒด์ ์ธ ์•„์ด๋””์–ด ์ œ์•ˆ | ๋‹จ์  ๋ณด์™„ ๋˜๋Š” ๊ฒฝ์Ÿ๋ ฅ ๊ฐ•ํ™”๋ฅผ ์œ„ํ•œ ๋ณธ์ธ์˜ ์•„์ด๋””์–ด ์ œ์‹œ |
183
+ | โ‘ฃ ์ง๋ฌด์™€์˜ ์—ฐ๊ฒฐ | ์ œ์•ˆํ•œ ์•„์ด๋””์–ด๋ฅผ ๋‚ด๊ฐ€ ๋งก์„ ์ง๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ์‹คํ˜„ํ•  ์ˆ˜ ์žˆ์„์ง€ ์—ฐ๊ฒฐ |
184
+ | โ‘ค ๊ธฐ์—ฌ ํฌ๋ถ€ | ์ด ํšŒ์‚ฌ๋ฅผ ์–ด๋–ป๊ฒŒ ๋” ์ข‹์€ ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋Œ๊ณ  ์‹ถ์€์ง€ ๋งˆ๋ฌด๋ฆฌ |
185
+ ```
186
+
187
+ ### ์˜ˆ์‹œ 13 - ๊ฐ€์น˜๊ด€ ์œ ํ˜•
188
+ ์งˆ๋ฌธ: ๋‹น์‚ฌ์˜ ํ•ต์‹ฌ๊ฐ€์น˜(๋„์ „, ํ˜‘๋ ฅ, ์‹ ๋ขฐ) ์ค‘ ๋ณธ์ธ์„ ๊ฐ€์žฅ ์ž˜ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ€์น˜์™€ ๊ทธ ์ด์œ ๋ฅผ ๊ฒฝํ—˜์„ ๋“ค์–ด ์„ค๋ช…ํ•˜์‹œ์˜ค.
189
+
190
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
191
+ ```markdown
192
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
193
+ | --- | --- |
194
+ | โ‘  ๊ฐ€์น˜๊ด€ ์„ ํƒ | ํšŒ์‚ฌ๊ฐ€ ์ œ์‹œํ•œ ๊ฐ€์น˜ ์ค‘, ๋ณธ์ธ์˜ ์„ฑํ–ฅ/๊ฐ•์ /์ง๋ฌด์™€ ์—ฐ๊ฒฐ๋˜๋Š” ๊ฒƒ์„ ์„ ํƒ |
195
+ | โ‘ก ๊ฐ€์น˜๊ด€์„ ํ˜•์„ฑํ•œ ๊ฒฝํ—˜ | ์™œ ๊ทธ ๊ฐ€์น˜๊ด€์ด ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋Š”์ง€ โ€“ ๊ฒฝํ—˜์  ๊ณ„๊ธฐ ์ค‘์‹ฌ |
196
+ | โ‘ข ๊ฐ€์น˜๊ด€ ์‹ค์ฒœ ๊ณผ์ • | ์‹ค์ œ๋กœ ๊ทธ ๊ฐ€์น˜๊ด€์„ ๋ฐ˜์˜ํ•ด ํ–‰๋™ํ•œ ๊ตฌ์ฒด์  ์‚ฌ๋ก€ |
197
+ | โ‘ฃ ๊ฒฐ๊ณผ ๋ฐ ํ‰๊ฐ€ | ๊ทธ ํ–‰๋™์œผ๋กœ ์–ด๋–ค ๊ฒฐ๊ณผ๊ฐ€ ๋‚˜ํƒ€๋‚ฌ๋Š”์ง€, ์™ธ๋ถ€ ํ”ผ๋“œ๋ฐฑ์ด ์žˆ๋‹ค๋ฉด ํ•จ๊ป˜ |
198
+ | โ‘ค ์ง๋ฌด/์กฐ์ง ์—ฐ๊ฒฐ | ์ด ๊ฐ€์น˜๊ด€์ด ์ง€์›ํ•œ ์ง๋ฌด์—์„œ ์–ด๋–ป๊ฒŒ ๋„์›€์ด ๋ ์ง€, ์กฐ์ง๊ณผ์˜ ์ปฌ์ฒ˜ํ• ๊ฐ•์กฐ |
199
+ ```
200
+
201
+ ### ์˜ˆ์‹œ 14 - ์‚ฌํšŒ์ด์Šˆ ์œ ํ˜•
202
+ ์งˆ๋ฌธ: ์ตœ๊ทผ ๊ด€์‹ฌ์„ ๊ฐ–๊ณ  ์žˆ๋Š” ์‚ฌํšŒ์  ์ด์Šˆ๊ฐ€ ์žˆ๋‹ค๋ฉด ๋ณธ์ธ์˜ ๊ฒฌํ•ด์™€ ํ•จ๊ป˜ ์„ค๋ช…ํ•˜์‹œ์˜ค.
203
+
204
+ ๋‹ต๋ณ€ ๊ตฌ์กฐ:
205
+ ```markdown
206
+ | ๋‹จ๊ณ„ | ์„ค๋ช… |
207
+ | --- | --- |
208
+ | โ‘  ์ด์Šˆ ์„ ํƒ ๋ฐ ์š”์•ฝ | ํ˜„์žฌ ์‚ฌํšŒ์ ยท์‚ฐ์—…์ ์œผ๋กœ ์ค‘์š”ํ•œ ์ด์Šˆ 1๊ฐ€์ง€ ์„ ํƒ |
209
+ | โ‘ก ์ด์Šˆ์˜ ์ค‘์š”์„ฑ | ์™œ ์ด ์ด์Šˆ๊ฐ€ ์ค‘์š”ํ•œ์ง€, ์‚ฌํšŒ์™€ ์‚ฐ์—…์— ๋ฏธ์น˜๋Š” ์˜ํ–ฅ |
210
+ | โ‘ข ๊ฒฝํ—˜ ๊ธฐ๋ฐ˜์˜ ๊ฒฌํ•ด | ์ด ์ด์Šˆ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋ฉฐ, ๊ด€๋ จ ๊ฒฝํ—˜์ด ์žˆ๋‹ค๋ฉด ์†Œ๊ฐœ |
211
+ | โ‘ฃ ์ง๋ฌด/์ง์—…๊ด€ ์—ฐ๊ฒฐ | ์ด ์ด์Šˆ๋ฅผ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์ง๋ฌด์— ๋ฐ˜์˜ํ•˜๊ฑฐ๋‚˜ ํ™œ์šฉํ•˜๊ณ  ์‹ถ์€์ง€ |
212
+ | โ‘ค ๊ฐ€์น˜๊ด€/์˜์ง€ ํ‘œํ˜„ | ๋‚ด๊ฐ€ ๊ฐ€์ง„ ๋ฌธ์ œ์˜์‹, ์•ž์œผ๋กœ์˜ ํƒœ๋„/์ค€๋น„/๊ฐ์˜ค ๋“ฑ |
213
+ ```
214
+
215
+ ### ์ถ”๋ก 
216
+ ์งˆ๋ฌธ: {question}
217
+ Job Description: {jd}
218
+ ํšŒ์‚ฌ ์ด๋ฆ„: {company_name}
219
+ ๊ฒฝ๋ ฅ ์ˆ˜์ค€: {experience_level}
220
+ ๋‹ต๋ณ€ ๊ฐ€์ด๋“œ๋ผ์ธ:
guide_generation/test.py ADDED
@@ -0,0 +1,153 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import os
2
+ import random
3
+ import datetime
4
+ import json
5
+ import multiprocessing
6
+ import sys
7
+ from tqdm import tqdm
8
+
9
+ # ์ƒ์œ„ ๋””๋ ‰ํ† ๋ฆฌ์˜ utils.py๋ฅผ importํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๋กœ ์ถ”๊ฐ€
10
+ sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
11
+ from utils import track_api_cost
12
+ from llm_functions import generate_guide
13
+
14
+ # ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ ํ™˜๊ฒฝ ๋ณ€์ˆ˜ ๋กœ๋“œ (ํ•„์š”์‹œ)
15
+ try:
16
+ from dotenv import load_dotenv
17
+ load_dotenv()
18
+ except ImportError:
19
+ pass
20
+
21
+ # ์˜ˆ์ œ ๋ฐ์ดํ„ฐ
22
+ example_companies = ["์‚ผ์„ฑ์ „์ž", "์นด์นด์˜ค", "๋„ค์ด๋ฒ„", "์ฟ ํŒก", "ํ† ์Šค", "ํ˜„๋Œ€์ž๋™์ฐจ", "CJ์ œ์ผ์ œ๋‹น", "ํ•˜์ด๋ธŒ"]
23
+ example_jobs_jds = {
24
+ "๋ฐฑ์—”๋“œ ๊ฐœ๋ฐœ์ž": "Spring Boot, JPA, MySQL ๊ฒฝํ—˜์ž. MSA ํ™˜๊ฒฝ ๊ฒฝํ—˜ ์šฐ๋Œ€. ํด๋ผ์šฐ๋“œ(AWS) ํ™˜๊ฒฝ ๋ฐฐํฌ ๋ฐ ์šด์˜ ๊ฒฝํ—˜์ž.",
25
+ "ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž": "React, TypeScript, Redux ์‚ฌ์šฉ. ๋ฐ˜์‘ํ˜• ์›น ๊ฐœ๋ฐœ ๊ฒฝํ—˜ ํ•„์ˆ˜. UI/UX์— ๋Œ€ํ•œ ์ดํ•ด๋„๊ฐ€ ๋†’์€ ๋ถ„.",
26
+ "๋ฐ์ดํ„ฐ ๋ถ„์„๊ฐ€": "SQL, Python(Pandas, Scikit-learn) ํ™œ์šฉ ๋Šฅ๋ ฅ. ํ†ต๊ณ„์  ์ง€์‹๊ณผ ๋ฐ์ดํ„ฐ ์‹œ๊ฐํ™”(Tableau ๋“ฑ) ๋Šฅ๋ ฅ.",
27
+ "ํ”„๋กœ๋•ํŠธ ๋งค๋‹ˆ์ €(PM)": "IT ํ”„๋กœ๋•ํŠธ ๊ธฐํš ๋ฐ ๊ด€๋ฆฌ ๊ฒฝํ—˜. ์‚ฌ์šฉ์ž ์Šคํ† ๋ฆฌ ์ž‘์„ฑ, ๋ฐฑ๋กœ๊ทธ ๊ด€๋ฆฌ. ๋ฐ์ดํ„ฐ ๊ธฐ๋ฐ˜ ์˜์‚ฌ๊ฒฐ์ • ๋Šฅ๋ ฅ.",
28
+ "๋งˆ์ผ€ํ„ฐ": "๋””์ง€ํ„ธ ๋งˆ์ผ€ํŒ…(SA, DA, SEO) ๊ฒฝํ—˜. ์ฝ˜ํ…์ธ  ๊ธฐํš ๋ฐ ์ œ์ž‘, ์„ฑ๊ณผ ๋ถ„์„. SNS ์ฑ„๋„ ์šด์˜ ๊ฒฝํ—˜."
29
+ }
30
+ example_questions = {
31
+ "์ง€์›๋™๊ธฐ": "{company_name}์— ์ง€์›ํ•œ ๋™๊ธฐ์— ๋Œ€ํ•ด ๊ธฐ์ˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค.",
32
+ "์„ฑ์žฅ๊ณผ์ •": "๋ณธ์ธ์˜ ์„ฑ์žฅ๊ณผ์ •์„ ๊ฐ„๋žตํžˆ ๊ธฐ์ˆ ํ•˜๋˜ ํ˜„์žฌ์˜ ์ž์‹ ์—๊ฒŒ ๊ฐ€์žฅ ํฐ ์˜ํ–ฅ์„ ๋ผ์นœ ์‚ฌ๊ฑด, ์ธ๋ฌผ ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ๊ธฐ์ˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค.",
33
+ "์ง๋ฌด์—ญ๋Ÿ‰": "{job_title} ์ง๋ฌด ์ˆ˜ํ–‰์— ํ•„์š”ํ•œ ์—ญ๋Ÿ‰์€ ๋ฌด์—‡์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฉฐ, ์ด๋ฅผ ๊ฐ–์ถ”๊ธฐ ์œ„ํ•ด ์–ด๋–ค ๋…ธ๋ ฅ์„ ํ•ด์™”๋Š”์ง€ ๊ธฐ์ˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค.",
34
+ "์ž…์‚ฌํ›„ํฌ๋ถ€": "์ž…์‚ฌ ํ›„ 10๋…„ ๋™์•ˆ์˜ ํšŒ์‚ฌ์ƒํ™œ ์‹œ๋‚˜๋ฆฌ์˜ค์™€ ๊ทธ๊ฒƒ์„ ์ถ”๊ตฌํ•˜๋Š” ์ด์œ ๋ฅผ ๊ธฐ์ˆ ํ•ด์ฃผ์‹ญ์‹œ์˜ค."
35
+ }
36
+ experience_levels = ["์‹ ์ž…", "๊ฒฝ๋ ฅ", "์ธํ„ด"]
37
+
38
+ NUM_TESTS = 100
39
+ NUM_PROCESSES = 10
40
+ MODEL_NAME = "gpt-4o-mini"
41
+
42
+ def run_test(test_input_with_id):
43
+ """๊ฐœ๋ณ„ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” ์›Œ์ปค ํ•จ์ˆ˜"""
44
+ test_id, test_input = test_input_with_id
45
+ total_cost = 0
46
+ error_message = ""
47
+ status = "โœ… Success"
48
+
49
+ try:
50
+ parsed_guide, response = generate_guide(**test_input)
51
+
52
+ if response and hasattr(response, 'usage'):
53
+ total_cost = track_api_cost(response, MODEL_NAME, None)
54
+
55
+ if "error" in parsed_guide or not parsed_guide:
56
+ status = "โŒ Failure"
57
+ error_message = str(parsed_guide.get("error", "Unknown failure"))
58
+
59
+ return {
60
+ "id": test_id,
61
+ "input": test_input,
62
+ "parsed_result": parsed_guide,
63
+ "error": error_message,
64
+ "cost": total_cost,
65
+ "status": status,
66
+ }
67
+ except Exception as e:
68
+ return {
69
+ "id": test_id,
70
+ "input": test_input,
71
+ "parsed_result": {},
72
+ "error": f"Exception: {str(e)}",
73
+ "cost": total_cost,
74
+ "status": "โŒ Error"
75
+ }
76
+
77
+ def main():
78
+ """ํ…Œ์ŠคํŠธ๋ฅผ ์ค€๋น„, ์‹คํ–‰ํ•˜๊ณ  ๋ณด๊ณ ์„œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฉ”์ธ ํ•จ์ˆ˜"""
79
+ print(f"์ด {NUM_TESTS}๊ฐœ์˜ ํ…Œ์ŠคํŠธ๋ฅผ {NUM_PROCESSES}๊ฐœ ํ”„๋กœ์„ธ์Šค๋กœ ๋ณ‘๋ ฌ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค...")
80
+
81
+ test_inputs = []
82
+ for i in range(NUM_TESTS):
83
+ company = random.choice(example_companies)
84
+ job_title, jd = random.choice(list(example_jobs_jds.items()))
85
+ question_type, question_template = random.choice(list(example_questions.items()))
86
+ question = question_template.format(company_name=company, job_title=job_title)
87
+ experience = random.choice(experience_levels)
88
+
89
+ test_input = {
90
+ "company_name": company,
91
+ "jd": jd,
92
+ "question": question,
93
+ "experience_level": experience
94
+ }
95
+ test_inputs.append((i + 1, test_input))
96
+
97
+ results = []
98
+ with multiprocessing.Pool(processes=NUM_PROCESSES) as pool:
99
+ with tqdm(total=NUM_TESTS, desc="๊ฐ€์ด๋“œ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ") as pbar:
100
+ for result in pool.imap_unordered(run_test, test_inputs):
101
+ results.append(result)
102
+ pbar.update()
103
+
104
+ results.sort(key=lambda x: x['id'])
105
+ print("๋ชจ๋“  ํ…Œ์ŠคํŠธ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
106
+
107
+ now = datetime.datetime.now()
108
+ report_filename = f"guide_generation_report_{now.strftime('%Y%m%d_%H%M%S')}.html"
109
+
110
+ failure_count = sum(1 for r in results if "Success" not in r["status"])
111
+ total_cost = sum(r['cost'] for r in results)
112
+ failure_rate = (failure_count / NUM_TESTS) * 100 if NUM_TESTS > 0 else 0
113
+
114
+ html_template = """
115
+ <!DOCTYPE html><html lang="ko"><head><meta charset="UTF-8"><title>๊ฐ€์ด๋“œ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ ๋ณด๊ณ ์„œ</title>
116
+ <style>body{{font-family:sans-serif;margin:20px;}} h1,h2{{text-align:center;}} .summary{{border:1px solid #ddd;padding:20px;margin-bottom:20px;}} table{{width:100%;border-collapse:collapse;}} th,td{{border:1px solid #ddd;padding:8px;text-align:left;vertical-align:top;}} th{{background-color:#f2f2f2;}} .status-success{{color:green;font-weight:bold;}} .status-failure{{color:red;font-weight:bold;}} pre{{white-space:pre-wrap;word-wrap:break-word;background-color:#f9f9f9;padding:10px;border:1px solid #ddd;}} .container{{max-width:1400px;margin:auto;}}</style>
117
+ </head><body><div class="container"><h1>๊ฐ€์ด๋“œ ์ƒ์„ฑ ํ…Œ์ŠคํŠธ ๋ณด๊ณ ์„œ</h1><div class="summary"><h2>์š”์•ฝ</h2><p><strong>ํ…Œ์ŠคํŠธ ์‹œ๊ฐ„:</strong> {now}</p><p><strong>์ด ํ…Œ์ŠคํŠธ ์ˆ˜:</strong> {total_tests}</p><p><strong>์„ฑ๊ณต:</strong> {success_count}</p><p><strong>์‹คํŒจ/์—๋Ÿฌ:</strong> {failure_count}</p><p><strong>์‹คํŒจ์œจ:</strong> <span class="{status_class}">{failure_rate:.2f}%</span></p><p><strong>์ด ์˜ˆ์ƒ ๋น„์šฉ:</strong> ${total_cost:.6f}</p></div>
118
+ <h2>์ƒ์„ธ ๊ฒฐ๊ณผ</h2><table><thead><tr><th>ID</th><th>์ž…๋ ฅ (Input)</th><th>ํŒŒ์‹ฑ ๊ฒฐ๊ณผ (Parsed)</th><th>์—๋Ÿฌ</th><th>๋น„์šฉ</th><th>์ƒํƒœ</th></tr></thead><tbody>{table_rows}</tbody></table></div></body></html>
119
+ """
120
+
121
+ table_rows_html = ""
122
+ for res in results:
123
+ status_class = "status-success" if "Success" in res["status"] else "status-failure"
124
+ table_rows_html += f"""
125
+ <tr>
126
+ <td>{res['id']}</td>
127
+ <td><pre>{json.dumps(res['input'], indent=2, ensure_ascii=False)}</pre></td>
128
+ <td><pre>{json.dumps(res['parsed_result'], indent=2, ensure_ascii=False)}</pre></td>
129
+ <td><pre>{res['error']}</pre></td>
130
+ <td>${res['cost']:.6f}</td>
131
+ <td class="{status_class}">{res['status']}</td>
132
+ </tr>
133
+ """
134
+
135
+ final_html = html_template.format(
136
+ now=now.strftime('%Y-%m-%d %H:%M:%S'),
137
+ total_tests=NUM_TESTS,
138
+ success_count=NUM_TESTS - failure_count,
139
+ failure_count=failure_count,
140
+ status_class="status-success" if failure_rate < 10 else "status-failure",
141
+ failure_rate=failure_rate,
142
+ total_cost=total_cost,
143
+ table_rows=table_rows_html
144
+ )
145
+
146
+ with open(report_filename, "w", encoding="utf-8") as f:
147
+ f.write(final_html)
148
+
149
+ print(f"'{report_filename}' ํŒŒ์ผ๋กœ ๋ณด๊ณ ์„œ๊ฐ€ ์ €์žฅ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.")
150
+ print(f"์ด ์˜ˆ์ƒ ๋น„์šฉ: ${total_cost:.6f}")
151
+
152
+ if __name__ == "__main__":
153
+ main()
llm_functions.py ADDED
@@ -0,0 +1,88 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ from openai import OpenAI
2
+ import yaml
3
+ import os
4
+ import json
5
+
6
+ # ํด๋ผ์ด์–ธํŠธ ๋ฐ ํ”„๋กฌํ”„ํŠธ ์ดˆ๊ธฐํ™”
7
+ client = OpenAI(api_key=os.getenv("OPENAI_API_KEY"))
8
+
9
+ try:
10
+ current_dir = os.path.dirname(os.path.abspath(__file__))
11
+ prompt_path = os.path.join(current_dir, 'prompt.yaml')
12
+ with open(prompt_path, "r", encoding='utf-8') as file:
13
+ prompts = yaml.safe_load(file)
14
+ except Exception as e:
15
+ print(f"Warning: prompt.yaml ๋กœ๋“œ ์‹คํŒจ. ๊ธฐ๋ณธ ํ”„๋กฌํ”„ํŠธ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์˜ค๋ฅ˜: {e}")
16
+ prompts = {
17
+ "Interviewer": "You are a job interviewer.",
18
+ "Student": "You are a job applicant.",
19
+ "CoverLetter": "Write a cover letter based on the conversation."
20
+ }
21
+
22
+ def get_interviewer_response(example_info):
23
+ """
24
+ ์ง„ํ–‰๋ฅ (progress)์„ ํฌํ•จํ•œ ๋ฉด์ ‘๊ด€์˜ ์‘๋‹ต์„ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
25
+ """
26
+ # ํ”„๋กฌํ”„ํŠธ ํฌ๋งคํŒ…์— ํ•„์š”ํ•œ ๋ชจ๋“  ๋ณ€์ˆ˜๋ฅผ kwargs๋กœ ๋ฌถ๊ธฐ
27
+ format_kwargs = {
28
+ **example_info
29
+ }
30
+ system_prompt = prompts.get("Interviewer", "").format(**format_kwargs)
31
+
32
+ with open("system_prompt.txt", "w", encoding='utf-8') as f:
33
+ f.write(system_prompt)
34
+ conversation = [{"role": "system", "content": "You must generate the response in json format."}, {"role": "user", "content": system_prompt}]
35
+ # for role, content in messages:
36
+ # conversation.append({"role": role, "content": content})
37
+
38
+ response_stream = client.chat.completions.create(
39
+ model="gpt-4.1",
40
+ messages=conversation,
41
+ stream=True
42
+ )
43
+ for chunk in response_stream:
44
+ yield chunk.choices[0].delta.content or ""
45
+
46
+ def get_student_response(example_info):
47
+ """ํ•™์ƒ์˜ AI ๋‹ต๋ณ€์„ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค."""
48
+ system_prompt = prompts.get("Student", "").format(**example_info)
49
+
50
+ conversation = [{"role": "system", "content": "You must generate the response in json format."}]
51
+
52
+ with open("student_input.txt", "w", encoding='utf-8') as f:
53
+ f.write(system_prompt)
54
+ # for speaker, content in history:
55
+ # conversation.append({"role": "user", "content": f"{speaker}: {content}"})
56
+
57
+ conversation.append({"role": "user", "content": f"{system_prompt}"})
58
+
59
+ response_stream = client.chat.completions.create(
60
+ model="gpt-4o",
61
+ messages=conversation,
62
+ stream=True
63
+ )
64
+ for chunk in response_stream:
65
+ yield chunk.choices[0].delta.content or ""
66
+
67
+ def generate_cover_letter_response(question, conversation_history, example_info, flow, word_limit):
68
+ """
69
+ ์ง„ํ–‰๋ฅ ์„ ํฌํ•จํ•˜์—ฌ ์ž๊ธฐ์†Œ๊ฐœ์„œ ๋‹ต๋ณ€์„ ์ŠคํŠธ๋ฆฌ๋ฐ์œผ๋กœ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
70
+ """
71
+ conversation_text = "\n".join([f"{speaker}: {content}" for speaker, content in conversation_history])
72
+
73
+ # ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ๋ฅผ ์š”์ฒญํ•˜๋Š” ํ”„๋กฌํ”„ํŠธ
74
+ prompt = prompts.get("CoverLetter", "").format(
75
+ conversation=conversation_text,
76
+ question=question,
77
+ flow=flow,
78
+ word_limit=word_limit,
79
+ **example_info
80
+ )
81
+
82
+ response_stream = client.chat.completions.create(
83
+ model="gpt-4o",
84
+ messages=[{"role": "user", "content": prompt}],
85
+ stream=True
86
+ )
87
+ for chunk in response_stream:
88
+ yield chunk.choices[0].delta.content or ""