Skip to content

Commit ccc3e9f

Browse files
authored
Merge pull request #38 from Career-Mate/feature/CMAT-57
[CMAT-57] feat: 프론트 RecruitKeyword 상세화
2 parents ac0e0da + 65b95fe commit ccc3e9f

File tree

3 files changed

+60
-9
lines changed

3 files changed

+60
-9
lines changed

src/main/java/UMC/career_mate/domain/chatgpt/service/ChatGptService.java

Lines changed: 18 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package UMC.career_mate.domain.chatgpt.service;
22

33
import UMC.career_mate.domain.chatgpt.dto.api.response.ChatCompletionResponse;
4+
import UMC.career_mate.domain.job.Job;
45
import UMC.career_mate.domain.recruit.dto.MemberTemplateAnswerDTO;
56
import UMC.career_mate.domain.chatgpt.dto.api.request.GptRequest;
67
import UMC.career_mate.domain.chatgpt.dto.api.request.GptRequest.Message;
@@ -10,6 +11,7 @@
1011
import java.net.URI;
1112
import java.util.Collections;
1213
import java.util.List;
14+
import java.util.Map;
1315
import lombok.RequiredArgsConstructor;
1416
import lombok.extern.slf4j.Slf4j;
1517
import org.springframework.beans.factory.annotation.Value;
@@ -34,10 +36,16 @@ public class ChatGptService {
3436
"이 사람의 경력을 계산해서 앞뒤 설명 하지말고 정수로만 올바른 답변 예시와 같은 형식으로 답변해줘. " +
3537
"올바론 답변 예시) 5, 잘못된 답변 예시 1) 5년, 잘못된 답변 예시 2) 5 years, 잘못된 답변 예시 3) 이 사람의 경력은 5년";
3638

37-
private static final String GPT_REQUEST_FORMAT_POSTFIX_FOR_RECRUIT_KEYWORD =
39+
private static final String GPT_REQUEST_FORMAT_POSTFIX_FOR_RECRUIT_KEYWORD_BACKEND =
3840
"이 사람의 직무를 내가 제시한 보기들 중에서 하나만 골라서 답변해줘.\n" +
39-
"직무 보기 :'BACKEND', 'BACKEND_SPRING', 'BACKEND_NODE', 'BACKEND_DJANGO', 'FRONTEND', 'DESIGNER', 'PM', " +
40-
"이 중에서 적절한 직무가 없다면 'MISMATCH'로 답변해줘.\n" +
41+
"직무 보기 :'BACKEND_SPRING', 'BACKEND_NODE', 'BACKEND_DJANGO'. " +
42+
"이 중에서 적절한 직무를 고르기 애매하면 'BACKEND'로 답변해줘.\n" +
43+
"앞뒤 설명하지 말고 직무만 답변해줘.";
44+
45+
private static final String GPT_REQUEST_FORMAT_POSTFIX_FOR_RECRUIT_KEYWORD_FRONTEND =
46+
"이 사람의 직무를 내가 제시한 보기들 중에서 하나만 골라서 답변해줘.\n" +
47+
"직무 보기 : 'FRONTEND_REACT', 'FRONTEND_IOS', 'FRONTEND_ANDROID'. " +
48+
"이 중에서 적절한 직무를 고르기 애매하면 'FRONTEND'로 답변해줘.\n" +
4149
"앞뒤 설명하지 말고 직무만 답변해줘.";
4250

4351
private static final String GPT_REQUEST_FORMAT_FOR_COMMENT =
@@ -46,6 +54,11 @@ public class ChatGptService {
4654
"답변은 문구만 답변해줘. 문구를 생성할 때 내용에는 회사 이름은 제외해줘. " +
4755
"답변에서 '-'는 빼줘.";
4856

57+
private static final Map<String, String> formatMap = Map.ofEntries(
58+
Map.entry("백엔드 개발자", GPT_REQUEST_FORMAT_POSTFIX_FOR_RECRUIT_KEYWORD_BACKEND),
59+
Map.entry("프론트엔드 개발자", GPT_REQUEST_FORMAT_POSTFIX_FOR_RECRUIT_KEYWORD_FRONTEND)
60+
);
61+
4962
private static final String GPT_SYSTEM_ROLE = "너는 취업 전문가로서 내가 보낸 경험 데이터를 기반으로 '~~한 경험이 있는 000님, ~~한 경험을 어필해보면 어때요?' 라는 느낌으로 사용자 맞춤형 추천 문구를 작성한다. " +
5063
"문구의 말투는 '-니다'체를 사용하는 것이 아니라, '-요'체를 사용한다.";
5164

@@ -61,9 +74,9 @@ public int getCareerYear(String chatGptRequestContent) {
6174
return Integer.parseInt(gptAnswer);
6275
}
6376

64-
public RecruitKeyword getRecruitKeyword(String chatGptRequestContent) {
77+
public RecruitKeyword getRecruitKeyword(String chatGptRequestContent, Job job) {
6578
GptRequest gptRequest = createGptRequest(
66-
chatGptRequestContent + GPT_REQUEST_FORMAT_POSTFIX_FOR_RECRUIT_KEYWORD);
79+
chatGptRequestContent + formatMap.get(job.getName()));
6780

6881
ObjectMapper om = new ObjectMapper();
6982
String gptAnswer = getGptAnswer(om, gptRequest);

src/main/java/UMC/career_mate/domain/recruit/enums/RecruitKeyword.java

Lines changed: 36 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ public List<String> getIncludeKeywordList() {
2525

2626
@Override
2727
public List<String> getExcludeKeywordList() {
28-
return List.of("Node", "Node.js", "NODE", "javascript", "Python", "Django", "C++", "PHP");
28+
return List.of("Node", "Node.js", "NODE", "javascript", "Python", "Django", "C++", "PHP", "C#");
2929
}
3030
},
3131
BACKEND_NODE {
@@ -36,7 +36,7 @@ public List<String> getIncludeKeywordList() {
3636

3737
@Override
3838
public List<String> getExcludeKeywordList() {
39-
return List.of("java", "JAVA", "spring", "Spring", "SPRING", "Python", "Django", "C++", "PHP");
39+
return List.of("java", "JAVA", "spring", "Spring", "SPRING", "Python", "Django", "C++", "PHP", "C#");
4040
}
4141
},
4242
BACKEND_DJANGO {
@@ -48,7 +48,7 @@ public List<String> getIncludeKeywordList() {
4848
@Override
4949
public List<String> getExcludeKeywordList() {
5050
return List.of("java", "JAVA", "spring", "Spring", "SPRING", "javascript", "Node",
51-
"Node.js", "NODE", "C++", "PHP");
51+
"Node.js", "NODE", "C++", "PHP", "C#");
5252
}
5353
},
5454
FRONTEND {
@@ -62,6 +62,39 @@ public List<String> getExcludeKeywordList() {
6262
return null;
6363
}
6464
},
65+
FRONTEND_REACT {
66+
@Override
67+
public List<String> getIncludeKeywordList() {
68+
return List.of("react");
69+
}
70+
71+
@Override
72+
public List<String> getExcludeKeywordList() {
73+
return null;
74+
}
75+
},
76+
FRONTEND_IOS {
77+
@Override
78+
public List<String> getIncludeKeywordList() {
79+
return List.of("ios");
80+
}
81+
82+
@Override
83+
public List<String> getExcludeKeywordList() {
84+
return null;
85+
}
86+
},
87+
FRONTEND_ANDROID {
88+
@Override
89+
public List<String> getIncludeKeywordList() {
90+
return List.of("android");
91+
}
92+
93+
@Override
94+
public List<String> getExcludeKeywordList() {
95+
return null;
96+
}
97+
},
6598
DESIGNER {
6699
@Override
67100
public List<String> getIncludeKeywordList() {

src/main/java/UMC/career_mate/domain/recruit/service/RecruitQueryService.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,11 @@ private int calculateCareerYear(Member member) {
167167
private RecruitKeyword calculateRecruitKeyword(Member member) {
168168
Job job = member.getJob();
169169

170+
// pm, 디자이너는 gpt 요청 x (상세 직무 나눌 필요 없음)
171+
if (job.getName().equals("PM(Product/Project Manager)") || job.getName().equals("Designer")) {
172+
return RecruitKeyword.getRecruitKeywordFromProfileJob(job);
173+
}
174+
170175
// 프로젝트 템플릿의 답변, 인턴 템플릿의 답변을 가져온다.
171176
Map<TemplateType, List<Answer>> templateTypeByAnswers = getTemplateTypeByAnswers(
172177
member, job);
@@ -192,7 +197,7 @@ private RecruitKeyword calculateRecruitKeyword(Member member) {
192197
return RecruitKeyword.getRecruitKeywordFromProfileJob(job);
193198
}
194199

195-
RecruitKeyword recruitKeyword = chatGptService.getRecruitKeyword(contentBuilder.toString());
200+
RecruitKeyword recruitKeyword = chatGptService.getRecruitKeyword(contentBuilder.toString(), member.getJob());
196201

197202
if (Objects.isNull(recruitKeyword)) {
198203
log.info("gpt 답변이 RecruitKeyword에 없는 값이라서 null인 경우 -> 멤버 프로필 job으로 대체");

0 commit comments

Comments
 (0)