활동 API
봉사활동, 비교과과정, 봉사학습 신청·조회·취소·평가 제출 전체 명세
엔드포인트 목록
| 메서드 | 경로 | 설명 |
|---|---|---|
GET | /api/volunteer-service/ | 봉사활동 목록 및 신청 내역 |
POST | /api/volunteer-service/apply/ | 봉사활동 신청 |
POST | /api/volunteer-service/cancel/ | 봉사활동 취소 |
GET | /api/extracurricular/ | 비교과과정 프로그램 목록 |
POST | /api/extracurricular/detail/ | 비교과과정 상세 조회 |
GET | /api/extracurricular/attach/ | 비교과과정 첨부파일 목록 |
GET | /api/extracurricular/leaflet/ | 비교과과정 리플렛 목록 |
GET | /api/extracurricular/download/ | 비교과과정 파일 다운로드 |
GET | /api/service-learning/ | 봉사학습 강의 목록 및 신청 내역 |
POST | /api/service-learning/detail/ | 봉사학습 강의 상세 조회 |
POST | /api/service-learning/apply/ | 봉사학습 신청 |
POST | /api/service-learning/cancel/ | 봉사학습 취소 |
POST | /api/service-learning/eval/save/ | 봉사학습 평가 저장 |
GET | /api/service-learning/attach/ | 봉사학습 첨부파일 목록 |
GET | /api/service-learning/download/ | 봉사학습 파일 다운로드 |
모든 엔드포인트는 sch_session 쿠키 인증이 필요합니다.
봉사활동
SCH 통합정보시스템의 봉사활동 신청·관리 API입니다. 학기별 개설 봉사활동 목록 조회, 신청, 취소를 지원합니다.
GET /api/volunteer-service/
현재 학기 또는 지정한 학기의 봉사활동 개설 목록과 본인 신청 내역을 반환합니다. yy와 smt를 모두 생략하면 응답의 period_list 첫 번째 항목(가장 최근 학기)을 기준으로 자동 조회합니다.
쿼리 파라미터
| 파라미터 | 타입 | 필수 | 허용값 | 설명 |
|---|---|---|---|---|
yy | string | 아니오 | 4자리 연도 | 학년도 (예: 2025) — 생략 시 최신 학기 자동 적용 |
smt | string | 아니오 | 11, 21 | 학기 코드 — 생략 시 최신 학기 자동 적용 |
smt 허용값:
| 값 | 설명 |
|---|---|
11 | 1학기 |
21 | 2학기 |
yy와 smt는 항상 함께 전달해야 합니다. 둘 중 하나만 전달하면 나머지를 기본값으로 채웁니다. 특정 과거 학기를 조회할 때는 두 파라미터를 모두 전달하세요.
GET /api/volunteer-service/?yy=2025&smt=11응답
200 OK
{
"yy": "2025",
"smt": "11",
"period_list": [
{
"YY": "2025",
"SMT": "11",
"SMT_NM": "1학기",
"FRMT_DT": "20250301",
"END_DT": "20250630"
},
{
"YY": "2024",
"SMT": "21",
"SMT_NM": "2학기",
"FRMT_DT": "20240901",
"END_DT": "20241231"
}
],
"aply_list": [
{
"ORGAN_CD": "ORG001",
"ORGAN_NM": "아산시자원봉사센터",
"SERV_CD": "VS202501001",
"SERV_NM": "노인복지관 급식 봉사",
"SERV_DT": "20250315",
"SERV_PLACE": "아산시 온양노인복지관 3층 식당",
"SERV_TIME": "4",
"APLY_DT": "20250308",
"APLY_ST": "01",
"APLY_ST_NM": "신청완료"
}
],
"service_list": [
{
"ORGAN_CD": "ORG002",
"ORGAN_NM": "순천향대학교병원",
"SERV_CD": "VS202501010",
"SERV_NM": "병원 환경정화 및 환자 안내 봉사",
"SERV_DT": "20250322",
"SERV_PLACE": "순천향대학교병원 본관 1층 로비",
"SERV_TIME": "3",
"MAX_CNT": "20",
"APLY_CNT": "12",
"REMAIN_CNT": "8",
"APLY_STRT_DT": "20250310",
"APLY_END_DT": "20250319"
},
{
"ORGAN_CD": "ORG003",
"ORGAN_NM": "아산시청 자원봉사팀",
"SERV_CD": "VS202501020",
"SERV_NM": "지역 하천 환경정화 활동",
"SERV_DT": "20250329",
"SERV_PLACE": "아산시 곡교천 일원",
"SERV_TIME": "4",
"MAX_CNT": "50",
"APLY_CNT": "34",
"REMAIN_CNT": "16",
"APLY_STRT_DT": "20250315",
"APLY_END_DT": "20250326"
}
]
}응답 최상위 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
yy | string | 조회된 학년도 |
smt | string | 조회된 학기 코드 |
period_list | array | 선택 가능한 학기 목록 — UI 드롭다운 옵션으로 사용 |
aply_list | array | 본인의 봉사활동 신청 내역 |
service_list | array | 신청 가능한 봉사활동 목록 |
period_list 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
YY | string | 학년도 |
SMT | string | 학기 코드 |
SMT_NM | string | 학기 이름 (예: 1학기) |
FRMT_DT | string | 학기 시작일 (YYYYMMDD) |
END_DT | string | 학기 종료일 (YYYYMMDD) |
aply_list 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
ORGAN_CD | string | 기관 코드 |
ORGAN_NM | string | 기관명 |
SERV_CD | string | 봉사활동 코드 |
SERV_NM | string | 봉사활동명 |
SERV_DT | string | 봉사 일자 (YYYYMMDD) |
SERV_PLACE | string | 봉사 장소 |
SERV_TIME | string | 봉사 시간 (시간 단위) |
APLY_DT | string | 신청일 (YYYYMMDD) |
APLY_ST | string | 신청 상태 코드 |
APLY_ST_NM | string | 신청 상태명 (신청완료, 취소 등) |
service_list 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
ORGAN_CD | string | 기관 코드 — apply/ 요청 시 필요 |
ORGAN_NM | string | 기관명 |
SERV_CD | string | 봉사활동 코드 — apply/ 요청 시 필요 |
SERV_NM | string | 봉사활동명 |
SERV_DT | string | 봉사 일자 (YYYYMMDD) |
SERV_PLACE | string | 봉사 장소 |
SERV_TIME | string | 봉사 시간 (시간 단위) |
MAX_CNT | string | 모집 인원 |
APLY_CNT | string | 현재 신청 인원 |
REMAIN_CNT | string | 잔여 인원 |
APLY_STRT_DT | string | 신청 시작일 (YYYYMMDD) |
APLY_END_DT | string | 신청 마감일 (YYYYMMDD) |
에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
{
"error": "UNAUTHORIZED",
"message": "세션이 만료되었거나 유효하지 않습니다."
}POST /api/volunteer-service/apply/
봉사활동을 신청합니다. GET /api/volunteer-service/의 service_list 항목에서 ORGAN_CD, SERV_CD를 추출하여 전달합니다.
요청 Body
Content-Type: application/json
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
yy | string | O | 학년도 |
smt | string | O | 학기 코드 (11 / 21) |
organ_cd | string | O | 기관 코드 (service_list[].ORGAN_CD) |
serv_cd | string | O | 봉사활동 코드 (service_list[].SERV_CD) |
organ_cd와 serv_cd는 반드시 GET /api/volunteer-service/ 응답의 service_list 항목에서 추출하세요. 임의 값을 전달하면 SCH 서버에서 오류가 반환됩니다.
{
"yy": "2025",
"smt": "11",
"organ_cd": "ORG002",
"serv_cd": "VS202501010"
}응답
200 OK
{
"ok": true
}에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
MISSING_FIELDS | 400 | yy, smt, organ_cd, serv_cd 중 하나 이상 누락 |
SCH_ERROR | 400 | SCH 서버 거부 — 이미 신청됨, 정원 초과, 신청 기간 아님 등 |
{
"error": "MISSING_FIELDS",
"message": "yy, smt, organ_cd, serv_cd 필드가 모두 필요합니다."
}POST /api/volunteer-service/cancel/
봉사활동 신청을 취소합니다. GET /api/volunteer-service/의 aply_list 항목 객체 전체를 aply_row로 전달합니다.
요청 Body
Content-Type: application/json
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
aply_row | object | O | aply_list 항목 객체 전체 (수정 없이 그대로) |
aply_row는 aply_list 항목을 수정 없이 그대로 전달해야 합니다. SCH 서버가 객체 안의 여러 필드를 조합하여 취소 대상을 특정합니다. 일부 필드만 전달하면 취소가 실패할 수 있습니다.
{
"aply_row": {
"ORGAN_CD": "ORG001",
"ORGAN_NM": "아산시자원봉사센터",
"SERV_CD": "VS202501001",
"SERV_NM": "노인복지관 급식 봉사",
"SERV_DT": "20250315",
"SERV_PLACE": "아산시 온양노인복지관 3층 식당",
"SERV_TIME": "4",
"APLY_DT": "20250308",
"APLY_ST": "01",
"APLY_ST_NM": "신청완료"
}
}응답
200 OK
{
"ok": true
}에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
MISSING_FIELDS | 400 | aply_row 필드 누락 |
{
"error": "MISSING_FIELDS",
"message": "aply_row 누락"
}비교과과정
SCH 통합정보시스템의 비교과과정 프로그램 조회 API입니다. 학기별 개설 프로그램 목록, 상세 정보, 첨부파일 및 리플렛을 지원합니다.
GET /api/extracurricular/
현재 학기의 비교과과정 개설 프로그램 목록과 본인 신청 내역을 반환합니다.
쿼리 파라미터
| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
yy | string | 아니오 | 최신 학기 | 학년도 (예: 2025) |
smt | string | 아니오 | 최신 학기 | 학기 코드 (11 / 21) |
excr_div | string | 아니오 | T | 프로그램 카테고리 코드 |
keyword | string | 아니오 | "" | 프로그램명 검색어 |
use_sust | string | 아니오 | 0 | 학과 필터 |
use_sust 허용값:
| 값 | 설명 |
|---|---|
0 | 전체 학과 프로그램 표시 |
1 | 본인 소속 학과 프로그램만 표시 |
excr_div에 허용되는 코드 목록은 이 엔드포인트 응답의 categories 배열에서 동적으로 제공됩니다. 첫 요청에서는 기본값 T(전체)로 조회한 뒤, 반환된 categories를 UI 드롭다운 옵션으로 활용하세요.
GET /api/extracurricular/?yy=2025&smt=11&excr_div=A&keyword=AI&use_sust=0응답
200 OK
{
"yy": "2025",
"smt": "11",
"now": {
"YY": "2025",
"SMT": "11"
},
"categories": [
{ "EXCR_DIV": "T", "EXCR_DIV_NM": "전체" },
{ "EXCR_DIV": "A", "EXCR_DIV_NM": "취창업" },
{ "EXCR_DIV": "B", "EXCR_DIV_NM": "글로벌" },
{ "EXCR_DIV": "C", "EXCR_DIV_NM": "인성·봉사" },
{ "EXCR_DIV": "D", "EXCR_DIV_NM": "학술·연구" }
],
"user_info": [
{
"DEPT_NM": "컴퓨터소프트웨어공학과",
"GRADE": "3"
}
],
"open_list": [
{
"EXCR_SEQ": "20250001",
"EXCR_NM": "취업역량 강화 특강 — 이력서 작성법과 면접 전략",
"EXCR_DIV": "A",
"EXCR_DIV_NM": "취창업",
"OPEN_DT": "20250310",
"CLOSE_DT": "20250320",
"PROC_DT": "20250325",
"PROC_PLACE": "산학협력관 201호",
"SERV_TIME": "2",
"MAX_CNT": "30",
"APLY_CNT": "18",
"APLY_YN": "N",
"FILE_NO": "F20250001"
},
{
"EXCR_SEQ": "20250002",
"EXCR_NM": "AI 코딩 워크숍 — Python과 머신러닝 입문",
"EXCR_DIV": "A",
"EXCR_DIV_NM": "취창업",
"OPEN_DT": "20250312",
"CLOSE_DT": "20250322",
"PROC_DT": "20250328",
"PROC_PLACE": "공학관 E동 203호",
"SERV_TIME": "3",
"MAX_CNT": "25",
"APLY_CNT": "25",
"APLY_YN": "N",
"FILE_NO": "F20250002"
}
],
"aply_list": [
{
"EXCR_SEQ": "20240055",
"EXCR_NM": "글로벌 커뮤니케이션 리더십 캠프",
"PROC_DT": "20241015",
"APLY_DT": "20241001",
"APLY_ST": "02",
"APLY_ST_NM": "수료"
}
]
}응답 최상위 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
yy | string | 조회된 학년도 |
smt | string | 조회된 학기 코드 |
now | object | 현재 학기 정보 (YY, SMT) |
categories | array | 카테고리 목록 — EXCR_DIV를 excr_div 파라미터로 재사용 |
user_info | array | 본인 학과명·학년 정보 |
open_list | array | 신청 가능한 프로그램 목록 |
aply_list | array | 본인의 신청 내역 |
open_list 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
EXCR_SEQ | string | 프로그램 일련번호 |
EXCR_NM | string | 프로그램명 |
EXCR_DIV | string | 카테고리 코드 |
EXCR_DIV_NM | string | 카테고리명 |
OPEN_DT | string | 신청 시작일 (YYYYMMDD) |
CLOSE_DT | string | 신청 마감일 (YYYYMMDD) |
PROC_DT | string | 프로그램 진행일 (YYYYMMDD) |
PROC_PLACE | string | 진행 장소 |
SERV_TIME | string | 인정 시간 (시간 단위) |
MAX_CNT | string | 모집 인원 |
APLY_CNT | string | 현재 신청 인원 |
APLY_YN | string | 본인 신청 여부 (Y / N) |
FILE_NO | string | 첨부파일 조회용 번호 — attach/?file_no= 파라미터로 사용 |
aply_list 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
EXCR_SEQ | string | 프로그램 일련번호 |
EXCR_NM | string | 프로그램명 |
PROC_DT | string | 진행일 (YYYYMMDD) |
APLY_DT | string | 신청일 (YYYYMMDD) |
APLY_ST | string | 신청 상태 코드 |
APLY_ST_NM | string | 신청 상태명 (신청, 수료, 취소 등) |
에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
POST /api/extracurricular/detail/
비교과과정 프로그램의 상세 정보를 조회합니다. GET /api/extracurricular/의 open_list 항목 객체 전체를 row로 전달합니다.
요청 Body
Content-Type: application/json
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
row | object | O | open_list 항목 객체 전체 (수정 없이 그대로) |
{
"row": {
"EXCR_SEQ": "20250001",
"EXCR_NM": "취업역량 강화 특강 — 이력서 작성법과 면접 전략",
"EXCR_DIV": "A",
"EXCR_DIV_NM": "취창업",
"OPEN_DT": "20250310",
"CLOSE_DT": "20250320",
"PROC_DT": "20250325",
"PROC_PLACE": "산학협력관 201호",
"SERV_TIME": "2",
"MAX_CNT": "30",
"APLY_CNT": "18",
"APLY_YN": "N",
"FILE_NO": "F20250001"
}
}응답
200 OK — 프로그램 상세 정보. CONT 필드에 HTML 또는 텍스트 형태의 프로그램 설명이 포함될 수 있습니다.
{
"EXCR_SEQ": "20250001",
"EXCR_NM": "취업역량 강화 특강 — 이력서 작성법과 면접 전략",
"EXCR_DIV_NM": "취창업",
"PROC_DT": "20250325",
"PROC_PLACE": "산학협력관 201호",
"PROC_TIME": "14:00 ~ 16:00",
"SERV_TIME": "2",
"MAX_CNT": "30",
"APLY_CNT": "18",
"INSTR_NM": "김지훈 (취업지원팀 선임연구원)",
"CONT": "실제 인사담당자가 직접 전달하는 이력서 작성 노하우와 면접 전략을 다룹니다. 실습 위주로 진행되며, 개인 피드백 세션이 포함됩니다.",
"APLY_STRT_DT": "20250310",
"APLY_END_DT": "20250320",
"FILE_NO": "F20250001",
"APLY_YN": "N"
}에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
MISSING_FIELDS | 400 | row 필드 누락 |
{
"error": "MISSING_FIELDS",
"message": "row 누락"
}GET /api/extracurricular/attach/
비교과과정 프로그램의 첨부파일 목록을 반환합니다. open_list[].FILE_NO 값을 file_no 파라미터로 사용합니다.
쿼리 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
file_no | string | O | 첨부파일 그룹 번호 (open_list[].FILE_NO) |
GET /api/extracurricular/attach/?file_no=F20250001응답
200 OK
{
"items": [
{
"FILE_NO": "F20250001",
"FILE_SEQ": "1",
"FILE_NM": "취업역량특강_안내문.pdf",
"FILE_SIZE": "245760",
"FILE_EXT": "pdf"
},
{
"FILE_NO": "F20250001",
"FILE_SEQ": "2",
"FILE_NM": "이력서_작성양식.docx",
"FILE_SIZE": "32768",
"FILE_EXT": "docx"
}
]
}items 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
FILE_NO | string | 파일 그룹 번호 |
FILE_SEQ | string | 파일 순번 |
FILE_NM | string | 원본 파일명 |
FILE_SIZE | string | 파일 크기 (바이트) |
FILE_EXT | string | 파일 확장자 |
파일 다운로드는 GET /api/extracurricular/download/?file_no=FILE_NO로 요청합니다. FILE_NO와 FILE_SEQ의 조합으로 특정 파일을 다운로드할 수 있습니다.
GET /api/extracurricular/leaflet/
비교과과정 리플렛(홍보물) 목록을 반환합니다. 파라미터가 없으며 전체 리플렛을 반환합니다.
GET /api/extracurricular/leaflet/응답
200 OK
{
"items": [
{
"LFLT_SEQ": "1",
"LFLT_NM": "2025학년도 1학기 비교과과정 안내 리플렛",
"FILE_NO": "LF20250001",
"REG_DT": "20250228"
},
{
"LFLT_SEQ": "2",
"LFLT_NM": "취창업 지원 프로그램 안내",
"FILE_NO": "LF20250002",
"REG_DT": "20250305"
}
]
}items 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
LFLT_SEQ | string | 리플렛 순번 |
LFLT_NM | string | 리플렛 제목 |
FILE_NO | string | 파일 다운로드용 번호 |
REG_DT | string | 등록일 (YYYYMMDD) |
GET /api/extracurricular/download/
비교과과정 첨부파일을 다운로드합니다. 응답 본문은 파일 바이너리 스트림입니다.
쿼리 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
file_no | string | O | 파일 번호 (attach/ 응답의 FILE_NO) |
GET /api/extracurricular/download/?file_no=F20250001응답
200 OK — 파일 바이너리 스트림 (JSON 아님)
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="취업역량특강_안내문.pdf"이 엔드포인트는 JSON을 반환하지 않습니다. 응답을 Blob으로 처리하여 파일을 저장하세요.
const res = await fetch('/api/extracurricular/download/?file_no=F20250001', {
credentials: 'include',
})
const blob = await res.blob()
const filename = res.headers.get('Content-Disposition')?.split('filename=')[1] ?? 'download'
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = decodeURIComponent(filename)
a.click()
URL.revokeObjectURL(url)봉사학습
SCH 통합정보시스템의 봉사학습(Service Learning) 강의 조회·신청·평가 API입니다. 봉사학습은 정규 교과목과 연계하여 학점이 부여되는 봉사활동입니다.
GET /api/service-learning/
봉사학습 강의 목록, 본인 신청 내역, 평가 문항을 반환합니다. yy와 smt를 생략하면 최신 학기로 자동 조회합니다.
쿼리 파라미터
| 파라미터 | 타입 | 필수 | 기본값 | 설명 |
|---|---|---|---|---|
yy | string | 아니오 | 최신 학기 | 학년도 (예: 2025) |
smt | string | 아니오 | 최신 학기 | 학기 코드 (11 / 21) |
edu_div | string | 아니오 | U2520001 | 교육 유형 코드 |
edu_div 기본값:
| 값 | 설명 |
|---|---|
U2520001 | 봉사학습교육 |
edu_div 추가 허용값은 응답의 categories 배열에서 동적으로 제공됩니다. 첫 요청은 기본값으로 조회하여 반환된 카테고리를 UI 드롭다운으로 활용하세요.
GET /api/service-learning/?yy=2025&smt=11&edu_div=U2520001응답
200 OK
{
"yy": "2025",
"smt": "11",
"now": { "YY": "2025", "SMT": "11" },
"categories": [
{ "code": "U2520001", "name": "봉사학습교육" }
],
"questions": [
{
"Q_NO": "1",
"Q_NM": "이 봉사학습 프로그램에 대한 전반적인 만족도는 어떻습니까?",
"Q_TYPE": "5",
"OPTIONS": ["매우 불만족", "불만족", "보통", "만족", "매우 만족"]
},
{
"Q_NO": "2",
"Q_NM": "봉사학습 활동이 전공 역량 향상에 도움이 되었습니까?",
"Q_TYPE": "5",
"OPTIONS": ["전혀 아니다", "아니다", "보통", "그렇다", "매우 그렇다"]
}
],
"subjective": [
{
"Q_NO": "5",
"Q_NM": "봉사학습 활동 중 가장 기억에 남는 경험과 느낀 점을 자유롭게 작성해주세요."
}
],
"lectures": [
{
"EDU_SEQ": "SL2025001",
"EDU_NM": "지역사회 환경 개선 봉사학습",
"PROF_NM": "박현수",
"DEPT_NM": "사회복지학과",
"PROC_DT": "20250405",
"PROC_END_DT": "20250620",
"PROC_PLACE": "아산시 온양3동 일원",
"MAX_CNT": "20",
"APLY_CNT": "15",
"CREDIT": "1",
"EDU_TIME": "30",
"APLY_YN": "N",
"FILE_NO": "SLF20250001"
},
{
"EDU_SEQ": "SL2025002",
"EDU_NM": "다문화 가정 학습 지원 봉사학습",
"PROF_NM": "이수연",
"DEPT_NM": "교육학과",
"PROC_DT": "20250408",
"PROC_END_DT": "20250625",
"PROC_PLACE": "아산시 다문화가족지원센터",
"MAX_CNT": "15",
"APLY_CNT": "9",
"CREDIT": "1",
"EDU_TIME": "30",
"APLY_YN": "N",
"FILE_NO": "SLF20250002"
}
],
"aply_list": [
{
"EDU_SEQ": "SL2024010",
"EDU_NM": "노인 디지털 역량 강화 봉사학습",
"APLY_DT": "20240908",
"COMP_YN": "Y",
"COMP_DT": "20241122",
"EVAL_YN": "N",
"CREDIT": "1"
}
],
"user_info": [
{
"STD_NO": "20201234",
"NM": "홍길동",
"DEPT_NM": "컴퓨터소프트웨어공학과",
"GRADE": "4"
}
]
}응답 최상위 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
yy | string | 조회된 학년도 |
smt | string | 조회된 학기 코드 |
now | object | 현재 학기 정보 (YY, SMT) |
categories | array | 교육 유형 카테고리 목록 |
questions | array | 수료 후 제출할 객관식 평가 문항 목록 |
subjective | array | 수료 후 제출할 주관식 평가 문항 목록 |
lectures | array | 신청 가능한 봉사학습 강의 목록 |
aply_list | array | 본인의 신청 내역 |
user_info | array | 본인 학번·이름·학과·학년 정보 |
questions 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
Q_NO | string | 문항 번호 — eval/save/ 요청의 form 키로 사용 |
Q_NM | string | 문항 내용 |
Q_TYPE | string | 보기 수 (예: 5 = 5점 척도) |
OPTIONS | array | 보기 텍스트 배열 |
subjective 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
Q_NO | string | 문항 번호 — eval/save/ 요청의 form 키로 사용 |
Q_NM | string | 문항 내용 |
lectures 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
EDU_SEQ | string | 강의 일련번호 |
EDU_NM | string | 봉사학습명 |
PROF_NM | string | 담당 교수명 |
DEPT_NM | string | 담당 학과명 |
PROC_DT | string | 활동 시작일 (YYYYMMDD) |
PROC_END_DT | string | 활동 종료일 (YYYYMMDD) |
PROC_PLACE | string | 활동 장소 |
MAX_CNT | string | 모집 인원 |
APLY_CNT | string | 현재 신청 인원 |
CREDIT | string | 부여 학점 |
EDU_TIME | string | 총 봉사 시간 (시간 단위) |
APLY_YN | string | 본인 신청 여부 (Y / N) |
FILE_NO | string | 첨부파일 조회용 번호 |
aply_list 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
EDU_SEQ | string | 강의 일련번호 |
EDU_NM | string | 봉사학습명 |
APLY_DT | string | 신청일 (YYYYMMDD) |
COMP_YN | string | 수료 여부 (Y / N) |
COMP_DT | string | 수료일 (YYYYMMDD) — 미수료 시 빈 문자열 |
EVAL_YN | string | 평가 제출 여부 (Y / N) |
CREDIT | string | 부여 학점 |
평가 제출 가능 여부는 aply_list 항목에서 COMP_YN = "Y" (수료 완료) 이고 EVAL_YN = "N" (평가 미제출)인 경우입니다. 이 두 조건을 모두 만족하는 항목에만 평가 UI를 표시하세요.
에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
POST /api/service-learning/detail/
봉사학습 강의의 상세 정보를 조회합니다. GET /api/service-learning/의 lectures 항목 객체 전체를 row로 전달합니다.
요청 Body
Content-Type: application/json
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
row | object | O | lectures 항목 객체 전체 (수정 없이 그대로) |
{
"row": {
"EDU_SEQ": "SL2025001",
"EDU_NM": "지역사회 환경 개선 봉사학습",
"PROF_NM": "박현수",
"DEPT_NM": "사회복지학과",
"PROC_DT": "20250405",
"PROC_END_DT": "20250620",
"PROC_PLACE": "아산시 온양3동 일원",
"MAX_CNT": "20",
"APLY_CNT": "15",
"CREDIT": "1",
"EDU_TIME": "30",
"APLY_YN": "N",
"FILE_NO": "SLF20250001"
}
}응답
200 OK — 강의 상세 정보. EDU_CONT 필드에 활동 내용 설명이 포함됩니다.
{
"EDU_SEQ": "SL2025001",
"EDU_NM": "지역사회 환경 개선 봉사학습",
"PROF_NM": "박현수",
"DEPT_NM": "사회복지학과",
"PROC_DT": "20250405",
"PROC_END_DT": "20250620",
"PROC_PLACE": "아산시 온양3동 일원",
"CREDIT": "1",
"EDU_TIME": "30",
"MAX_CNT": "20",
"APLY_CNT": "15",
"EDU_CONT": "아산시 온양3동 지역 내 생활쓰레기 무단투기 지역을 중심으로 환경정화 활동을 진행합니다. 월 2회, 총 6회 활동 예정이며, 수료 후 1학점이 부여됩니다.",
"APLY_STRT_DT": "20250310",
"APLY_END_DT": "20250331",
"FILE_NO": "SLF20250001"
}에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
MISSING_FIELDS | 400 | row 필드 누락 |
{
"error": "MISSING_FIELDS",
"message": "row 누락"
}POST /api/service-learning/apply/
봉사학습을 신청합니다. GET /api/service-learning/의 lectures 항목 객체 전체를 row로 전달합니다.
요청 Body
Content-Type: application/json
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
row | object | O | lectures 항목 객체 전체 (수정 없이 그대로) |
row는 반드시 GET /api/service-learning/의 lectures 항목을 수정 없이 그대로 전달하세요. SCH 서버는 row 내 여러 필드를 조합하여 신청을 처리합니다.
{
"row": {
"EDU_SEQ": "SL2025001",
"EDU_NM": "지역사회 환경 개선 봉사학습",
"PROF_NM": "박현수",
"DEPT_NM": "사회복지학과",
"PROC_DT": "20250405",
"PROC_END_DT": "20250620",
"PROC_PLACE": "아산시 온양3동 일원",
"MAX_CNT": "20",
"APLY_CNT": "15",
"CREDIT": "1",
"EDU_TIME": "30",
"APLY_YN": "N",
"FILE_NO": "SLF20250001"
}
}응답
신청 결과는 HTTP 상태코드와 ok 필드를 함께 확인해야 합니다.
200 OK — 신청 성공
{
"ok": true,
"code": "0",
"message": "신청이 완료되었습니다."
}400 Bad Request — SCH 서버 거부 (이미 신청됨, 정원 초과 등)
{
"ok": false,
"code": "E001",
"message": "이미 신청된 봉사학습입니다."
}| 필드 | 타입 | 설명 |
|---|---|---|
ok | boolean | 처리 성공 여부 |
code | string | SCH 서버 결과 코드 ("0" = 성공) |
message | string | SCH 서버 결과 메시지 |
SCH 서버가 신청을 거부하면 HTTP 상태코드는 400이지만, 응답 본문은 error 키 없이 ok, code, message 형식으로 반환됩니다. 반드시 ok 필드 값을 확인하여 성공/실패를 판단하세요.
에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
MISSING_FIELDS | 400 | row 필드 누락 |
| (SCH 거부) | 400 | ok: false + code + message 형식 응답 |
{
"error": "MISSING_FIELDS",
"message": "row 누락"
}POST /api/service-learning/cancel/
봉사학습 신청을 취소합니다. GET /api/service-learning/의 aply_list 항목 객체 전체를 row로 전달합니다.
요청 Body
Content-Type: application/json
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
row | object | O | aply_list 항목 객체 전체 (수정 없이 그대로) |
{
"row": {
"EDU_SEQ": "SL2024010",
"EDU_NM": "노인 디지털 역량 강화 봉사학습",
"APLY_DT": "20240908",
"COMP_YN": "N",
"COMP_DT": "",
"EVAL_YN": "N",
"CREDIT": "1"
}
}응답
200 OK
{
"ok": true,
"code": "0",
"message": "취소가 완료되었습니다."
}| 필드 | 타입 | 설명 |
|---|---|---|
ok | boolean | 처리 성공 여부 |
code | string | SCH 서버 결과 코드 |
message | string | SCH 서버 결과 메시지 |
에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
MISSING_FIELDS | 400 | row 필드 누락 |
{
"error": "MISSING_FIELDS",
"message": "row 누락"
}POST /api/service-learning/eval/save/
봉사학습 수료 후 평가를 제출합니다. aply_list 항목과 사용자가 작성한 평가 폼 데이터를 함께 전달합니다.
평가 제출은 해당 aply_list 항목의 COMP_YN = "Y" (수료 완료) 이고 EVAL_YN = "N" (평가 미제출)인 경우에만 가능합니다. 이 조건을 확인한 후 제출 UI를 활성화하세요.
요청 Body
Content-Type: application/json
| 필드 | 타입 | 필수 | 설명 |
|---|---|---|---|
row | object | O | aply_list 항목 객체 전체 (수정 없이 그대로) |
form | object | O | 사용자가 입력한 평가 데이터 |
form 객체는 GET /api/service-learning/ 응답의 questions(객관식)와 subjective(주관식) 문항을 기반으로 구성합니다.
- 키: 각 문항의
Q_NO(문자열) - 값: 객관식 = 선택한 보기 번호 (문자열,
"1"~"5"), 주관식 = 사용자 입력 텍스트
{
"row": {
"EDU_SEQ": "SL2024010",
"EDU_NM": "노인 디지털 역량 강화 봉사학습",
"APLY_DT": "20240908",
"COMP_YN": "Y",
"COMP_DT": "20241122",
"EVAL_YN": "N",
"CREDIT": "1"
},
"form": {
"1": "5",
"2": "4",
"5": "어르신들과 함께 스마트폰 사용법을 익히는 과정에서 세대 간 소통의 소중함을 깊이 느꼈습니다. 단순한 기술 전달을 넘어 진정한 나눔의 의미를 배울 수 있었습니다."
}
}응답
200 OK
{
"ok": true,
"code": "0",
"message": "평가가 저장되었습니다."
}| 필드 | 타입 | 설명 |
|---|---|---|
ok | boolean | 처리 성공 여부 |
code | string | SCH 서버 결과 코드 |
message | string | SCH 서버 결과 메시지 |
에러 응답
| 에러 코드 | HTTP | 설명 |
|---|---|---|
UNAUTHORIZED | 401 | 세션 없음 또는 만료 |
MISSING_FIELDS | 400 | row 필드 누락 |
{
"error": "MISSING_FIELDS",
"message": "row 누락"
}GET /api/service-learning/attach/
봉사학습 강의의 첨부파일 목록을 반환합니다. lectures[].FILE_NO 값을 file_no 파라미터로 사용합니다.
쿼리 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
file_no | string | O | 첨부파일 그룹 번호 (lectures[].FILE_NO) |
GET /api/service-learning/attach/?file_no=SLF20250001응답
200 OK
{
"items": [
{
"FILE_NO": "SLF20250001",
"FILE_SEQ": "1",
"FILE_NM": "봉사학습_활동계획서.pdf",
"FILE_SIZE": "512000",
"FILE_EXT": "pdf"
},
{
"FILE_NO": "SLF20250001",
"FILE_SEQ": "2",
"FILE_NM": "봉사학습_오리엔테이션_자료.pptx",
"FILE_SIZE": "2097152",
"FILE_EXT": "pptx"
}
]
}items 항목 필드:
| 필드 | 타입 | 설명 |
|---|---|---|
FILE_NO | string | 파일 그룹 번호 |
FILE_SEQ | string | 파일 순번 |
FILE_NM | string | 원본 파일명 |
FILE_SIZE | string | 파일 크기 (바이트) |
FILE_EXT | string | 파일 확장자 |
GET /api/service-learning/download/
봉사학습 첨부파일을 다운로드합니다. 응답 본문은 파일 바이너리 스트림입니다.
쿼리 파라미터
| 파라미터 | 타입 | 필수 | 설명 |
|---|---|---|---|
file_no | string | O | 파일 번호 (attach/ 응답의 FILE_NO) |
GET /api/service-learning/download/?file_no=SLF20250001응답
200 OK — 파일 바이너리 스트림 (JSON 아님)
Content-Type: application/octet-stream
Content-Disposition: attachment; filename="봉사학습_활동계획서.pdf"이 엔드포인트는 JSON을 반환하지 않습니다. 응답을 Blob으로 처리하여 파일을 저장하세요.
const res = await fetch('/api/service-learning/download/?file_no=SLF20250001', {
credentials: 'include',
})
const blob = await res.blob()
const filename = res.headers.get('Content-Disposition')?.split('filename=')[1] ?? 'download'
const url = URL.createObjectURL(blob)
const a = document.createElement('a')
a.href = url
a.download = decodeURIComponent(filename)
a.click()
URL.revokeObjectURL(url)