Home / Projects / JobFinder

JobFinder

● Final Project

기술스택·직무 기반 맞춤 매칭 개발자 구인구직 플랫폼. Spring Boot 기반 MSA 4개 서비스 구조에 JWT 인증을 적용하고, 구직자 파트 9개 기능 영역을 전담 개발했습니다.

Period 2026.02 — 2026.03 · 5주
Team 4인 팀 프로젝트
Role 구직자 파트 전담 (BE+FE)
Type Final Project · 쌍용교육센터

※ 구직자 테스트 계정 — ID: parkjh / PW: Qwer1234$

01 — Stack

기술 스택

Backend
Java 17 Spring Boot 3.x MyBatis Spring Security
Frontend
Thymeleaf HTML5 CSS3 JavaScript jQuery
Database
Oracle 18c
Auth
JWT Access / Refresh Token
MSA
Spring Cloud Gateway Eureka Discovery LoadBalancer
Infra · CI/CD
AWS EC2 Docker Jenkins Docker Hub
Quality
SonarQube Git / GitHub Swagger UI
02 — Role

담당 기능 · 구직자 파트 전담

구직자(Jobseeker) 도메인 전반을 백엔드부터 프론트엔드까지 단독으로 설계·구현했습니다. 더불어 공동 설계한 ERD의 통합 검토를 진행하고 DDL(45개 테이블, 30개 시퀀스)을 작성했습니다.

F-01
마이페이지 대시보드
프로필 카드 · 활동 통계 4종 · 채용 캘린더 · 맞춤 추천 공고
F-02
이력서 관리
CRUD · 완성도 % 시각화 · 대표 이력서 1건 지정 · 임시저장 분리
F-03
채용공고 목록 · 상세
다중 조건 필터 8종 · 추천/인기 공고 · 매칭도 % · 지원자 통계
F-04
입사지원 · 지원내역
이력서 스냅샷 · 첨부 드래그앤드롭 · 5단계 상태 · 지원 취소 로직
F-05
받은 제안 · 응답
기업 → 구직자 제안 수신 · 수락/거절 · 기한 관리
F-06
기업 정보 조회
기업 상세 페이지 · 진행 공고 · 통계
F-07
스크랩 / 최근 본 공고
관심 공고 저장 · 열람 히스토리 자동 기록
F-08
팔로우 (기업)
관심 기업 팔로우 · 신규 공고 알림 연동
F-09
ERD · DDL 통합 작성
팀 공통 작업 · 45 테이블 · 30 시퀀스 · 정규화 검토
03 — Architecture

MSA 4개 서비스 구조

Gateway가 단일 진입점으로 요청을 받아 Eureka Discovery에서 서비스를 조회한 뒤 URL 기반 라우팅으로 User Service · Board Service에 전달합니다. 외부 연동(SMS · 결제)은 User Service에 격리했습니다.

Client Browser Frontend API Gateway jobfinder-gateway :8000 Single Entry · Routing Discovery jobfinder-discovery Eureka · :8761 lookup User Service jobfinder-main :8001 · Swagger UI 구직자 · 기업 · 핵심 도메인 Board Service jobfinder-board :8002 · Swagger UI 커뮤니티 게시판 External API SMS (SOLAPI) PortOne (결제) Oracle DB shared DEVOPS Docker · Jenkins SonarQube · AWS EC2
실행 순서: Discovery (8761) → Gateway (8000) → Main (8001) + Board (8002). 모든 요청은 Gateway를 통해 들어오며, Gateway가 Eureka에서 인스턴스를 조회해 해당 서비스로 라우팅합니다.
04 — Key Design Points

핵심 설계 포인트

01
이력서 스냅샷 설계

지원 시점의 이력서를 JSON → CLOB으로 영구 보존하는 구조로 설계했습니다. 구직자가 이후 이력서를 수정해도 과거 지원 내역의 데이터 무결성이 유지됩니다.

02
이력서 기반 매칭도 계산

공고의 요구 기술스택과 구직자 이력서의 기술을 비교해 점수화. 요구 기술 수에 비례한 가변 가중치를 적용해 "왜 이 점수가 나왔는지"까지 함께 반환합니다.

03
MSA 4 서비스 도메인 분리

Discovery / Gateway / Main / Board로 서비스를 분리하고, Gateway에서 Eureka 기반 라우팅을 구성해 각 서비스가 담당 기능에 집중하도록 설계했습니다.

Spotlight · 회계 도메인 응용

익숙한 패턴이
설계로 이어지다

"지원 시점의 이력서를 그대로 남기는 구조를 만들었습니다."

6년간 회계 실무에서 결산이 마감된 원장은 다시 손대지 않는 원칙을 일상적으로 다뤘습니다. 마감 이후의 변경은 별도 분개로 처리하고, 과거 시점의 데이터는 그대로 두는 방식이었습니다.

JobFinder의 입사지원 기능을 구현하면서, 비슷한 구조가 필요하다고 봤습니다. 구직자가 지원 후 이력서를 수정하더라도, 기업이 보는 지원서는 지원 시점 그대로 보존되어야 한다고 판단했습니다.

ObjectMapper.writeValueAsString()으로 이력서 원본과 하위 7개 항목(학력·경력·기술·자격증 등)을 JSON 문자열로 변환한 뒤, Oracle CLOB 컬럼에 영구 저장합니다. jdbcType=CLOB을 명시하지 않으면 VARCHAR2(4000byte)로 처리되어 긴 이력서에서 ORA-01461이 발생하는 함정도 직접 디버깅하며 해결했습니다.

06 — Highlight Feature

이력서 ↔ 공고 매칭도 계산

공고의 모집 조건과 구직자 이력서를 4개 항목으로 비교해 점수화합니다. 기술스택 가중치는 요구 기술 수에 비례한 가변 구조로, 요구 기술이 많은 공고일수록 기술 매칭이 점수를 좌우합니다. 단순 점수만 반환하지 않고 이력서의 희망지역·직무명도 함께 내려보내, 프론트에서 "왜 이 점수가 나왔는지" 표시할 수 있게 설계했습니다.

// JobPostingService_imple.java
public MatchResult getMatchScoreForJob(
    int jobId, int resumeId
) {
    int score = 0;
    int max   = 10 + (techTotalCount * 2);

    // 지역 5점
    if (matchRegion)  score += 5;
    // 직무 3점
    if (matchJobRole) score += 3;
    // 연봉 2점
    if (matchSalary)  score += 2;
    // 기술스택 (요구 개수 × 2)
    score += matchedTechCount * 2;

    return new MatchResult(
        (score * 100) / max, // %
        wishRegion, wishJobName // 근거
    );
}
  • 고정 항목 10점 — 지역 5 + 직무 3 + 연봉 2
  • 가변 항목 — 기술스택은 techTotalCount × 2로 만점이 변동
  • 왜 가변? Java 1개만 요구하는 공고와 5개를 요구하는 공고는 매칭의 의미가 다름. 가변 가중치로 후자에서 기술 매칭이 점수 비중을 차지하게 만듦
  • UX 배려 — 점수와 함께 wishRegion · wishJobName도 반환해, 프론트에서 "당신의 희망 직무와 일치합니다" 같은 근거 표시 가능
  • 활용 — 공고 상세 페이지 "나와의 매칭도", 대시보드 "추천 공고", 공고 목록 정렬 기준에 동일하게 활용
07 — Database

DB 설계 · 45 테이블

회원 · 기업 · 채용공고 · 이력서 · 입사지원 등 5개 핵심 도메인을 중심으로 ERD를 정규화하여 설계했습니다. 이 과정에서 통합 검토를 진행하고 DDL을 작성했습니다.

08 — Explore

관련 링크

아래에서 더 자세히 확인하실 수 있습니다.