내용
프로젝트명 : 직무별 채용 사이트 추천 서비스
기간 : 23.08.04-23.08.25
취업에 관심이 많은 취준생으로서, IT, 기획, 엔지니어 등 분야별 채용 사이트를 추천해주는 서비스가 있으면 좋을 것 같아 채용 사이트 추천 서비스로 주제로 정했다.
구직 및 이직자를 위한 직무별 구직 사이트 추천과 멘토링 서비스 등 다양한 구직 지원 서비스 사이트이다.
부트텐트 잇다 웹페이지 참고
<추가 구현 필요>
사이트와 취업후기 연결필요(사이트별 취업후기)
Stack
spring boot
jpa
jwt
mysql
테이블 설계
users : 회원정보
review : 취업후기
interest : 유저관심회사리스트
company : 채용 사이트
job : 직종
jobRecommend : 직종추천(mbti-직종 중간테이블)
mentors : 멘토
mentors-mentoring : 멘토-멘토 중간테이블
user_mento : 유저 멘토 중간 테이블
mentorAdvice : 멘토질문
관계 설정
One-to-One
- users- mentors
One-to-Many
- users와 review
- users와 user_mento
- users와 mentorAdvice
- users와 Interest
- mentor와 user_mento
- mentor와 mentors-mentoring
- mentoringField와 mentors-mentoring
- Company와 users
- Company와 review
- job와 Company
- job와 mentors
- job와 jobRecommend
- mbti와 jobRecommend
중간테이블
- users와 user_mentors
- mentors-mentoring
- jobRecommend
API 명세서
기여
- 취업 후기 조회
- 취업 후기 작성
- 취업 후기 자세히 보기
- 취업 후기 카테고리별 검색
- mbti 검사 후 직종 추천
VIEW
1. main
2. review(취업후기)
3. 취업 후기 자세히 보기
4. 취업 후기 작성
5. mbti(mbti별 직종 추천)
mbti 참고 자료
💡 기능 구현 중 어려웠던 점
- mbti 검사
mbti검사 기능을 구현하는 데에는 2가지 어려움이 있었다.
문제 1. 질문과 보기 데이터를 어떻게 넣을 것인가.
문제 2. I/E, S/N, S/T, P/J 를 값을 어떻게 나눠서 결과를 산출할 것인가.
문제 1. 질문과 보기 데이터를 어떻게 넣을 것인가. -> 노란색 참고
해결 1.
처음에는 지금껏 해왔던 것처럼 질문과 보기 리스트를 만들어 들어있는 대로 foreach처럼 있는 값을 모두 나오게 하면 되는 게 아닌가 싶었다. 하지만 물어보니 질문과 보기를 카테고리별로도 나눠야 해서 너무 복잡해 질 것 같다라는 피드백을 받았다. 그래서 서버에서 질문과 보기를 한 번에 받고 화면에서 나중에 질문과 보기를 구분하는 것으로 선택했다.
결과적으로 한 질문 당 질문과 보기는 "1.", 보기 간에는 "//"으로 구분하도록 했다.
// ## FRONT
// 질문과 보기 "1."로 구분
// "1."로 구분하여 왼쪽을 쓰겠다.
const cleanQuestionHeader = (question) => {
// -1의 뜻은 "1."이 없을 경우, -1을 반환한다는 뜻..
// "1."이 있기 때문에, "1."이 존재하는 32를 반환
const headerEndIndex = question.indexOf("1.") !== -1 ? question.indexOf("1.") : question.indexOf("2.");
// question을 0에서 32번까지 자름(0~31까지 자름)
return question.substring(0, headerEndIndex).trim();
};
// ## FRONT
// 보기1과 보기2 "//" 구분
// 질문과 보기를 "1." 나눠둔 headerEndIndex 에서 "//"로 나눈 오른쪽을 쓰겠다.
const cleanQuestionText = (question, type) => {
const headerEndIndex = question.indexOf("1.") !== -1 ? question.indexOf("1.") : question.indexOf("2.");
// question을 headerEndIndex("1."이 존재하는 32번째)부터
// "//"로 구분 -> 이렇게 나눈건 배열로 들어감..
const msg = question.substring(headerEndIndex).trim().split('//');
// 보기를 왼쪽, 오른쪽 나누기
if (type == 'left') {
return msg[0];
} else {
return msg[1];
}
};
문제 2. I/E, S/N, S/T, P/J 를 값을 어떻게 나눠서 결과를 산출할 것인가. -> 빨간색 참고
해결 2.
이차원 배열을 사용하여 카테고리를 I/E, S/N, S/T, P/J로 총 4개로 나누었다.
카테고리별 3문제씩 만들어서 넣었고 보기1번과 보기2번을 2:1의 과반수를 만들어 둘 중 큰 결과를 산출했다.
// ## SEVER
// QuestionController
// mbti 결과 보기
@GetMapping("/results")
public QuestionResponse getPersonalityType() {
// StringBuilder : 문자열을 조작하고 관리하는 클래스
StringBuilder personalityType = new StringBuilder();
// 카테고리의 배열을 순회함..
for (CategoryQuestions category : categories) {
// 순회하면서 각각의 카테고리의 질문들에 대한 답이 좌항이 더 많은지 우항이 많은지 count..
int choice1Count = category.getQuestions().stream().mapToInt(QuestionAnswer::getChoice1Count).sum();
int choice2Count = category.getQuestions().stream().mapToInt(QuestionAnswer::getChoice2Count).sum();
// 좌항이 많다면 .. ISTJ = 1번이 많고 질문이 같다면
// 우항이 많다면 .. 반대 = 그렇지 않으면
if (choice1Count > choice2Count) {
personalityType.append(getPersonalityCode(category));
} else {
personalityType.append(getOppositePersonalityCode(category));
}
}
// 질문과 유저의 mbti type return...
QuestionResponse questionResponse = QuestionResponse.builder().questions(categories).type(personalityType.toString()).build();
return questionResponse;
}
느낀점
각자 맡은 기능에 대해 프론트까지 함께 구현하는 프로젝트였다. 취업후기와 mbti를 활용한 직무 추천 기능을 맡았다.
취업후기는 직무별로 카테고리를 클릭하면 해당 직무의 리뷰가 나오는 것을 제외 하면 해봤던 게시판 기능과 비슷했다.
하지만 mbti검사처럼 질문과 보기를 구별하고 1번, 2번 중 선택 하고 다음으로 넘어가는 것을 구현하는 것은 처음이라 구현을 어떻게 해야할지 시작하는 것조차 어려웠다. 설계에서 생각보다 많은 시간이 걸렸고 프론트는 처음이라 혼자서는 어떻게 데이터를 넘겨줘야 할지 몰라 많이 물어보면서 진행했다.
또한, css를 해두면 깃을 합치는 과정에서 조원들이 했던 부분과 className이 겹쳐서 그런건지 조원이 해둔 css를 가져오는 에러가 계속해서 발생했다. 이러한 것 또한 협업의 한 과정인데 깃을 합치면 지금까지 해왔던 과정이 다 없어지니까 허무했다. 다음에 진행한다면 className을 정할 때, 앞부분에는 꼭 기능을 붙여 작성하자고 해야겠다.
물어보니 이러한 점을 방지하기 위해 미리 세팅을 하는 방법이 있다고 한다. 다음 프로젝트 때는 이 점을 활용해 보려한다.
관련 링크
git : https://github.com/orgs/playdata-mini/repositories
와이어프레임(kakao oven) : https://ovenapp.io/project/izHWDda6Q1nGsAXpw6E67uFumt2ay719#uavdQ
'Project > Collabo Project' 카테고리의 다른 글
[동물전쟁] 아이템 합성 서비스(Kafka 사용) (1) | 2023.11.09 |
---|---|
[동물전쟁] Socket으로 전체 공개 채팅 만들기(MySQL저장) (0) | 2023.10.22 |
[동물전쟁] Socket에 Token받아오기 (0) | 2023.10.22 |
신발 쇼핑몰 프로젝트 (0) | 2023.08.04 |
영화추천 웹페이지 만들기 (0) | 2023.06.21 |