Skip to content

nodongservice/backend

Repository files navigation

BridgeWork Backend

브릿지워크 인증/프로필/추천/공공데이터/공고/관리자 백엔드입니다.

기술 스택

  • Java 17
  • Spring Boot 3.3.6
  • Spring Data JPA + Flyway
  • PostgreSQL
  • Spring Security + JWT
  • Redis
  • ShedLock(분산 스케줄 중복 방지)

도메인 구조

com.bridgework.admin

  • auth
  • dummy

com.bridgework.auth

  • controller
  • service
  • repository
  • entity
  • dto
  • exception

com.bridgework.common

  • config
  • dto
  • exception
  • notification

com.bridgework.profile

  • controller
  • service
  • repository
  • entity
  • dto
  • exception

com.bridgework.recommend

  • controller
  • service
  • dto
  • config
  • exception

com.bridgework.options

  • controller
  • service
  • dto

com.bridgework.map

  • controller
  • service
  • dto

com.bridgework.posting

  • controller
  • service
  • repository
  • entity
  • dto
  • exception

com.bridgework.sync

  • admin/controller
  • service
  • repository
  • entity
  • dto
  • exception
  • normalized

현재 구현 범위

  • 기능 0: 소셜 로그인/회원가입 완료, JWT 재발급/로그아웃/내 정보 조회
  • 기능 0-1: 회원 탈퇴 신청/취소, 30일 유예 후 최종 비식별화(스케줄러)
  • 기능 1: 프로필 CRUD(최대 3개), 기본 프로필 지정/변경
  • 기능 1-2(OCR): 포트폴리오 PDF 업로드 기반 프로필 초안 생성 게이트웨이
  • 기능 2: 퀵 맞춤 추천 게이트웨이(aiEnabled ON/OFF)
  • 기능 3: 지도 추천 게이트웨이(aiEnabled ON/OFF)
  • 기능 3-1: 추천 설명 생성 게이트웨이
  • 기능 4: 공고 상세/인기 공고 조회, 공고 스크랩/해제/내 스크랩 목록
  • 기능 5: 관리자 로그인, 더미 사용자 케이스 조회/로그인
  • 공공데이터: 스케줄러 동기화 + 수동 실행 + 원본/정규화 저장
  • 화면 옵션/지도 레이어: 직무 트리, 지역/고용형태/급여방식 옵션, 근로지원인 수행기관 마커 조회

프로필 OCR 게이트웨이 API

  • POST /api/v1/profiles/ocr/extract (multipart/form-data)
  • 파라미터: file(PDF)
  • 동작:
    • Spring에서 1차 검증(빈 파일, 용량, Content-Type, PDF 시그니처)
    • 파일을 디스크 영구 저장 없이 메모리 바이트로 FastAPI OCR API에 중계
    • FastAPI 결과를 프로필 초안 DTO로 변환해 반환
  • 응답:
    • draft(전체 필드, 값 없으면 null)
    • missingFields
    • confidence, ocrTextLength, modelVersion, warnings

draft는 최종 저장 데이터가 아니라 사용자 확인/수정용 초안입니다. 실제 저장은 기존 POST /api/v1/profiles 검증 규칙을 따릅니다.

회원 탈퇴 상태 전이

  • ACTIVE -> PENDING_DELETION (탈퇴 신청)
  • PENDING_DELETION -> ACTIVE (유예기간 내 취소)
  • PENDING_DELETION -> DELETED (유예기간 만료 후 스케줄러 최종 처리)
  • 유예기간 기본값: bridgework.auth.withdrawal-grace-period=30d

프로필 입력 정책(선택형 Enum 강제)

  • 원칙: 자유서술이 아닌 항목은 Enum으로 강제한다.
  • 가입 완료(온보딩)는 프로필 필수 항목만 입력받아 기본 프로필 1개를 생성한다.

필수 선택형(Enum)

  • genderType: MALE, FEMALE, OTHER, NOT_DISCLOSED
  • highestEducation: 고졸 이하, 고졸, 전문대졸, 대졸, 석사, 박사, 기타
  • graduationStatus: 졸업, 졸업예정, 재학, 수료, 중퇴, 기타
  • disabilityType: 지체장애, 뇌병변장애, 시각장애, 청각장애, 언어장애, 지적장애, 자폐성장애, 정신장애, 신장장애, 심장장애, 호흡기장애, 간장애, 안면장애, 장루·요루장애, 뇌전증장애, 기타
  • disabilitySeverity: 중증, 중등도, 경증
  • workAvailability: 즉시, 2주 이내, 1개월 이내, 협의 가능
  • workTypes: 정규직, 계약직, 무기계약직, 시간제, 일용직, 인턴, 파견/용역, 재택/원격

선택 선택형(Enum)

  • workTimePreference: 주간, 오전, 오후, 야간, 탄력근무, 협의 가능
  • militaryService: 군필, 면제, 해당없음, 복무중

화면 필터 옵션(Enum)

  • regions: value=SEOUL 등 영문코드, label=한글
  • employment-types: value=FULL_TIME 등 영문코드, label=한글
  • salary-types: value=MONTHLY_SALARY 등 영문코드, label=한글

자유서술/직접입력(예시)

  • 이름, 연락처, 이메일, 상세주소, 자기소개
  • 주요 경력, 세부 경력, 프로젝트, 공백 사유
  • 보유 기술/역량, 자격증, 포트폴리오 URL, 수상, 교육 이수
  • 상세 장애 설명, 보조기기, 필요 지원사항
  • 희망 연봉, 통근 범위, 지원 동기, 커리어 목표, 강점/약점, SNS/개인 웹사이트

프로필/키 관리

  • 공통: application.yml (공개 가능한 공통 설정)
  • 로컬: application-local.yml (로컬 하드코딩 키)
  • 운영: application-prod.yml (민감정보만 ${} 시크릿 참조, 비민감값은 local과 동일 고정값)

운영 필수 환경변수

  • DB_URL
  • DB_USERNAME
  • DB_PASSWORD
  • REDIS_PASSWORD
  • DATA_GO_KR_SERVICE_KEY
  • KRIC_SERVICE_KEY
  • SEOUL_OPEN_API_KEY
  • WORK24_VOCATIONAL_TRAINING_AUTH_KEY
  • WORK24_COMPETENCY_AUTH_KEY
  • NAVER_GEOCODE_API_KEY_ID
  • NAVER_GEOCODE_API_KEY
  • SPRING_BOT_DISCORD_WEBHOOK_URL
  • BRIDGEWORK_AUTH_JWT_SECRET
  • KAKAO_CLIENT_SECRET
  • NAVER_CLIENT_SECRET
  • BRIDGEWORK_FASTAPI_HEALTH_URL (선택, 미지정 시 기본 내부 URL 사용)
  • BRIDGEWORK_RECOMMEND_FASTAPI_BASE_URL (선택, 미지정 시 기본 내부 URL 사용)

역사 코드 파일(프로젝트 포함)

  • 기본 포함 파일: backend/resources/reference/operating_agency_station_codes_2026-02-28.xlsx
  • 로컬 기본 경로와 scripts/.env는 위 파일을 사용하도록 설정됨

실행 예시

  • 로컬: SPRING_PROFILES_ACTIVE=local
  • 로컬 FastAPI 주소 변경(선택): BRIDGEWORK_RECOMMEND_FASTAPI_BASE_URL=http://localhost:8000
  • 운영: SPRING_PROFILES_ACTIVE=prod

프로필 OCR 게이트웨이 설정

application.ymlbridgework.profile-ocr로 제어합니다.

  • fastapi-base-url (기본: http://localhost:8000)
  • extract-path (기본: /api/v1/profile-draft/from-portfolio)
  • request-timeout (기본: 180s)
  • max-upload-bytes (기본: 10485760)
  • allowed-content-types (기본: application/pdf)

CI/CD (main -> EC2 무중단 배포)

  • 워크플로우: .github/workflows/cicd-main-ec2.yml
  • 트리거: main 브랜치 push
  • 방식: Blue/Green 컨테이너(18080, 18081) 전환
  • DB: 컨테이너 DB 미사용, RDS PostgreSQL 접속(application-prod.yml 외부 파일 마운트)
  • Nginx 라우팅/업스트림 전환: backend-infra 레포에서 관리
  • Spring 트래픽 전환 스크립트: ~/bridgework-infra/deploy/spring_blue_green_switch.sh
  • FastAPI 트래픽 전환 스크립트: ~/bridgework-infra/deploy/fastapi_blue_green_switch.sh
  • Redis: 배포 스크립트에서 bridgework-redis 컨테이너를 자동 생성/기동(동일 Docker network)

GitHub Secrets

  • EC2_HOST
  • EC2_PORT
  • EC2_USER
  • EC2_SSH_PRIVATE_KEY
  • GHCR_READ_TOKEN (read:packages)
  • DB_URL
  • DB_USERNAME
  • DB_PASSWORD
  • REDIS_PASSWORD
  • DATA_GO_KR_SERVICE_KEY
  • KRIC_SERVICE_KEY
  • WORK24_VOCATIONAL_TRAINING_AUTH_KEY
  • WORK24_COMPETENCY_AUTH_KEY
  • SEOUL_OPEN_API_KEY
  • NAVER_GEOCODE_API_KEY_ID
  • NAVER_GEOCODE_API_KEY
  • SPRING_BOT_DISCORD_WEBHOOK_URL
  • BRIDGEWORK_AUTH_JWT_SECRET
  • KAKAO_CLIENT_SECRET
  • NAVER_CLIENT_SECRET

생성 방식

  • GitHub Actions가 위 개별 Secrets를 읽어 application-prod.yml을 런타임에 생성
  • 생성 파일을 EC2 ~/bridgework/backend/application-prod.yml로 업로드
  • 컨테이너 실행 시 /app/config/application-prod.yml로 read-only 마운트

EC2 선행 작업

  1. Docker, Nginx, curl 설치
  2. 배포 계정에 Docker 실행 권한 부여 (docker 그룹)
  3. 배포 계정에 sudo nginx -t, sudo systemctl reload nginx, sudo cp 권한 부여
  4. backend-infra 레포 CI/CD를 먼저 1회 실행해 ~/bridgework-infra/deploy를 준비

동기화 대상 데이터

SourceType(데이터명) 안내 링크 실제 호출 Endpoint 인증키 주요 파라미터
KEPAD_RECRUITMENT (한국장애인고용공단_장애인 구인 실시간 현황) 15117692 http://apis.data.go.kr/B552583/job/job_list_env data.go.kr 서비스키 serviceKey, pageNo, numOfRows(max=1000), _type=json
KEPAD_JOB_CATEGORY (한국장애인고용공단_장애인 고용직무분류) 15157071 http://apis.data.go.kr/B552583/jobcode/job_code data.go.kr 서비스키 serviceKey, pageNo, numOfRows(max=1000), _type=json
KEPAD_STANDARD_WORKPLACE (한국장애인고용공단_장애인 표준사업장 실시간 조회) 15119304 http://apis.data.go.kr/B552583/comp/comp_auth data.go.kr 서비스키 serviceKey, pageNo, numOfRows(max=1000), _type=json
KEPAD_SUPPORT_AGENCY (한국장애인고용공단_근로지원인 수행기관 실시간 정보) 15131282 http://apis.data.go.kr/B552583/instn/instn_list data.go.kr 서비스키 serviceKey, pageNo, numOfRows(max=1000), _type=json
KORAIL_WEEK_PERSON_FACILITIES (한국철도공사_편의시설정보(교통약자 편의시설)) 15125774 https://apis.data.go.kr/B551457/convenience/weekPersonFacilities data.go.kr 서비스키 serviceKey, pageNo, numOfRows(max=1000), returnType=JSON
SEOUL_TRANSPORT_WEAK_WHEELCHAIR_LIFT (서울교통공사_교합통약자이용정보(휠체어리프트)) 15143843 https://apis.data.go.kr/B553766/wksn/getWksnWhcllift data.go.kr 서비스키 serviceKey, pageNo, numOfRows(max=1000), dataType=JSON
TRANSPORT_SUPPORT_CENTER (전국교통약자이동지원센터정보표준데이터) 15028207 https://api.data.go.kr/openapi/tn_pubr_public_tfcwker_mvmn_cnter_api data.go.kr 서비스키 serviceKey, pageNo, numOfRows(max=1000), type=json
RAIL_WHEELCHAIR_LIFT (국가철도공단_역사별 휠체어리프트 위치) 15041686 https://openapi.kric.go.kr/openapi/vulnerableUserInfo/stationWheelchairLiftLocation KRIC_SERVICE_KEY service=vulnerableUserInfo, operation=stationWheelchairLiftLocation, serviceKey, railOprIsttCd, lnCd, stinCd, format=json
RAIL_WHEELCHAIR_LIFT_MOVEMENT (역사별 휠체어리프트 이동동선) KRIC 209 https://openapi.kric.go.kr/openapi/vulnerableUserInfo/stationWheelchairLiftMovement KRIC_SERVICE_KEY service=vulnerableUserInfo, operation=stationWheelchairLiftMovement, serviceKey, railOprIsttCd, lnCd, stinCd, format=json
SEOUL_WHEELCHAIR_LIFT (서울교통공사_휠체어리프트 설치현황) 15044262 https://api.odcloud.kr/api/{publicDataPk}/v1/{publicDataDetailPk} (openapi.doswagger-container/swagger-ui/script에서 최신 endpoint 후보를 추출해 호출) data.go.kr 서비스키 serviceKey, page, perPage(max=10000), returnType=JSON, 역명(xlsx의 STIN_NM 기반 순회)
SEOUL_SUBWAY_ENTRANCE_LIFT (서울시 지하철 출입구 리프트 위치정보) OA-21211 http://openapi.seoul.go.kr:8088/{API_KEY}/json/tbTraficEntrcLft/{start}/{end} data.seoul.go.kr 키 start/end(페이지 범위), max rows=1000
SEOUL_WALKING_NETWORK (서울특별시_자치구별 도보 네트워크 공간정보) OA-21208 http://openapi.seoul.go.kr:8088/{API_KEY}/json/TbTraficWlkNet/{start}/{end} data.seoul.go.kr 키 start/end(페이지 범위), max rows=1000
NATIONWIDE_BUS_STOP (국토교통부_전국 버스정류장 위치정보) 15067528 https://api.odcloud.kr/api/{publicDataPk}/v1/{publicDataDetailPk} (openapi.doswagger-container/swagger-ui/script에서 최신 endpoint 후보를 추출해 호출) data.go.kr 서비스키 serviceKey, page, perPage(max=10000), returnType=JSON
SEOUL_WHEELCHAIR_RAMP_STATUS (서울교통공사_휠체어경사로 설치 현황) OA-13116 https://datafile.seoul.go.kr/bigfile/iot/inf/nio_download.do (datasetView의 파일목록에서 최신 수정일 1건 선택 후 다운로드) 없음 infId, infSeq, seq, seqNo, useCache=false
SEOUL_LOW_FLOOR_BUS_ROUTE_RETENTION (서울시 저상버스 도입 노선 및 노선별 보유율) OA-22229 https://datafile.seoul.go.kr/bigfile/iot/inf/nio_download.do (datasetView의 파일목록에서 최신 수정일 1건 선택 후 다운로드) 없음 infId, infSeq, seq, seqNo, useCache=false
NATIONWIDE_TRAFFIC_LIGHT (전국신호등표준데이터) 15028198 https://api.data.go.kr/openapi/tn_pubr_public_traffic_light_api data.go.kr 서비스키 serviceKey, pageNo, numOfRows(max=1000), type=xml
NATIONWIDE_CROSSWALK (전국횡단보도표준데이터) 15028201 https://api.data.go.kr/openapi/tn_pubr_public_crosswalk_api data.go.kr 서비스키 serviceKey, pageNo, numOfRows(max=1000), type=xml
VOCATIONAL_TRAINING (한국고용정보원_직업훈련_국민내일배움카드 훈련과정) work24 000004 https://www.work24.go.kr/cm/openApi/call/hr/callOpenApiSvcInfo310L01.do Work24 인증키 authKey, returnType=XML, pageNum, pageSize(max=100)
JOBSEEKER_COMPETENCY_PROGRAM (한국고용정보원_구직자취업역량 강화프로그램) work24 000098 https://www.work24.go.kr/cm/openApi/call/wk/callOpenApiSvcInfo217L01.do Work24 인증키 authKey, returnType=XML, startPage, display(max=100), pgmStdt(YYYYMMDD, 오늘~1개월 후 반복)
  • SEOUL_WHEELCHAIR_LIFT, NATIONWIDE_BUS_STOPopenapi.do의 swagger 영역에서 최신 OpenAPI 후보를 찾지 못하면 동기화를 실패 처리한다(성공 fallback 없음).

API 응답 컬럼(공식 소개 페이지 기준)

  • 기준: 각 데이터 소개 페이지의 출력결과(Response Element)/출력변수/데이터항목(컬럼) 정보/swaggerJson
  • 아래 표는 소개 페이지 원문의 컬럼명과 설명을 그대로 반영했으며, 미기재 항목은 빈 설명으로 둠
  • LN_NM, STIN_NM은 역사코드 엑셀 기반 내부 보강 컬럼으로 소개 페이지 출력항목에는 없어 본 표에서 제외

KEPAD_RECRUITMENT 한국장애인고용공단_장애인 구인 실시간 현황

컬럼명 설명
header.resultMsg 결과메시지
header.resultCode 결과코드
body.items.item.termDate 모집기간
body.items.item.busplaName 사업장명
body.items.item.cntctNo 연락처
body.items.item.compAddr 사업장주소
body.items.item.empType 고용형태
body.items.item.enterType 입사형태
body.items.item.envBothHands 작업환경_양손사용
body.items.item.envEyesight 작업환경_시력
body.items.item.envHandwork 작업환경_손작업
body.items.item.envLiftPower 작업환경_드는힘
body.items.item.envLstnTalk 작업환경_듣고 말하기
body.items.item.envStndWalk 작업환경_서거나 걷기
body.items.item.jobNm 모집직종
body.items.item.offerregDt 구인신청일자
body.items.item.regDt 등록일
body.items.item.regagnName 담당기관
body.items.item.reqCareer 요구경력
body.items.item.reqEduc 요구학력
body.items.item.rno 순번
body.items.item.rnum 순번
body.items.item.salary 임금
body.items.item.salaryType 임금형태
body.numOfRows 한 페이지 결과 수
body.pageNo 페이지 번호
body.totalCount 전체 결과 수

KEPAD_JOB_CATEGORY 한국장애인고용공단_장애인 고용직무분류

컬럼명 설명
header.resultMsg 결과메시지
header.resultCode 결과코드
body.totalCount 전체 결과 수
body.numOfRows 한 페이지 결과 수
body.pageNo 페이지번호
body.items.item.jobCd 직종코드
body.items.item.jobCdLevel 직종명
body.items.item.jobCdNm 직종레벨
body.items.item.jobTask 수행업무
body.items.item.simlrJob 유사직무명
body.items.item.noticeCn 분류 시 주의사항
body.items.item.jobdevtipCn 취업알선 및 직무개발 tip
body.items.item.rnum 연번

KEPAD_STANDARD_WORKPLACE 한국장애인고용공단_장애인 표준사업장 실시간 조회

컬럼명 설명
header.resultCode 결과코드
header.resultMsg 결과메시지
body.items.item.address 소재지 주소
body.items.item.authDate 인증일자
body.items.item.compAuthId 등록번호
body.items.item.compBizNo 사업자등록번호
body.items.item.compName 기업명
body.items.item.compRegNo 인증번호
body.items.item.compTel 대표전화
body.items.item.presidentName 대표자
body.items.item.product 주요상품
body.items.item.rnum 순번
body.items.item.compTypeNm 인증유형
body.numOfRows 한 페이지 결과 수
body.pageNo 페이지 번호
body.totalCount 전체 결과 수

KEPAD_SUPPORT_AGENCY 한국장애인고용공단_근로지원인 수행기관 실시간 정보

컬럼명 설명
header.resultCode 결과코드
header.resultMsg 결과메시지
body.items.item.excInstn 시도구분
body.items.item.excInstnAddr 수행기관 주소
body.items.item.excInstnFxno 수행기관 팩스번호
body.items.item.excInstnNm 수행기관명
body.items.item.excInstnTelno 수행기관 전화번호
body.items.item.rnum 순번
body.numOfRows 한 페이지 결과 수
body.pageNo 페이지번호
body.totalCount 전체 결과 수

KORAIL_WEEK_PERSON_FACILITIES 한국철도공사_편의시설정보

컬럼명 설명
response.header.resultCode 응답의 결과 코드
response.header.resultMsg 응답의 결과 메세지
response.body.dataType 응답의 데이터 타입
response.body.numOfRows 한 페이지 결과 수
response.body.pageNo 페이지번호
response.body.totalCount 전체 데이터 수
response.body.items.item[].pwdbs_slwy_estnc 장애인경사로유무
response.body.items.item[].pwdbs_tolt_estnc 장애인화장실유무
response.body.items.item[].stn_cd 역코드
response.body.items.item[].stn_nm 역명
response.body.items.item[].whlch_liftt_cnt 휠체어리프트수

SEOUL_TRANSPORT_WEAK_WHEELCHAIR_LIFT 서울교통공사_교통약자이용정보

컬럼명 설명
header.resultMsg 결과메세지
header.resultCode 결과코드
body.items.item.oprtngSitu 가동현황
body.items.item.fcltNm 교통약자 이용시설명
body.items.item.lineNm 해당 지하철 호선명
body.items.item.stnCd 해당 지하철 역코드
body.items.item.stnNo 해당 지하철 역번호
body.items.item.stnNm 해당 지하철 역명
body.items.item.crtrYmd 기준일자 (일자형식: YYYYMMDD)
body.items.item.elvtrSn 지하철 편의시설 - 승강기 일련번호
body.items.item.mngNo 지하철 편의시설 - 관리번호
body.items.item.vcntEntrcNo 교통약자 이용시설 - 근접 출입구 번호
body.items.item.bgngFlrGrndUdgdSe 교통약자 이용시설 - 시작층 지상지하구분 (지상/지하 구분0
body.items.item.bgngFlr 교통약자 이용시설 - 시작층 위치
body.items.item.bgngFlrDtlPstn 교통약자 이용시설 - 시작층 상세위치
body.items.item.endFlrGrndUdgdSe 교통약자 이용시설 - 종료층 지상지하구분 (지상/지하 구분)
body.items.item.endFlr 교통약자 이용시설 - 위치 종료층
body.items.item.endFlrDtlPstn 교통약자 이용시설 - 종료층 상세위치
body.items.item.elvtrLen 교통약자 이용시설 - 길이
body.items.item.elvtrWdthBt 교통약자 이용시설 - 가로 넓이
body.items.item.limitWht 교통약자 이용시설 - 한계중량
body.items.item.fcltNo 교통약자 이용시설 - 가동현황
body.numOfRows 페이지 결과 수
body.pageNo 페이지 번호
body.totalCount 데이터 총 개수

TRANSPORT_SUPPORT_CENTER 전국교통약자이동지원센터정보표준데이터

컬럼명 설명
TFCWKER_MVMN_CNTER_NM 교통약자이동지원센터명
RDNMADR 소재지도로명주소
LNMADR 소재지지번주소
LATITUDE 위도
LONGITUDE 경도
CAR_HOLD_CO 보유차량대수
CAR_HOLD_KND 보유차량종류
SLOPE_VHCLE_CO 슬로프형휠체어차량대수
LIFT_VHCLE_CO 리프트형휠체어차량대수
RCEPT_PHONE_NUMBER 예약접수전화번호
RCEPT_ITNADR 예약접수인터넷주소
APP_SVC_NM 앱서비스명
WEEKDAY_RCEPT_OPEN_HHMM 평일예약접수운영시작시각
WEEKDAY_RCEPT_COLSE_HHMM 평일예약접수운영종료시각
WKEND_RCEPT_OPEN_HHMM 주말예약접수운영시작시각
WKEND_RCEPT_CLOSE_HHMM 주말예약접수운영종료시각
WEEKDAY_OPER_OPEN_HHMM 차량평일운행시작시각
WEEKDAY_OPER_COLSE_HHMM 차량평일운행종료시각
WKEND_OPER_OPEN_HHMM 차량주말운행시작시각
WKEND_OPER_CLOSE_HHMM 차량주말운행종료시각
BEFFAT_RESVE_PD 사전예약신청기간
USE_LMTT 차량이용제한사항
INSIDE_OPRAT_AREA 차량관내운행지역
OUTSIDE_OPRAT_AREA 차량관외운행지역
USE_TRGET 차량이용대상
USE_CHARGE 차량이용요금
INSTITUTION_NM 관리기관명
PHONE_NUMBER 관리기관전화번호
REFERENCE_DATE 데이터기준일자
instt_code 제공기관코드
instt_nm 제공기관기관명

RAIL_WHEELCHAIR_LIFT 국가철도공단_역사별 휠체어리프트 위치

컬럼명 설명
bndWgt 한계중량
dtlLoc 상세위치
exitNo 출구번호
grndDvNmFr 운행시작(지상/지하)
grndDvNmTo 운행종료(지상/지하)
len 길이
lnCd 선코드
railOprIsttCd 철도운영기관코드
runStinFlorFr 운행시작층
runStinFlorTo 운행종료층
stinCd 역코드
wd

RAIL_WHEELCHAIR_LIFT_MOVEMENT 역사별 휠체어리프트 이동동선

컬럼명 설명
lnCd 선코드
mvContDtl 상세 이동내용
mvDst 이동거리
mvPathDvCd 이동경로구분코드
mvPathDvNm 이동경로구분
mvPathMgNo 이동경로관리번호
mvTpOrdr 이동유형순서
railOprIsttCd 철도운영기관코드
stinCd 역코드

SEOUL_WHEELCHAIR_LIFT 서울교통공사_휠체어리프트 설치현황

컬럼명 설명
SERIAL NUMBER 연번 (항목명: 연번)
LINE NAME 호선 (항목명: 호선)
STATION NAME 역명 (항목명: 역명)
MANAGEMENT NAME 관리번호(호기) (항목명: 관리번호(호기))
ENTRANCE NUMBER (근접) 출입구번호 (항목명: (근접) 출입구번호)
STARTING FLOOR(GROUND_BASEMENT) 시작층(지상_지하) (항목명: 시작층(지상_지하))
STARTING FLOOR(OPERATION STATION FLOOR) 시작층(운행역층) (항목명: 시작층(운행역층))
STARTING FLOOR(DETAILED LOCATION) 시작층(상세위치) (항목명: 시작층(상세위치))
END FLOOR(GROUND_BASEMENT) 종료층(지상_지하) (항목명: 종료층(지상_지하))
END FLOOR(OPERATION STATION FLOOR) 종료층(운행역층) (항목명: 종료층(운행역층))
END FLOOR(DETAILED LOCATION) 종료층(상세위치) (항목명: 종료층(상세위치))
LEGNTH 길이 (항목명: 길이)
WIDTH 폭 (항목명: 폭)
WEIGHT 한계중량 (항목명: 한계중량)
DATA BASEDATA 데이터 기준일자 (항목명: 데이터 기준일자)

SEOUL_SUBWAY_ENTRANCE_LIFT 서울시 지하철 출입구 리프트 위치정보

컬럼명 설명
list_total_count 총 데이터 건수 (정상조회 시 출력됨)
RESULT.CODE 요청결과 코드 (하단 메세지설명 참고)
RESULT.MESSAGE 요청결과 메시지 (하단 메세지설명 참고)
NODE_TYPE 노드링크 유형
NODE_WKT 노드 WKT
NODE_ID 노드 ID
NODE_TYPE_CD 노드 유형 코드
SGG_CD 시군구코드
SGG_NM 시군구명
EMD_CD 읍면동코드
EMD_NM 읍면동명
SBWY_STN_CD 지하철역코드
SBWY_STN_NM 지하철역명

SEOUL_WALKING_NETWORK 서울특별시_자치구별 도보 네트워크 공간정보

컬럼명 설명
list_total_count 총 데이터 건수 (정상조회 시 출력됨)
RESULT.CODE 요청결과 코드 (하단 메세지설명 참고)
RESULT.MESSAGE 요청결과 메시지 (하단 메세지설명 참고)
NODE_TYPE 노드링크 유형
NODE_WKT 노드 WKT
NODE_ID 노드 ID
NODE_TYPE_CD 노드 유형 코드
LNKG_WKT 링크 WKT
LNKG_ID 링크 ID
LNKG_TYPE_CD 링크 유형 코드
BGNG_LNKG_ID 시작노드 ID
END_LNKG_ID 종료노드 ID
LNKG_LEN 링크 길이
SGG_CD 시군구코드
SGG_NM 시군구명
EMD_CD 읍면동코드
EMD_NM 읍면동명
EXPN_CAR_RD 고가도로
SBWY_NTW 지하철네트워크
BRG 교량
TNL 터널
OVRP 육교
CRSWK 횡단보도
PARK 공원,녹지
BLDG 건물내

NATIONWIDE_BUS_STOP 국토교통부_전국 버스정류장 위치정보

컬럼명 설명
NODE_ID 정류장 ID (항목명: 정류장번호)
NODE_NM 정류장 명칭 (항목명: 정류장명)
GPS_LATI GPS 위도(WGS84 위경도) (항목명: 위도)
GPS_LONG GPS 경도(WGS84 위경도) (항목명: 경도)
COLLECTD_TIME 정보수집일 (항목명: 정보수집일)
NODE_MOBILE_ID 모바일(ARS)/단축 ID (항목명: 모바일단축번호)
CITY_CD 도시코드 (항목명: 도시코드)
CITY_NAME 도시명 (항목명: 도시명)
ADMIN_NM 관리도시명 (항목명: 관리도시명)

SEOUL_WHEELCHAIR_RAMP_STATUS 서울교통공사_휠체어경사로 설치 현황

컬럼명 설명
호선
역명
구분
위치

SEOUL_LOW_FLOOR_BUS_ROUTE_RETENTION 서울시 저상버스 도입 노선 및 노선별 보유율

컬럼명 설명
노선\n번호
인가\n대수
저상버스 대수
저상보유율

NATIONWIDE_TRAFFIC_LIGHT 전국신호등표준데이터

컬럼명 설명
ctprvnNm 시도명
signguNm 시군구명
roadKnd 도로종류
roadRouteNo 도로노선번호
roadRouteNm 도로노선명
roadRouteDrc 도로노선방향
rdnmadr 소재지도로명주소
lnmadr 소재지지번주소
latitude 위도
longitude 경도
sgngnrInstlMthd 신호기설치방식
roadType 도로형태
priorRoadYn 주도로여부
tfclghtManageNo 신호등관리번호
tfclghtSe 신호등구분
tfclghtColorKnd 신호등색종류
sgnaspMthd 신호등화방식
sgnaspOrdr 신호등화순서
sgnaspTime 신호등화시간
sotKnd 광원종류
signlCtrlMthd 신호제어방식
signlTimeMthdType 신호시간결정방식
opratnYn 점멸등운영여부
flashingLightOpenHhmm 점멸등운영시작시각
flashingLightCloseHhmm 점멸등운영종료시각
fnctngSgngnrYn 보행자작동신호기유무
remndrIdctYn 잔여시간표시기유무
sondSgngnrYn 시각장애인용음향신호기유무
drcbrdSn 도로안내표지일련번호
institutionNm 관리기관명
phoneNumber 관리기관전화번호
referenceDate 데이터기준일자
instt_code 제공기관코드

NATIONWIDE_CROSSWALK 전국횡단보도표준데이터

컬럼명 설명
ctprvnNm 시도명
signguNm 시군구명
roadNm 도로명
rdnmadr 소재지도로명주소
lnmadr 소재지지번주소
crslkManageNo 횡단보도관리번호
crslkKnd 횡단보도종류
bcyclCrslkCmbnatYn 자전거횡단도겸용여부
highlandYn 고원식적용여부
latitude 위도
longitude 경도
cartrkCo 차로수
bt 횡단보도폭
et 횡단보도연장
tfclghtYn 보행자신호등유무
fnctngSgngnrYn 보행자작동신호기유무
sondSgngnrYn 음향신호기설치여부
greenSgngnrTime 녹색신호시간
redSgngnrTime 적색신호시간
tfcilndYn 교통섬유무
ftpthLowerYn 보도턱낮춤여부
brllBlckYn 점자블록유무
cnctrLghtFcltyYn 집중조명시설유무
institutionNm 관리기관명
phoneNumber 관리기관전화번호
referenceDate 데이터기준일자
instt_code 제공기관코드

VOCATIONAL_TRAINING 한국고용정보원_직업훈련_국민내일배움카드 훈련과정

컬럼명 설명
HRDNet XML문서의 최상위 노드입니다.
scn_cnt 검색된 총 건수
pageNum 현재페이지
pageSize 페이지당 출력개수, 페이지당 표현될 자료의 개수
srchList
scn_list
ADDRESS 주소
CERTIFICATE 자격증
CONTENTS 컨텐츠
COURSE_MAN 수강비
EI_EMPL_CNT3 고용보험3개월 취업인원 수
EI_EMPL_CNT3_GT10 고용보험3개월 취업누적인원 10인이하 여부 (Y/N) 17.11.07부터 제공되지 않는 항목이나 기존 API 사용자를 위해 Null값을 제공
EI_EMPL_RATE3 고용보험3개월 취업률
EI_EMPL_RATE6 고용보험6개월 취업률
GRADE 등급
INST_CD 훈련기관 코드
NCS_CD NCS 코드
REAL_MAN 실제 훈련비
REG_COURSE_MAN 수강신청 인원
STDG_SCOR 만족도 점수
SUB_TITLE 부 제목
SUB_TITLE_LINK 부 제목 링크
TEL_NO 전화번호
TITLE 제목
TITLE_ICON 제목 아이콘
TITLE_LINK 제목 링크
TRA_END_DATE 훈련종료일자
TRA_START_DATE 훈련시작일자
TRAIN_TARGET 훈련대상
TRAIN_TARGET_CD 훈련구분
TRAINST_CST_ID 훈련기관ID
TRNG_AREA_CD 지역코드(중분류)
TRPR_DEGR 훈련과정 순차
TRPR_ID 훈련과정ID
WKED_SE 주말/주중 구분
YARD_MAN 정원

JOBSEEKER_COMPETENCY_PROGRAM 한국고용정보원_구직자취업역량 강화프로그램

컬럼명 설명
empPgmSchdInviteList
total 총건수
startPage 기본값 1, 최대 1000 검색의 시작위치를 지정 할 수 있습니다.
display 출력건수, 기본값 10
empPgmSchdInvite
orgNm 고용센터명
pgmNm 프로그램명
pgmSubNm 과정명
pgmTarget 대상자
pgmStdt 과정시작일( YYYYMMDD )
pgmEndt 과정종료일( YYYYMMDD )
openTimeClcd 오전, 오후 구분 - 오전 : 1 - 오후 : 2
openTime 시작시간( HH:MM ) - 24시 표현식이 아닌 12시 표현 방식으로 제공됩니다 - ex) 오전 10시 > 10:00 - 오후 10시 > 10:00
operationTime 운영시간
openPlcCont 개최장소

데이터 저장 방식

  • app_user: 계정 정보(소셜 provider/userId, 이메일, 권한, 가입완료, 상태/탈퇴시각)
  • user_profile: 사용자 프로필(최대 3개, 기본 프로필 1개 필수)
  • public_data_record: 원본 payload(JSON), 해시, 외부ID, 수집시각 저장
  • public_data_record_field: payload를 field_path 단위로 펼쳐 저장
  • pd_* 정규화 테이블: 데이터셋별 컬럼형 저장(스코어링/지도 조회용)
  • 변경건만 payload/필드 재저장, 동일건은 수집시각만 갱신
  • 각 소스 전체 페이지 수집이 끝난 뒤 API 결과에 없는 기존 데이터는 DB에서 삭제
  • KEPAD_RECRUITMENT, KEPAD_SUPPORT_AGENCY는 네이버 지오코딩으로 geo_latitude, geo_longitude, geo_matched_address를 함께 저장

공공데이터 DB 스키마(테이블/컬럼)

원본/운영 테이블

  • public_data_record
    • id, source_type, external_id, payload_json, payload_hash, raw_fetched_at, created_at, updated_at
  • public_data_record_field
    • id, record_id, field_path, field_value, value_type, created_at, updated_at
  • public_data_sync_log
    • id, source_type, request_source, status, processed_count, new_count, updated_count, failed_count, error_message, started_at, ended_at
  • public_data_source_snapshot
    • source_type, latest_revision, latest_file_name, latest_modified_date, created_at, updated_at

정규화 테이블 공통 컬럼

모든 pd_* 테이블은 아래 공통 컬럼을 가진다.

  • id, external_id, payload_hash, raw_fetched_at, created_at, updated_at

정규화 테이블 ↔ 데이터셋 매핑

  • pd_kepad_recruitmentKEPAD_RECRUITMENT (한국장애인고용공단_장애인 구인 실시간 현황)
  • pd_kepad_job_categoryKEPAD_JOB_CATEGORY (한국장애인고용공단_장애인 고용직무분류)
  • pd_kepad_standard_workplaceKEPAD_STANDARD_WORKPLACE (한국장애인고용공단_장애인 표준사업장 실시간 조회)
  • pd_kepad_support_agencyKEPAD_SUPPORT_AGENCY (한국장애인고용공단_근로지원인 수행기관 실시간 정보)
  • pd_korail_week_person_facilitiesKORAIL_WEEK_PERSON_FACILITIES (한국철도공사_편의시설정보)
  • pd_seoul_transport_weak_wheelchair_liftSEOUL_TRANSPORT_WEAK_WHEELCHAIR_LIFT (서울교통공사_교통약자이용정보(휠체어리프트))
  • pd_transport_support_centerTRANSPORT_SUPPORT_CENTER (전국교통약자이동지원센터정보표준데이터)
  • pd_rail_wheelchair_liftRAIL_WHEELCHAIR_LIFT (국가철도공단_역사별 휠체어리프트 위치)
  • pd_rail_wheelchair_lift_movementRAIL_WHEELCHAIR_LIFT_MOVEMENT (역사별 휠체어리프트 이동동선)
  • pd_seoul_wheelchair_liftSEOUL_WHEELCHAIR_LIFT (서울교통공사_휠체어리프트 설치현황)
  • pd_seoul_subway_entrance_liftSEOUL_SUBWAY_ENTRANCE_LIFT (서울시 지하철 출입구 리프트 위치정보)
  • pd_seoul_walking_networkSEOUL_WALKING_NETWORK (서울특별시_자치구별 도보 네트워크 공간정보)
  • pd_nationwide_bus_stopNATIONWIDE_BUS_STOP (국토교통부_전국 버스정류장 위치정보)
  • pd_seoul_wheelchair_ramp_statusSEOUL_WHEELCHAIR_RAMP_STATUS (서울교통공사_휠체어경사로 설치 현황)
  • pd_seoul_low_floor_bus_route_retentionSEOUL_LOW_FLOOR_BUS_ROUTE_RETENTION (서울시 저상버스 도입 노선 및 노선별 보유율)
  • pd_nationwide_traffic_lightNATIONWIDE_TRAFFIC_LIGHT (전국신호등표준데이터)
  • pd_nationwide_crosswalkNATIONWIDE_CROSSWALK (전국횡단보도표준데이터)
  • pd_vocational_trainingVOCATIONAL_TRAINING (한국고용정보원_직업훈련_국민내일배움카드 훈련과정)
  • pd_jobseeker_competency_programJOBSEEKER_COMPETENCY_PROGRAM (한국고용정보원_구직자취업역량 강화프로그램)

정규화 테이블별 데이터 컬럼

  • pd_kepad_recruitment
    • buspla_name, cntct_no, comp_addr, emp_type, enter_type, env_both_hands, env_eyesight, env_lstn_talk, job_nm, offerreg_dt, reg_dt, regagn_name, req_career, req_educ, rno, rnum, salary, salary_type, term_date, env_hand_work, env_lift_power, env_stnd_walk, req_major, req_licens, geo_original_address, geo_matched_address, geo_latitude, geo_longitude
  • pd_kepad_job_category
    • job_cd, job_cd_level, job_cd_nm, rnum, job_task, notice_cn, simlr_job, sprd_ockcls_yn, jobdevtip_cn
  • pd_kepad_standard_workplace
    • address, auth_date, comp_auth_id, comp_biz_no, comp_name, comp_reg_no, comp_tel, comp_type_nm, president_name, product, rnum, comp_mgr_no, cancel_date, comp_cert
  • pd_kepad_support_agency
    • exc_instn, exc_instn_addr, exc_instn_fxno, exc_instn_nm, exc_instn_telno, rnum, geo_original_address, geo_matched_address, geo_latitude, geo_longitude
  • pd_korail_week_person_facilities
    • pwdbs_slwy_estnc, pwdbs_tolt_estnc, stn_cd, stn_nm, whlch_liftt_cnt
  • pd_seoul_transport_weak_wheelchair_lift
    • fclt_no, fclt_nm, line_nm, stn_cd, stn_nm, stn_no, crtr_ymd, elvtr_sn, mng_no, vcnt_entrc_no, bgng_flr_grnd_udgd_se, bgng_flr, bgng_flr_dtl_pstn, end_flr_grnd_udgd_se, end_flr, end_flr_dtl_pstn, elvtr_len, elvtr_wdth_bt, limit_wht, oprtng_situ
  • pd_transport_support_center
    • tfcwker_mvmn_cnter_nm, rdnmadr, lnmadr, latitude, longitude, car_hold_co, car_hold_knd, slope_vhcle_co, lift_vhcle_co, rcept_phone_number, rcept_itnadr, app_svc_nm, weekday_rcept_open_hhmm, weekday_rcept_colse_hhmm, wkend_rcept_open_hhmm, wkend_rcept_close_hhmm, weekday_oper_open_hhmm, weekday_oper_colse_hhmm, wkend_oper_open_hhmm, wkend_oper_close_hhmm, beffat_resve_pd, use_lmtt, inside_oprat_area, outside_oprat_area, use_trget, use_charge, institution_nm, phone_number, reference_date, instt_code, instt_nm
  • pd_rail_wheelchair_lift
    • rail_opr_istt_cd, ln_cd, stin_cd, exit_no, dtl_loc, grnd_dv_nm_fr, run_stin_flor_fr, grnd_dv_nm_to, run_stin_flor_to, len, wd, bnd_wgt, ln_nm, stin_nm
  • pd_rail_wheelchair_lift_movement
    • rail_opr_istt_cd, ln_cd, stin_cd, mv_path_mg_no, mv_path_dv_cd, mv_path_dv_nm, mv_tp_ordr, mv_dst, mv_cont_dtl, ln_nm, stin_nm
  • pd_seoul_wheelchair_lift
    • entrance_no, management_no, length, data_base_date, elevator_serial_no, start_floor_detail_location, start_floor_operation_station_floor, start_floor_ground_basement, station_name, serial_number, end_floor_detail_location, end_floor_operation_station_floor, end_floor_ground_basement, width, weight_limit, line_name
  • pd_seoul_subway_entrance_lift
    • node_type, node_wkt, node_id, node_type_cd, sgg_cd, sgg_nm, emd_cd, emd_nm, sbwy_stn_cd, sbwy_stn_nm
  • pd_seoul_walking_network
    • node_type, node_wkt, node_id, node_type_cd, lnkg_wkt, lnkg_id, lnkg_type_cd, bgng_lnkg_id, end_lnkg_id, lnkg_len, sgg_cd, sgg_nm, emd_cd, emd_nm, expn_car_rd, sbwy_ntw, brg, tnl, ovrp, crswk, park, bldg
  • pd_nationwide_bus_stop
    • longitude, admin_city_name, city_name, city_code, mobile_short_no, latitude, stop_name, stop_id, collected_at
  • pd_seoul_wheelchair_ramp_status
    • line_name, station_name, division, location
  • pd_seoul_low_floor_bus_route_retention
    • route_no, authorized_count, low_floor_bus_count, low_floor_retention_rate
  • pd_nationwide_traffic_light
    • ctprvn_nm, signgu_nm, road_knd, road_route_no, road_route_nm, road_route_drc, rdnmadr, lnmadr, latitude, longitude, sgngnr_instl_mthd, road_type, prior_road_yn, tfclght_manage_no, tfclght_se, tfclght_color_knd, sgnasp_mthd, sgnasp_ordr, sgnasp_time, sot_knd, signl_ctrl_mthd, signl_time_mthd_type, opratn_yn, flashing_light_open_hhmm, flashing_light_close_hhmm, fnctng_sgngnr_yn, remndr_idct_yn, sond_sgngnr_yn, drcbrd_sn, institution_nm, phone_number, reference_date, instt_code, instt_nm
  • pd_nationwide_crosswalk
    • ctprvn_nm, signgu_nm, road_nm, rdnmadr, lnmadr, crslk_manage_no, crslk_knd, bcycl_crslk_cmbnat_yn, highland_yn, latitude, longitude, cartrk_co, bt, et, tfclght_yn, fnctng_sgngnr_yn, sond_sgngnr_yn, green_sgngnr_time, red_sgngnr_time, tfcilnd_yn, ftpth_lower_yn, brll_blck_yn, cnctr_lght_fclty_yn, institution_nm, phone_number, reference_date, instt_code, instt_nm
  • pd_vocational_training
    • address, certificate, contents, course_man, ei_empl_cnt3, ei_empl_cnt3_gt10, ei_empl_rate3, ei_empl_rate6, grade, inst_cd, ncs_cd, real_man, reg_course_man, stdg_scor, sub_title, sub_title_link, tel_no, title, title_icon, title_link, tra_end_date, tra_start_date, train_target, train_target_cd, trainst_cst_id, trng_area_cd, trpr_degr, trpr_id, wkend_se, yard_man
  • pd_jobseeker_competency_program
    • org_nm, pgm_nm, pgm_sub_nm, pgm_target, pgm_stdt, pgm_endt, open_time_clcd, open_time, operation_time, open_plc_cont

스케줄러

  • Cron: bridgework.sync.cron
  • 기본값: 0 0 0 * * *
  • ShedLock 적용으로 다중 인스턴스 중복 실행 방지
  • 페이징은 API별 최대 페이지 크기로 조회하고 마지막 페이지까지 순회
  • SEOUL_WHEELCHAIR_RAMP_STATUS, SEOUL_LOW_FLOOR_BUS_ROUTE_RETENTION는 최신 파일 revision 동일 시 스킵(public_data_source_snapshot 기준)
  • 탈퇴 최종 처리 스케줄러: bridgework.auth.withdrawal-finalize-interval (기본 1h)

Discord 알림

  • 동기화 시작: 🚀 [공공데이터 동기화 시작 알림]
  • 동기화 완료: 성공 ✅ [공공데이터 동기화 완료 알림], 실패 ❌ [공공데이터 동기화 완료 알림]
  • Error 로그: 🚨 [Error 로그 발생]
  • 회원가입 완료: 🎉 [회원가입 완료 알림]
  • 모든 알림 메시지는 마지막 줄바꿈(\n)을 포함한다.
  • 동기화 완료 알림은 단일 동기화일 때 소스별 상세를 생략하고, 전체 동기화일 때 소스별 상태/건수/소요 시간을 상세로 포함한다.
  • Discord 전송 실패는 본 업무 플로우를 중단하지 않으며, 타임아웃/네트워크 계열 오류에 대해 재시도한다(retry=2, backoff=700ms, timeout=10s).

수동 실행/조회 API

  • 소셜 로그인: POST /api/v1/auth/social/login

    • 응답 상태: SIGNUP_REQUIRED / ACTIVE / PENDING_DELETION
  • 회원가입 완료(기본 프로필 생성 포함): POST /api/v1/auth/social/signup/complete

  • 관리자 로그인: POST /api/v1/auth/admin/login

    • 요청 바디: {"loginId":"admin01","password":"***"}
    • 관리자 계정은 admin_account 테이블에 사전 등록되어 있어야 함
  • 토큰 재발급: POST /api/v1/auth/token/refresh

  • 로그아웃: POST /api/v1/auth/logout

  • 내 정보 조회: GET /api/v1/auth/me

  • 회원 탈퇴 신청: DELETE /api/v1/auth/withdraw

  • 회원 탈퇴 신청 취소: POST /api/v1/auth/withdraw/cancel

  • 내 프로필 목록: GET /api/v1/profiles

  • 프로필 생성: POST /api/v1/profiles

  • 프로필 단건 조회: GET /api/v1/profiles/{profileId}

  • 프로필 수정: PUT /api/v1/profiles/{profileId}

  • 프로필 삭제: DELETE /api/v1/profiles/{profileId}

  • 기본 프로필 지정: PATCH /api/v1/profiles/{profileId}/set-default

  • 직무 트리 옵션: GET /api/v1/options/job-categories/tree

  • 지역 옵션: GET /api/v1/options/regions

  • 고용형태 옵션: GET /api/v1/options/employment-types

  • 급여 방식 옵션: GET /api/v1/options/salary-types

  • 근로지원인 수행기관 마커: GET /api/v1/map/support-agencies

  • 퀵 추천 게이트웨이(기능2): POST /api/v1/recommend/quick

  • 지도 추천 게이트웨이(기능3): POST /api/v1/recommend/map

    • 요청 바디: {"aiEnabled": true|false, "profileId": 1}
  • 추천 설명 생성 게이트웨이: POST /api/v1/recommend/explain

    • 요청 바디: FastAPI 설명 API 스키마에 맞는 job/score/evidence 구조
  • 전체 동기화(관리자): POST /api/v1/admin/sync/public-data/run

  • 단일 동기화(관리자): POST /api/v1/admin/sync/public-data/run?sourceType=KEPAD_RECRUITMENT

  • 동기화 로그(관리자): GET /api/v1/admin/sync/public-data/logs

  • 동기화 로그 초기화(관리자): DELETE /api/v1/admin/sync/public-data/logs

  • 소스 설정(관리자): GET /api/v1/admin/sync/public-data/sources

  • 정규화 테이블 건수(관리자): GET /api/v1/admin/sync/public-data/normalized-counts

  • 저장 레코드 목록(관리자): GET /api/v1/admin/public-data/records?sourceType=KEPAD_RECRUITMENT&page=0&size=20&includePayload=false

  • 저장 레코드 상세(관리자): GET /api/v1/admin/public-data/records/{recordId}?includePayload=true

  • 더미 사용자 케이스 목록(관리자): GET /api/v1/admin/dummy-auth/cases

  • 더미 사용자 Access 토큰 발급(관리자): POST /api/v1/admin/dummy-auth/login

    • 요청 바디: {"dummyKey":"case-office-rookie"}

관리자 계정 등록 예시

INSERT INTO admin_account (login_id, password_hash, role, is_active, created_at, updated_at)
VALUES ('admin01', '$2a$12$REPLACE_WITH_BCRYPT_HASH', 'ADMIN', TRUE, NOW(), NOW());

CSV 내보내기 스크립트

  • 파일: scripts/export_public_data_to_csv.py
  • 목적: 모든 동기화 대상 데이터를 API에서 직접 호출해 데이터별 CSV 저장
  • 키 주입: scripts/.env에 직접 설정
  • 필요 환경변수: DATA_GO_KR_SERVICE_KEY, KRIC_SERVICE_KEY, SEOUL_OPEN_API_KEY, KRIC_STATION_CODE_XLSX_PATH, WORK24_VOCATIONAL_TRAINING_AUTH_KEY, WORK24_COMPETENCY_AUTH_KEY
  • KRIC_STATION_CODE_XLSX_PATH 파일은 국가철도공단서울교통공사 수집 시 모두 사용
  • 실행 예시: python3 scripts/export_public_data_to_csv.py --output-dir exports --page-size 0 --max-pages 0
  • 무데이터/오류 메시지는 CSV 행으로 기록하지 않음
  • 실행 로그에 요청 URL(파라미터 포함), 재시도, 감지 건수(detected)를 출력
  • SEOUL_WHEELCHAIR_RAMP_STATUS, SEOUL_LOW_FLOOR_BUS_ROUTE_RETENTION는 datasetView의 파일목록에서 수정일 최신 파일 1건만 다운로드
  • 위 2개 소스는 이전 실행과 최신 파일 revision(수정일+seq+파일명)이 같으면 스킵
  • revision 상태 파일: exports/.source_revisions.json
  • 특정 데이터명만 실행(한글명/영문 slug(csv 파일명) 둘 다 지원): python3 scripts/export_public_data_to_csv.py --only-data-name "국가철도공단_역사별 휠체어리프트 위치"
  • 특정 데이터명 여러개 실행: python3 scripts/export_public_data_to_csv.py --only-data-name "한국장애인고용공단_장애인 구인 실시간 현황" --only-data-name "seoul_wheelchair_lift"
  • 필요 라이브러리: pip install requests pandas

About

Next.js, Spring, FastAPI, PostgreSQL/PostGIS 기반의 장애인 일자리 추천 서비스. 공공데이터와 GIS 접근성 분석으로 이동 편의성을 평가합니다.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors