Skip to content

Commit 35297c3

Browse files
개선 방안 AS-IS, TO-BE 대비 시각화
1 parent 1d8ae4a commit 35297c3

File tree

2 files changed

+102
-13
lines changed

2 files changed

+102
-13
lines changed

backend/core/views/job_planner/job_planner_view.py

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2826,7 +2826,6 @@ def _merge_results(self, results, api_key):
28262826
return merged
28272827

28282828

2829-
@method_decorator(csrf_exempt, name='dispatch')
28302829
@method_decorator(csrf_exempt, name='dispatch')
28312830
class JobPlannerReviewPortfolioView(APIView):
28322831
"""채용공고 기준 포트폴리오 개선점 분석 API (파싱된 데이터 기반)"""
@@ -2854,7 +2853,7 @@ def post(self, request):
28542853
portfolio_content = json.dumps(portfolio_parsed, ensure_ascii=False, indent=2)
28552854

28562855
response = client.chat.completions.create(
2857-
model="gpt-4o-mini",
2856+
model="gpt-4o",
28582857
messages=[
28592858
{
28602859
"role": "system",
@@ -2867,14 +2866,52 @@ def post(self, request):
28672866
- 팀 프로젝트: 본인 담당 범위, 기술 선택 이유, 협업 방식이 명확한지 확인.
28682867
- 개인/학습 프로젝트: 만든 동기, 겪은 문제와 해결 과정, 배운 점이 있는지 확인.
28692868
3. 매칭되지 않는 요구사항은 포트폴리오의 유사 경험에서 연결고리를 찾아 대체 어필 방법을 제안합니다.
2870-
4. 모든 조언에는 반드시 "현재 서술(AS-IS)"과 "개선 서술(TO-BE)"을 대비하여 제시합니다.
2869+
4. 모든 조언에는 반드시 "현재 서술(as_is)"과 "개선 서술(to_be)"을 대비하여 제시합니다.
28712870
5. 포트폴리오에서 추출된 프로젝트, 기술스택, 성과 등을 꼼꼼히 분석합니다.
28722871
28732872
[필수 규칙]
28742873
- "프로젝트 설명을 보강하세요", "기술 스택을 강조하세요" 같은 추상적 조언 금지
28752874
- 반드시 포트폴리오의 특정 프로젝트명 또는 경력사항을 지목하여 조언할 것
28762875
- 반드시 공고의 어떤 요구사항에 대응하는 조언인지 명시할 것
2877-
- 정량적 성과가 없는 프로젝트는 해당 프로젝트에서 측정 가능한 수치가 무엇인지 구체적으로 제안할 것"""
2876+
- 정량적 성과가 없는 프로젝트는 해당 프로젝트에서 측정 가능한 수치가 무엇인지 구체적으로 제안할 것
2877+
- to_be는 포트폴리오에 바로 붙여넣을 수 있는 수준의 완성된 문장을 작성할 것
2878+
- to_be에 공고에서 사용된 키워드를 자연스럽게 포함할 것
2879+
2880+
[Few-shot 예시 — improvements 작성법]
2881+
2882+
❌ 나쁜 예시 (추상적):
2883+
{
2884+
"target": "실시간 감성 분석 대시보드",
2885+
"issue": "프론트엔드 성능 최적화 경험이 부족합니다.",
2886+
"as_is": "React를 사용하여 대시보드를 개발했습니다.",
2887+
"to_be": "성능 최적화 사례를 추가하세요."
2888+
}
2889+
2890+
✅ 좋은 예시 (구체적):
2891+
{
2892+
"target": "실시간 감성 분석 대시보드",
2893+
"issue": "공고에서 요구하는 '대규모 트래픽 처리 경험'에 대한 서술이 없습니다. 현재는 단순 기능 나열에 그치고 있어 성능 관점의 기술적 깊이가 드러나지 않습니다.",
2894+
"as_is": "React와 Chart.js를 활용하여 실시간 감성 분석 결과를 시각화하는 대시보드를 개발했습니다.",
2895+
"to_be": "React.memo와 useMemo를 적용하여 실시간 데이터 스트림(초당 50건) 환경에서 불필요한 리렌더링을 70% 줄이고, React-Query의 staleTime 설정으로 API 호출 빈도를 분당 60회에서 12회로 최적화했습니다. Chart.js canvas 렌더링 시 requestAnimationFrame 기반 배치 업데이트를 도입하여 프레임 드롭 없이 실시간 차트를 구현했습니다."
2896+
}
2897+
2898+
❌ 나쁜 예시 (추상적):
2899+
{
2900+
"target": "AI Knowledge Bot",
2901+
"issue": "팀 리드 경험이 부족합니다.",
2902+
"as_is": "팀 프로젝트로 진행했습니다.",
2903+
"to_be": "팀에서의 역할을 구체적으로 서술하세요."
2904+
}
2905+
2906+
✅ 좋은 예시 (구체적):
2907+
{
2908+
"target": "AI Knowledge Bot",
2909+
"issue": "공고에서 요구하는 '팀 리더십 및 협업 경험'에 대해, 현재 서술에는 본인의 역할과 기여도가 드러나지 않습니다.",
2910+
"as_is": "4인 팀 프로젝트로 FastAPI 기반 AI 챗봇을 개발했습니다.",
2911+
"to_be": "4인 팀에서 백엔드 리드를 맡아 API 설계와 코드 리뷰를 주도했습니다. 주 2회 기술 미팅을 통해 LangChain RAG 파이프라인의 아키텍처 결정을 이끌었고, GitHub PR 리뷰 프로세스를 도입하여 배포 후 버그를 팀 평균 대비 40% 감소시켰습니다. Notion으로 API 명세서를 문서화하여 프론트엔드 팀과의 통합 일정을 1주 단축했습니다."
2912+
}
2913+
2914+
위 예시처럼 as_is에는 포트폴리오의 실제 서술(또는 서술이 없으면 '해당 내용 없음')을, to_be에는 공고 키워드를 반영한 구체적 개선 문장을 작성하세요."""
28782915
},
28792916
{
28802917
"role": "user",
@@ -2895,12 +2932,6 @@ def post(self, request):
28952932
=== 포트폴리오 분석 내용 ===
28962933
{portfolio_content}
28972934
2898-
=== 분석 기준 ===
2899-
1. 포트폴리오의 프로젝트, 기술스택, 성과 등 구체적 내용을 기반으로 분석
2900-
2. 공고의 각 요구사항(업무, 필수요건, 우대사항)을 포트폴리오 내용과 구체적으로 대조
2901-
3. 포트폴리오에서 이 공고에 어필할 수 있는 포인트와 부족한 포인트 발굴
2902-
4. 포트폴리오에 어떤 내용을 어떻게 수정/보완해야 하는지 실행 가능한 가이드 제공
2903-
29042935
JSON으로 반환하세요:
29052936
{{
29062937
"strengths": [
@@ -2909,8 +2940,9 @@ def post(self, request):
29092940
"improvements": [
29102941
{{
29112942
"target": "개선 대상 (포트폴리오의 특정 프로젝트명 또는 섹션)",
2912-
"issue": "이 공고 기준으로 부족한 점",
2913-
"suggestion": "포트폴리오에 어떻게 보완하여 작성할지 구체적 방법 (예: 어떤 내용을 추가하고, 어떤 키워드를 포함하고, 어떤 구조로 정리할지)"
2943+
"issue": "이 공고 기준으로 부족한 점 (공고의 어떤 요구사항에 대응하는지 명시)",
2944+
"as_is": "포트폴리오의 현재 서술 (실제 내용을 인용하거나 요약. 서술이 없으면 '해당 내용 없음')",
2945+
"to_be": "개선된 서술 예시 (포트폴리오에 바로 붙여넣을 수 있는 완성된 문장. 공고 키워드 반영, 정량적 수치 포함)"
29142946
}}
29152947
],
29162948
"missing": [

frontend/src/features/job_planner/components/JobPlannerModal.vue

Lines changed: 58 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -921,7 +921,19 @@
921921
>
922922
<div class="imp-target">🎯 {{ imp.target }}</div>
923923
<div class="imp-issue">⚠️ {{ imp.issue }}</div>
924-
<div class="imp-suggestion">💡 {{ imp.suggestion }}</div>
924+
<!-- AS-IS / TO-BE 대비 -->
925+
<div v-if="imp.as_is || imp.to_be" class="imp-comparison">
926+
<div class="imp-as-is" v-if="imp.as_is">
927+
<div class="comp-label">📄 현재 서술</div>
928+
<div class="comp-content">{{ imp.as_is }}</div>
929+
</div>
930+
<div class="imp-to-be" v-if="imp.to_be">
931+
<div class="comp-label">✨ 개선 서술</div>
932+
<div class="comp-content">{{ imp.to_be }}</div>
933+
</div>
934+
</div>
935+
<!-- 레거시: suggestion만 있는 경우 -->
936+
<div v-else-if="imp.suggestion" class="imp-suggestion">💡 {{ imp.suggestion }}</div>
925937
</div>
926938
</div>
927939
<div class="review-section" v-if="portfolioReview.missing?.length">
@@ -4610,6 +4622,51 @@ export default {
46104622
color: #60a5fa;
46114623
}
46124624
4625+
/* AS-IS / TO-BE 대비 영역 */
4626+
.imp-comparison {
4627+
display: flex;
4628+
flex-direction: column;
4629+
gap: 8px;
4630+
margin-top: 4px;
4631+
}
4632+
4633+
.imp-as-is,
4634+
.imp-to-be {
4635+
border-radius: 6px;
4636+
padding: 10px 12px;
4637+
font-size: 13px;
4638+
line-height: 1.65;
4639+
}
4640+
4641+
.imp-as-is {
4642+
background: rgba(239, 68, 68, 0.06);
4643+
border-left: 3px solid rgba(239, 68, 68, 0.4);
4644+
}
4645+
4646+
.imp-to-be {
4647+
background: rgba(34, 197, 94, 0.06);
4648+
border-left: 3px solid rgba(34, 197, 94, 0.4);
4649+
}
4650+
4651+
.comp-label {
4652+
font-size: 11px;
4653+
font-weight: 700;
4654+
margin-bottom: 4px;
4655+
letter-spacing: 0.02em;
4656+
}
4657+
4658+
.imp-as-is .comp-label {
4659+
color: #f87171;
4660+
}
4661+
4662+
.imp-to-be .comp-label {
4663+
color: #4ade80;
4664+
}
4665+
4666+
.comp-content {
4667+
color: #cbd5e1;
4668+
}
4669+
46134670
/* AI 지원 도구 섹션 */
46144671
.action-tools-section {
46154672
margin-top: 32px;

0 commit comments

Comments
 (0)