();
+ for (Long i = Long.valueOf(1); i < 8; i++) {
+ if (i != 5 && i != 6) {
+ Manager temp = managerRepository.findById(i).orElseThrow(ManagerNotFoundException::new);
+ l.add(temp);
+ }
+ }
+
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(1))
+ .title("원클릭 컴공 전공 상담신청 서비스 안내")
+ .content("상담 받기 좋은 계절입니다.
질문거리, 고민거리는 있지만 어느 교수님께 물어야 할 지 모르겠다면...
교수님께 상담 요청 이메일, 어떻게 써야 할지 몰라 망설여지신다면...
편하게 이것저것 여쭤보고 싶은데 안면 있는 교수님이 없어 막막하시다면...
원클릭 컴공 전공상담신청을 이용해보시기 바랍니다!
https://forms.gle/n8mvzfJ51Ahzaujz8
접수한 내용을 바탕으로 가능한 빨리 적절한 교수님을 찾아 매칭해드립니다.
학생 이메일 도메인 변경에 따라 Google Form 주소도 업데이트 했으니
참고하시기 바랍니다.
- 홍신
")
+ .viewCnt(0)
+ .importance(true)
+ .pubDate(LocalDate.of(2022, Month.NOVEMBER, 19))
+ .expDate(LocalDate.of(2023, Month.APRIL, 26))
+ .build());
+
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(2))
+ .title("2022 BizFlow M Pre-Contest (신청기간연장 ~6.7(화))")
+ .content("\"■ 접수기간 : 2022년 5월 25일 (수) ~ 6월 7일 (화)
■ 접수링크 : https://docs.google.com/forms/d/1BR9IKalGSdDPKR4Hi6dvW8dpL57dKhvfz0oliJatRno/edit
■ 참가자격
한동대학교 재학생으로서 다음 사항 중 1개라도 해당되는 팀 (휴학생 팀원 참여 가능)
1) 팀원 중 BizFlow Camp 수료자가 있는 경우
2) 팀원 중 이전 BizFlow AppDev Contest 수상자(참가상 포함)가 있는 경우
3) 팀원 중 BizFlow AppDev 사용 경험자가 있는 경우
4) 팀원 모두 BizFlow AppDev 사용 경험은 없지만, 웹사이트 제작 경험이 있는 경우
■ 컨테스트 내용
。사전 제시된 미션을 BizFlow M을 사용하여 구현한 후, 기한 내에 제출함
。미션 링크 : https://www.notion.so/HGU-X-AppDev-2022-Precontest-473e3aed71554cf2899238fd49ca3d6b
。컨테스트 미션에 대한 설명 영상 : https://youtu.be/od_lQFIrj7g
。이번 컨테스트 진행 중 질문답변을 위해 다음 링크를 사용하기 바랍니다.
클라썸 입장 링크: www.classum.com/EXSTQA
■ 팀 구성 : 1~3인으로 팀 구성 (개인 참가 가능)
■ 수상팀에게는 여름방학 중에 진행되는 본 컨테스트 출전 자격이 주어집니다.
1) 최우수상 : 1팀 60만원
2) 우수상 : 5팀 내외 40만원
3) 장려상 : 10팀 내외 20만원
4) 참가상 : 기념품 지급
\"")
+ .viewCnt(0)
+ .importance(true)
+ .pubDate(LocalDate.of(2022, Month.NOVEMBER, 24))
+ .expDate(LocalDate.of(2023, Month.MAY, 30))
+ .build());
+
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(3))
+ .title("2022-2 사전 학점인정 안내(타대학 교환·학점교류)")
+ .content("22-2학기 타대학 교환·학점교류를 통해 전산전자공학부공학부의 컴퓨터공학(심화), 전자공학(심화) 전공 학점으로 인정받고자 하는 학생은, 아래의 내용을 확인하시고 사전학점인정원 제출하시기 바랍니다.
1. 신청기간: ~2022.8.14.
* 각 대학마다 수강신청기간이 다르므로, 본인 대학 수강신청기간 전에 신청 바람
2. 제출서류: 사전학점인정원, 해당 과목 강의계획서
3. 제출방법: csee@handong.edu로 온라인 제출
4. 사전학점인정 절차
가. 학생이 학부사무실로 사전학점인정원 제출
나. 해당 전공의 프로그램위원회에서 제출된 자료 검토하여 학점인정 여부 판단
다. 검토완료 된 사전학점인정원을 학부사무실에서 학생 메일로 송부
5. 유의사항
가. 각 대학마다 수강신청기간이 다르므로, 사전학점인정 승인 받은 후 수강신청 할 수 있도록 시간 여유를 두고 미리 신청 바람
나. 본인서명 필수 / 담당교수 확인란은 비워 제출
다. '해당전공'란은 컴퓨터공학 or 전자공학을 기입
라. 이전 학기에 학점교류를 통해 전공 인정받은 학생의 경우 아래 내용 함께 제출
1) 이전 교류대학명:
2) 인정 과목명:
3) 총 인정학점:
마. 사전학점인정원 승인을 받았더라도, 다른 수강 교과목과 내용이 중복되는 경우 추후 학점인정을 받지 못할 수 있음
문의 : 260-1414 / csee@handong.edu
")
+ .viewCnt(0)
+ .importance(false)
+ .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2))
+ .expDate(LocalDate.of(2023, Month.JUNE, 15))
+ .build());
+
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(4))
+ .title("2022년 8월 졸업생 학위증 및 상장 교부 안내")
+ .content("9/2(금) 15시까지 신청 건 우편 발송되었습니다.
---------------------------------------------------------------------------
안녕하세요?
전산전자공학부공학부입니다.
졸업을 진심으로 축하드립니다.\uD83C\uDF89
학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.
우편(착불 4500원 정도)으로 받고자 하는 학생은
9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.
이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.
<유의사항>
1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.
2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.
감사합니다:D
문의) 전산전자공학부공학부사무실 260-1414
")
+ .viewCnt(0)
+ .importance(true)
+ .pubDate(LocalDate.of(2022, Month.NOVEMBER, 7))
+ .expDate(LocalDate.of(2023, Month.JUNE, 29))
+ .build());
+
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(4))
+ .title("2022년 8월 졸업생 학위증 및 상장 교부 안내")
+ .content("9/2(금) 15시까지 신청 건 우편 발송되었습니다.
---------------------------------------------------------------------------
안녕하세요?
전산전자공학부공학부입니다.
졸업을 진심으로 축하드립니다.\uD83C\uDF89
학위증은 8/17(수)부터 학부사무실(NTH309)에서 직접 수령 가능합니다.
우편(착불 4500원 정도)으로 받고자 하는 학생은
9/4(일)까지 구글폼( https://forms.gle/YC33x2dgMp2o6FFP7 ) 작성해주시기 바랍니다.
이전 졸업생 중 학위증을 수령하지 않은 학생도 신청하시기 바랍니다.
<유의사항>
1. 학위증은 23년 2월 학위수여식까지 보관하며, 그 후 분실에 대해 책임지지 않습니다.
2. 학위증 재발급은 불가하니, 꼭 수령하시기 바랍니다.
감사합니다:D
문의) 전산전자공학부공학부사무실 260-1414
")
+ .viewCnt(0)
+ .importance(true)
+ .pubDate(LocalDate.of(2022, Month.NOVEMBER, 21))
+ .expDate(LocalDate.of(2023, Month.JUNE, 27))
+ .build());
+
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(3))
+ .title("[BK21 인공지능 교육연구단] 2022-2 참여대학원생 등록서류 제출 및 연구장학금 신청 안내")
+ .content("한동대학교 BK21 인공지능 사업단
2022학년도 2학기 참여대학원생 등록서류 제출 및 연구장학금 신청 안내
한동대학교 전산전자공학부공학과 4단계 BK21 ‘산업혁신을 위한 AI 고급 인재교육연구단’ (BK21 인공지능사업단)에서 다음과 같이 등록 서류를 제출하여주시기 바랍니다.
1. 4단계 BK21 참여대학원생 기준 (다음의 조건을 모두 충족한 자)
BK21 참여교수의 지도학생 중 전일제(4대보험에 가입되어 있지 않은 학생)로 등록(연구생 등록 포함)한 석·박사과정 대학원생으로 다음 각 호에 해당하는 자
-입학한 지 2년이 지나지 않은 석사과정생
-입학한 지 4년이 지나지 않은 박사과정생 및 박사 수료생
-입학한 지 6년이 지나지 않은 석박통합과정생 및 석박통합과정 수료생
(위의 기간 기산 시 휴학 및 군복무 기간은 제외함).
위의 자격을 충족한 경우 ‘참여대학원생’으로 등록되어 ‘지원대학원생’ 선발 기회 등 BK21 사업의 지원을 받을 수 있음.
2. 지원대학원생 선발 및 연구장학금 지급
1) 참여대학원생으로 등록된 학생 중 70% 이내의 대학원생을 ‘지원대학원생’으로 선발해 연구장학금을 지급함.
2) 지원기간: 2022.09.01.~2023.02.28. (6개월 단위로 선발)
3) 선발기준: 지도교수 추천을 받은 참여대학원생 중 연구/프로젝트 성과 평가에 의해 선발
4) 역할 및 임무
- BK21 참여교수 연구실에서 논문 연구 및 산학 프로젝트를 성실히 수행 (주 40시간 이상)
- 사업단이 주관하는 각종 세미나, 포럼 등의 학술 활동에 참여
- 사업단이 요구하는 성과 자료 보고
3. 참여대학원생 등록서류 제출안내(등록서류는 단순참여, 장학금 지원 받는 학생 모두 제출해주세요.)
1) 첨부된 제출서류 다운 및 작성 후 BK21 사업단 사무실로 서류 제출.
2) 지도교수로부터 지원대학원생(장학금 받는 학생)으로 추천받은 대학원생은 5.제출서류 함께 제출
4. 서류 제출 기간: 2022년 8월 29일(월) 13:00 - 9월 7일(수) 17:00 (제출기한 엄수)
5. 제출서류
- 연구자등록번호 발급 방법
: KRI(한국연구업적통합정보시스템 http://www.kri.go.kr)에 접속 회원가입→연구자등록번호 발급
(가입 시 소속을 반드시 ‘한동대학교’로 가입)
1) 재학증명서 1부. 연구생등록자의 경우 연구생등록증 1부(2022년 9월 1일자 기준으로 제출)
2) 개인정보 수집 이용 제공 동의서 1부. (BK사업에 처음 참여하는 학생만 제출)
3) 참여인력 서약서 1부.
4) 참여대학원생 확약서 1부.
5) BK21 연구장학금 신청서 1부. (지원대학원생-BK장학금 받는 학생만 제출)
6) 전산전자공학부공학과 학기 보고서 1부.
7) 재학증명서 1부.(9월 1일 기준)
8) 연구재단 필수 제출 서류 '4대 보험 가입 증명서' 1부. (22.10.1일 기준일로하여 메일로 회신)
(**10월1일 기준으로 출력 후 제출 바랍니다. 9월에는 제출하지 않아도 됩니다!)
- 출력 방법: 4대 사회보험 포털서비스(http://www.4insure.or.kr) 로그인(회원가입, 공인인증서 필요) → 상단 메뉴 증명서발급(가입내역확인) 클릭 후 출력
9) 대학원 성적표 1부. (신입생은 제출X)
<한국연구재단 필수 수강!!-참여기간 중 1회 수강 후 수료증 제출해야함, 교육 미이수자 및 22-2학기 신입생만 수강하면 됩니다.>
10) 온라인 교육 수료증 (http://alpha-campus.kr/) 에 접속하여 로그인 후 상단 메뉴의 '탐색'->'온라인교육' -> '건강한 연구환경 조성을 위한 인권침해예방교육'클릭 ->'수강신청' 클릭 후 팝업창에서 수강신청 정보 확인 및 '신청완료'-> '학습'-> '학습중과정'-> '건강한 연구환경 조성을 위한 인권침해예방교육' 순서대로 클릭 후 '학습하기'
컨텐츠 수강 후 ‘MY'-> '학습이력'클릭 후 수료증 발급 및 보관)
*수료증은 메일로 회신부탁합니다.
11) 통장사본 및 신분증 사본 각 1부.
※ 외국인 참여대학원생의 경우 외국인 등록증 앞, 뒤 사본(D-2비자 여부 및 만료기한 확인) 제출.
※ 기존 참여대학원생이 지원할 경우: 2)개인정보 수집 이용 제공 동의서, 10)온라인 교육 수료증 제출 생략.
6. 서류 제출 및 문의처
1) BK21사업단 사무실: 뉴턴홀 309호 전산전자공학부공학부 사무실 담당자 고라경(Tel: 260-3150)
2) 신청 시 모든 서류는 위 제출서류 순서대로 정리하여 원본 제출 바랍니다.
7. 유의사항: 제출된 서류는 반환하지 않으며, 허위사실 기재 시 선발을 취소함.
")
+ .viewCnt(0)
+ .importance(false)
+ .pubDate(LocalDate.of(2022, Month.JULY, 1))
+ .expDate(LocalDate.of(2022, Month.JULY, 14))
+ .build());
+
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(2))
+ .title("2022 한동 SW페스티벌 수상자 안내 및 서류 제출 요청(10월 19일(수)까지)")
+ .content("2022 한동 SW페스티벌 수상자 안내 및 서류 제출 요청(10월 19일(수)까지)
'2022 한동 SW페스티벌'에 참여한 모든 참가자들에게 감사드리며 수상팀을 안내드립니다.
자세한 수상팀 명단은 첨부파일에서 확인 가능합니다.
수상한 모든 팀들 축하드립니다.
[상금]
수상팀 제출 서류는 아래 설문지를 통해 팀대표 1명만 제출바랍니다.(팀장이 대표로 수령)
서류 제출 마감일은 10월 19일(수)입니다. 빠른 상금 수령을 위해 마감 기한을 꼭 지켜주세요!!
설문지로 바로이동
[상장]
배부기간: 10.20(목) ~ 21(금). 팀별 1부 발급
배 부 처: SW중심대학지원사업단, 뉴턴홀 218호
* 상장 수령 시 개인정보 이용 동의서 서명도 함께 해주세요.
문의 : SW중심대학 지원사업단 이윤정(260-1478 / lyj1515@handong.edu)
")
+ .viewCnt(0)
+ .importance(false)
+ .pubDate(LocalDate.of(2022, Month.JULY, 7))
+ .expDate(LocalDate.of(2022, Month.JULY, 12))
+ .build());
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(1))
+ .title("[전산전자공학부공학부] 2022 CSEE Lab Week에 초대합니다.")
+ .content("안녕하세요?
전산전자공학부공학부, 일반대학원 전산전자공학부공학과가 9주차 10/24(월)~10/28(금)에 각 연구실에 대해 알아가고 다양한 연구의 내용을 공유하는 시간을 가지려고 합니다.
저희 전산전자공학부공학부, 일반대학원 전산전자공학부공학과에서 어떤 주제의 연구들을 진행하고 있는지 Lab설명회, 포스터세션을 통해 이야기를 듣고 싶은 학생들의 많은 참여 바랍니다.
행사에 참석하면 입시관련된 정보 또한 얻을 수 있으니 AI를 포함한 ICT 관련 분야 진학에 관심있는 모든 학부생들의 참여를 환영합니다.

온라인 Lab 멘토링 실시 (기간: 10/24(월)~10/28(금))
(아래 링크접속 후 각 Lab의 오픈카톡방을 통한 자유로운 상담 가능)
https://docs.google.com/document/d/1vPNIac3vfuBxzr3-IsqVqEAFwJtA-6dXiE_RvKhXJHo/edit#
Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성
제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.
https://forms.gle/a8XWyqXcTec8vdwq5
CSEE Lab Week 행사 참석 희망자(만찬 참여 포함)는 아래 설문지 필수 작성
https://docs.google.com/forms/d/1wkUWbYgcPFFTfrI-M3aOonQYRd_Oq6VHugJx6rVkuRE/edit?pli=1
**10/28(금)** 포스터세션이 종료되고 만찬(오후 5시 예정)이 있을 예정입니다.
만찬은 인원수 제한으로 선착순으로 신청을 받습니다.
event
CSEE Lab Week 참가자 커피쿠폰 증정
* 문의: 전산전자공학부공학과 고라경 선생님 (전화: 054-260-3150)
")
+ .viewCnt(0)
+ .importance(false)
+ .pubDate(LocalDate.of(2022, Month.AUGUST, 5))
+ .expDate(LocalDate.of(2022, Month.AUGUST, 25))
+ .build());
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(0))
+ .title("2022-2 비교과 졸업요건 서류 제출 안내(~12/16)")
+ .content("안녕하세요?
17학번이후인 1전공 컴퓨터공학/AI·컴퓨터공학심화 학생 중 캡스톤디자인 교과목 수강생 및 2023.2월 졸업예정자에게 안내드립니다.
비교과 졸업요건 만족 여부 확인을 위해 첨부 된 양식 작성하여 구글폼으로 제출해주시기 바랍니다.
* 비교과 졸업요건은 히즈넷-학생 졸업심사화면의 '학부추가졸업요건'에 해당합니다.
* 해당 학생들에게는 문자로 안내하였습니다.
<17학번부터 적용되는 비교과 졸업요건> - 산학프로젝트 1개 이상 수행 (산학R&D프로젝트, 또는 산학연계 교과목프로젝트 (예: 캡스톤디자인)) - 캡스톤프로젝트 결과물 등을 특허, 논문, SW시제품 중 한 가지 형태로 1건 이상 제출하여야 함 (공동 출원자/저자 모두 인정). - 비교과 졸업요건은 캡스톤디자인 과목을 산학 주제로 수행한 결과를 논문 발표, 특허출원, 또는 SW등록함으로써 자연스럽게 충족 가능함. |
|---|
|
1. 제출기한: 16주차 금요일(12/16)까지
2. 제출방법: 구글폼(https://forms.gle/Q7X1VfJL176h2TJ38) 제출
- 23.2월에 졸업하는 경우, 12/16(금)까지 제출하셔야 졸업 가능합니다.(다음학기 ‘학사학위취득유예’ 학생 포함)
- 23.2월에 졸업하지 않는 경우, 다음 학기에 제출하실 수 있습니다.(구글폼에 '졸업안함' 제출)
3. 참고사항
가. 이전에 증빙서류로 제출하였던 사례
1) 논문: 정식 게재된 목차 및 논문 스캔본, 발표 포스터 스캔본
2) 특허: 특허청의 공식 문서로 출원번호 또는 등록번호와 발명자 정보(주소지 포함)가 기재되어 있는 서류
(특허출원서, 특허증, 공개특허공보, 등록특허공보 중 1개 선택)
3) 시제품제작 (아래 3개 항목 중 1가지 선택)
가) SW등록: SW등록증, 프로그램등록신청명세서, 저작권 등록증 등
나) 앱 출시: 출시 된 앱의 스토어 게시 화면 캡쳐 이미지, 앱 출시 확인서 사본 등
다) 상용서비스 수준 확인 : 산학프로젝트 참여 기업체의 담당자 또는 기업체 멘토가 작성한 시제품 확인서(첨부 양식)
나. 자주묻는질문
1) 비교과 졸업요건을 충족하기 위한 결과물은 꼭 캡스톤디자인의 결과물이어야 하나요?
- 반드시 캡스톤 결과물이어야 할 필요는 없습니다.
2) 저작권 등록을 한 학생이 대표로 하게되어 등록증에 한명의 이름만 기재되는데 어떻게 하나요?
- 등록증에 들어있는 제목과 캡스톤 제목이 일치하면 같은 팀원에게 동일하게 적용됩니다. 다만, 서류는 개인별로 제출하셔야 합니다.
문의) csee@handong.edu
")
+ .viewCnt(0)
+ .importance(true)
+ .pubDate(LocalDate.of(2022, Month.DECEMBER, 8))
+ .expDate(LocalDate.of(2023, Month.DECEMBER, 16))
+ .build());
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(0))
+ .title("[이랜드이노플] 채용설명회 안내 및 수요조사")
+ .content("안녕하세요:) 반갑습니다.
이랜드이노플 인사팀입니다.
금번 [이랜드이노플X한동대학교] 채용설명회에 참여해주시는 분들께 감사의 의미로 간식 및 기념품을 제공해드리고자 수요조사를 진행하게 되었습니다. 일정은 아래와 같이 진행되며, 참석을 원하시는 분들께서는 본 설문에 응답해주시기를 부탁드립니다:)
1. 채용설명회
가. 일시: 2022.11.16(수) 12:00~12:50
나. 장소: 뉴턴홀 310호
다. 참석 혜택
- 채용설명회에 발걸음 해주시는 학생분들께 아래와 같은 혜택을 드리고자 합니다.
1) 서류전형 시 가산점 부여
2) 기념품 제공
3) Q&A 시간에 학생분들이 궁금해하시는 포인트들을 최대한 답변해드리고자 합니다.
+ (한동대 Only) 간식 제공> [한동대] 이랜드이노플 채용설명회 참여 신청서: https://forms.gle/s9B5JbDPsviRBEoq5
2. 채용 안내
가. 채용일정: 2022.11.4(금)~11.21(월)
나. 이랜드이노플 채용 관련 링크
- 채용사이트: https://careers.eland.co.kr/announce/recruit/hxKeGGXNip4urmc1ZmHDz7PJVJ2-
- Notion 이노플 공채 블로그: https://elandinnople.oopy.io/38d9b929-de4f-46eb-8234-d5b231973e74
- 네이버블로그: https://blog.naver.com/elandinnople

")
+ .viewCnt(0)
+ .importance(false)
+ .pubDate(LocalDate.of(2023, Month.MARCH, 6))
+ .expDate(LocalDate.of(2023, Month.SEPTEMBER, 26))
+ .build());
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(1))
+ .title("[대학원] 세미나(11월 11일, 손현우 교수)-아날로그 연산기 기반의 학습가능한 신경망 시스템")
+ .content("한동대학교 BK21 인공지능 사업단
2022학년도 2학기 참여대학원생 등록서류 제출 및 연구장학금 신청 안내
한동대학교 전산전자공학과 4단계 BK21 ‘산업혁신을 위한 AI 고급 인재교육연구단’ (BK21 인공지능사업단)에서 다음과 같이 등록 서류를 제출하여주시기 바랍니다.
1. 4단계 BK21 참여대학원생 기준 (다음의 조건을 모두 충족한 자)
BK21 참여교수의 지도학생 중 전일제(4대보험에 가입되어 있지 않은 학생)로 등록(연구생 등록 포함)한 석·박사과정 대학원생으로 다음 각 호에 해당하는 자
-입학한 지 2년이 지나지 않은 석사과정생
-입학한 지 4년이 지나지 않은 박사과정생 및 박사 수료생
-입학한 지 6년이 지나지 않은 석박통합과정생 및 석박통합과정 수료생
(위의 기간 기산 시 휴학 및 군복무 기간은 제외함).
위의 자격을 충족한 경우 ‘참여대학원생’으로 등록되어 ‘지원대학원생’ 선발 기회 등 BK21 사업의 지원을 받을 수 있음.
2. 지원대학원생 선발 및 연구장학금 지급
1) 참여대학원생으로 등록된 학생 중 70% 이내의 대학원생을 ‘지원대학원생’으로 선발해 연구장학금을 지급함.
2) 지원기간: 2022.09.01.~2023.02.28. (6개월 단위로 선발)
3) 선발기준: 지도교수 추천을 받은 참여대학원생 중 연구/프로젝트 성과 평가에 의해 선발
4) 역할 및 임무
- BK21 참여교수 연구실에서 논문 연구 및 산학 프로젝트를 성실히 수행 (주 40시간 이상)
- 사업단이 주관하는 각종 세미나, 포럼 등의 학술 활동에 참여
- 사업단이 요구하는 성과 자료 보고
3. 참여대학원생 등록서류 제출안내(등록서류는 단순참여, 장학금 지원 받는 학생 모두 제출해주세요.)
1) 첨부된 제출서류 다운 및 작성 후 BK21 사업단 사무실로 서류 제출.
2) 지도교수로부터 지원대학원생(장학금 받는 학생)으로 추천받은 대학원생은 5.제출서류 함께 제출
4. 서류 제출 기간: 2022년 8월 29일(월) 13:00 - 9월 7일(수) 17:00 (제출기한 엄수)
5. 제출서류
- 연구자등록번호 발급 방법
: KRI(한국연구업적통합정보시스템 http://www.kri.go.kr)에 접속 회원가입→연구자등록번호 발급
(가입 시 소속을 반드시 ‘한동대학교’로 가입)
1) 재학증명서 1부. 연구생등록자의 경우 연구생등록증 1부(2022년 9월 1일자 기준으로 제출)
2) 개인정보 수집 이용 제공 동의서 1부. (BK사업에 처음 참여하는 학생만 제출)
3) 참여인력 서약서 1부.
4) 참여대학원생 확약서 1부.
5) BK21 연구장학금 신청서 1부. (지원대학원생-BK장학금 받는 학생만 제출)
6) 전산전자공학과 학기 보고서 1부.
7) 재학증명서 1부.(9월 1일 기준)
8) 연구재단 필수 제출 서류 '4대 보험 가입 증명서' 1부. (22.10.1일 기준일로하여 메일로 회신)
(**10월1일 기준으로 출력 후 제출 바랍니다. 9월에는 제출하지 않아도 됩니다!)
- 출력 방법: 4대 사회보험 포털서비스(http://www.4insure.or.kr) 로그인(회원가입, 공인인증서 필요) → 상단 메뉴 증명서발급(가입내역확인) 클릭 후 출력
9) 대학원 성적표 1부. (신입생은 제출X)
<한국연구재단 필수 수강!!-참여기간 중 1회 수강 후 수료증 제출해야함, 교육 미이수자 및 22-2학기 신입생만 수강하면 됩니다.>
10) 온라인 교육 수료증 (http://alpha-campus.kr/) 에 접속하여 로그인 후 상단 메뉴의 '탐색'->'온라인교육' -> '건강한 연구환경 조성을 위한 인권침해예방교육'클릭 ->'수강신청' 클릭 후 팝업창에서 수강신청 정보 확인 및 '신청완료'-> '학습'-> '학습중과정'-> '건강한 연구환경 조성을 위한 인권침해예방교육' 순서대로 클릭 후 '학습하기'
컨텐츠 수강 후 ‘MY'-> '학습이력'클릭 후 수료증 발급 및 보관)
*수료증은 메일로 회신부탁합니다.
11) 통장사본 및 신분증 사본 각 1부.
※ 외국인 참여대학원생의 경우 외국인 등록증 앞, 뒤 사본(D-2비자 여부 및 만료기한 확인) 제출.
※ 기존 참여대학원생이 지원할 경우: 2)개인정보 수집 이용 제공 동의서, 10)온라인 교육 수료증 제출 생략.
6. 서류 제출 및 문의처
1) BK21사업단 사무실: 뉴턴홀 309호 전산전자공학부 사무실 담당자 고라경(Tel: 260-3150)
2) 신청 시 모든 서류는 위 제출서류 순서대로 정리하여 원본 제출 바랍니다.
7. 유의사항: 제출된 서류는 반환하지 않으며, 허위사실 기재 시 선발을 취소함.
")
+ .viewCnt(0)
+ .importance(false)
+ .pubDate(LocalDate.of(2023, Month.FEBRUARY, 9))
+ .expDate(LocalDate.of(2023, Month.SEPTEMBER, 15))
+ .build());
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(2))
+ .title("[SW중심대] 11월 2일(수) 류석문 쏘카 CTO 특강 안내")
+ .content("[SW중심대] 11월 2일(수) 류석문 쏘카 CTO 특강 안내

1. 강사 : 류석문 쏘카 CTO
2. 주제 : 프로그래머로 산다는 것
3. 일시 : 2022년 11월 2일 (수) 오후 1시
4. 장소 : 오석관 405호, 401호,
5. 소감문 제출 방법 : 링크 접속 후 제출 (https://forms.gle/gRtNgqWtFnxYmMXVA)
* 공프기 및 캡스톤 수강생 외 학생들은 강의 시청 후 반드시 소감문을 제출하셔야 합니다. (11. 4(금) 밤12시까지)
☎ 문의 : SW중심대학 지원사업단 김선영 (T.260-1492, E-Mail : pooh8276@handong.edu)
")
+ .viewCnt(0)
+ .importance(true)
+ .pubDate(LocalDate.of(2022, Month.OCTOBER, 7))
+ .expDate(LocalDate.of(2022, Month.OCTOBER, 28))
+ .build());
+
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(3))
+ .title("일본 IT 강독 2022년 2학기 첫번쨰 모임이 이번주 수요일 11월 09일 저녁 8시에 열립니다.")
+ .content(" 일본 IT 강독 2022년 2학기 첫번? 모임이 이번주 수요일 11월 09일 저녁 8시에 열립니다.
2022년2학기 일본IT학회 주관 \"일본 IT 강독\"
일본의 IT시스템 개발문서, IT 트렌드 관련 일본어 기사 등을 같이 읽어 나가는 시간입니다. 일본은 IT시스템 개발과정에서 Documentation을 아주 철저히 하고 있습니다. 따라서 일본 IT 취업시 일본어를 읽고 쓰는 능력은 회화능력 이상으로 중요합니다. IT관련 일본어 문서를 읽어나가며 일본어를 더 공부하고 싶게 하고자 합니다.
본 시간은 22년이상 일본에서 IT개발자로서 일본인들과 함께 일해오신 일본 도레이쿠 김종환 대표님이 직접 강의합니다.
참여자격 : 일본어 초급 수준(한동대학교 일본어 I 수강 수준)
일정
제 1 차 모임. 11월 09일(수 저녁 8시) 11주차
제 2 차 모임. 11월 23일(수 저녁 8시) 13주차
줌 접속 주소
https://handong.zoom.us/j/82808657679
- 참석자에게는 마일리지가 부여됩니다.
- 문의 : 김기석 교수(peterkim@handong.edu) ,박훈성(01043417017 / 21800333@handong.ac.kr)
")
+ .viewCnt(0)
+ .importance(true)
+ .pubDate(LocalDate.of(2023, Month.JANUARY, 1))
+ .expDate(LocalDate.of(2023, Month.JULY, 7))
+ .build());
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(2))
+ .title("23-1학기 공학프로젝트기획(공프기) 사전신청 안내")
+ .content("2023년 봄학기 공학프로젝트기획(공프기)을 수강하기 원하는 학생은
11월 6일까지 아래 링크의 웹사이트에서 사전 신청을 접수하시기 바랍니다.
http://walab.handong.edu/csc/
사전 신청은 공학프로젝트기획 주제 제안과 팀 구성 과정을 효율적으로 하기 위한 작업이니,
수강 의사가 조금이라도 있다면 반드시 사전 신청을 접수하기 바랍니다.
사전신청에 접수한 학생에 한하여 관련 공지사항과 공프기 주제 제안 내용을 공개할 예정입니다.
2023-1학기 공프기를 위한 일정 계획
2022-2학기 9주차
2022-2학기 10주차
2022-2학기 12주차 ~
")
+ .viewCnt(0)
+ .importance(true)
+ .pubDate(LocalDate.of(2022, Month.OCTOBER, 25))
+ .expDate(LocalDate.of(2022, Month.OCTOBER, 31))
+ .build());
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(3))
+ .title(" 2022 한동대 C프로그래밍 컨테스트 안내")
+ .content("일시 : 2022년 12월 9일 15주차 금요일 오후 8시~10시(120분)
대상 : 전교생 중 1학년 또는 SW관련 전공이 아닌 학생
시험방법 : Replit.com 사이트에 온라인 접속 후 문제를 풀어 제출함(시험 중 구글링 또는 본인의 소스 참조 가능, 타인과 대화, 메시징, 이메일 금지)
출제범위 : C프로그래밍 수업 전반
문제 수 : 10문제 이내
▶ 컨테스트 관련 질문응답 : www.classum.com/EXZRQI
▶ 시험 서버 접속 및 테스트 문제 풀이 : 2022년 12월 9일(금) 18시까지
▶ 컨테스트 참여 시 주의사항
▶ 채점 기준
기준 1 : 성공적으로 해결하여 테스트케이스 모두 통과한 후, 제출한 문제 갯수가 많은 순
기준 2 : 해결한 모든 문제의 평균제출시간이 빠른 순
기준 3 : 미완성 제출 경우 통과된 테스트 케이스가 많은 순
▶ 참가자 혜택
")
+ .viewCnt(0)
+ .importance(true)
+ .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2))
+ .expDate(LocalDate.of(2023, Month.NOVEMBER, 9))
+ .build());
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(2))
+ .title("[지역선도대학] 2022 대경권 대학생 AI프로그래밍 경진대회 개최")
+ .content("2022 대경권 대학생 AI프로그래밍 경진대회 개최

지역선도대학육성사업에서는 재학생들의 인공지능(AI) 컴퓨팅 사고역량, 프로그래밍 역량 문제해결 역량 강화 등을 위하여 2022 대경권 대학생 AI프로그래밍 경진대회를 개최합니다.
■ 접수기간: 2022. 10. 26.(수) ~ 11. 9.(수) 까지
■ 접수방법: 대회 홈페이지에서 직접 신청(참가비 무료)
대회 홈페이지 주소 및 자세한 내용은 지역선도대학육성사업 홈페이지 → 온라인신청 → 진행프로그램에서 가능
(https://spoke.knu.ac.kr/03_sub/01_sub.html)
■ 문의 : 안영은 연구원(054-260-3124, aye3384@handong.edu)
")
+ .viewCnt(0)
+ .importance(false)
+ .pubDate(LocalDate.of(2023, Month.OCTOBER, 21))
+ .expDate(LocalDate.of(2023, Month.OCTOBER, 27))
+ .build());
+ noticeRepository.save(Notice.builder()
+ .manager(l.get(0))
+ .title("[CSEE Lab Week] Lab 토크쇼 관련 사전 질문")
+ .content("안녕하세요. 컴퓨터 공학 전공 주임 안민규 교수입니다.
이전 글에 공지된 것처럼 다음 주 9주차에는 전산전자공학부공학부/전산전자공학부공학과가 CSEE Lab Week가 진행됩니다.
관련 글> https://hisnet.handong.edu/myboard/read.php?id=35135&Board=B0029
연구실에 관심이 있거나, 2023-1학기 공학프로젝트 기획 수강을 계획하는 학생들에게는 큰 도움이 될 것 같습니다.
각 연구실에 대하여 궁금한 점은 9주차 동안 진행되는 Lab 멘토링을 통해 문의하고 답변을 받기 바랍니다.
또한, 목요일 18:30에는 CSEE 연구실, 연구실 생활, 졸업 프로젝트, 진로 등에 관하여 이야기를 교수님들과 나눌 수 있는 자리를 마련하였으니 많은 학생들이 참여하여 정보를 얻는 시간이 되길 빕니다.
관련하여 현재 사전 질문을 받고 있습니다. 아래의 링크를 통하여 묻고 싶은 사항을 남겨주시기 바랍니다.
Lab토크쇼(10/27(목) 18시30분~) 사전질문 작성
제출된 질문은 Lab 토크쇼에서 활용되며, 추첨을 통하여 커피쿠폰을 드립니다.
https://forms.gle/a8XWyqXcTec8vdwq5
안민규 교수.
")
+ .viewCnt(0)
+ .importance(false)
+ .pubDate(LocalDate.of(2022, Month.NOVEMBER, 2))
+ .expDate(LocalDate.of(2023, Month.NOVEMBER, 9))
+ .build());
+ }
+
+
+ private void saveStudent() {
+ studentRepository.save(Student.builder()
+ .name("박성진")
+ .department(departementRepository.findByName("전산전자공학부"))
+ .studentNum("21700266")
+ .semester(8)
+ .major1(majorRepository.findByName("컴퓨터공학심화전공"))
+ .major2(majorRepository.findByName("-"))
+ .phone("010-9484-4321")
+ .email("david@handong.ac.kr")
+ .profile("https://user-images.githubusercontent.com/63008958/203534676-49fb985a-c686-4965-9dc4-d46ae90cc3e7.png")
+ .blog("blog.com")
+ .githubId("@davidpiao.github")
+ .loginCnt(0L)
+ .readme("david's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("안병웅")
+ .department(departementRepository.findByName("생명과학부"))
+ .studentNum("21600399")
+ .semester(6)
+ .major1(majorRepository.findByName("생명과학전공"))
+ .major2(majorRepository.findByName("-"))
+ .phone("010-1623-1512")
+ .email("mh030315@handong.ac.kr")
+ .profile("https://user-images.githubusercontent.com/63008958/203915182-c8216b87-9e06-4a10-8efe-b8d0cb43b5af.png")
+ .blog("blog.com")
+ .githubId("@wooong.github")
+ .loginCnt(0L)
+ .readme("an's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("홍성헌")
+ .department(departementRepository.findByName("커뮤니케이션학부"))
+ .studentNum("21800929")
+ .semester(8)
+ .major1(majorRepository.findByName("공연영상학전공"))
+ .major2(majorRepository.findByName("언론정보학전공"))
+ .phone("010-1623-3322")
+ .email("hong@handong.ac.kr")
+ .profile("https://user-images.githubusercontent.com/63008958/203469086-7e27bf70-cca1-4bf2-be74-e16dbcee7507.jpeg")
+ .blog("blog.com")
+ .githubId("@hong.github")
+ .loginCnt(0L)
+ .readme("hong's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("이인혁")
+ .department(departementRepository.findByName("기계제어공학부"))
+ .studentNum("21700032")
+ .semester(5)
+ .major1(majorRepository.findByName("전자제어공학전공"))
+ .major2(majorRepository.findByName("기계공학전공"))
+ .phone("010-4983-6555")
+ .email("lee@handong.ac.kr")
+ .profile("https://user-images.githubusercontent.com/63008958/203468795-8bf6ee4b-5ee6-4ae4-87ed-ca438307c30f.jpeg")
+ .blog("blog.com")
+ .githubId("@ee.github")
+ .loginCnt(0L)
+ .readme("lee's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("정석민")
+ .department(departementRepository.findByName("콘텐츠융합디자인학부"))
+ .studentNum("22000432")
+ .semester(3)
+ .major1(majorRepository.findByName("시각디자인전공"))
+ .major2(majorRepository.findByName("-"))
+ .phone("010-4983-6555")
+ .email("jeong@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@jeong.github")
+ .loginCnt(0L)
+ .readme("jeong's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("송다빈")
+ .department(departementRepository.findByName("법학부"))
+ .studentNum("22000332")
+ .semester(3)
+ .major1(majorRepository.findByName("US & International Law"))
+ .major2(majorRepository.findByName("한국법전공"))
+ .phone("010-7788-0142")
+ .email("song@handong.ac.kr")
+ .profile("https://user-images.githubusercontent.com/63008958/203534764-4f30254d-d917-444c-84f9-d8e922b967fa.png")
+ .blog("blog.com")
+ .githubId("@song.github")
+ .loginCnt(0L)
+ .readme("song's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("문하현")
+ .department(departementRepository.findByName("전산전자공학부"))
+ .studentNum("22200000")
+ .semester(5)
+ .major1(majorRepository.findByName("컴퓨터공학전공"))
+ .major2(majorRepository.findByName("생명과학전공"))
+ .phone("010-1234-1234")
+ .email("kim@handong.ac.kr")
+ .profile("https://user-images.githubusercontent.com/63008958/203492174-ef61e68c-a3d9-429e-8947-75542423977a.png")
+ .blog("blog.com")
+ .githubId("@kim.github")
+ .loginCnt(0L)
+ .readme("kim's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("박관희")
+ .department(departementRepository.findByName("국제어문학부"))
+ .studentNum("22200001")
+ .semester(3)
+ .major1(majorRepository.findByName("국제지역학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-1234-5678")
+ .email("park@handong.ac.kr")
+ .profile("https://user-images.githubusercontent.com/63008958/203862630-2915aaad-8ff0-42ae-b217-fcbce19e4791.png")
+ .blog("blog.com")
+ .githubId("@park.github")
+ .loginCnt(0L)
+ .readme("park's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("이연진")
+ .department(departementRepository.findByName("경영경제학부"))
+ .studentNum("22200002")
+ .semester(5)
+ .major1(majorRepository.findByName("경영학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-5678-1234")
+ .email("lee@handong.ac.kr")
+ .profile("https://user-images.githubusercontent.com/63008958/203536628-985c37e3-49a9-4a50-82a3-485c09c456c4.png")
+ .blog("blog.com")
+ .githubId("@lee.github")
+ .loginCnt(0L)
+ .readme("lee's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("게스트")
+ .department(departementRepository.findByName("법학부"))
+ .studentNum("22200003")
+ .semester(6)
+ .major1(majorRepository.findByName("한국법전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-1111-1111")
+ .email("jeong@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-10/Original Logo.png")
+ .blog("blog.com")
+ .githubId("@jeong.github")
+ .loginCnt(0L)
+ .readme("jeong's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("김건휘")
+ .department(departementRepository.findByName("전산전자공학부"))
+ .studentNum("21700234")
+ .semester(2)
+ .major1(majorRepository.findByName("컴퓨터공학전공"))
+ .major2(majorRepository.findByName("생명과학전공"))
+ .phone("010-1234-1234")
+ .email("kim@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@kim.github")
+ .loginCnt(0L)
+ .readme("kim's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("이도경")
+ .department(departementRepository.findByName("국제어문학부"))
+ .studentNum("21200012")
+ .semester(9)
+ .major1(majorRepository.findByName("국제지역학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-1234-5678")
+ .email("park@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@park.github")
+ .loginCnt(0L)
+ .readme("park's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("정민수")
+ .department(departementRepository.findByName("경영경제학부"))
+ .studentNum("22200032")
+ .semester(5)
+ .major1(majorRepository.findByName("경영학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-6655-4232")
+ .email("lee@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@lee.github")
+ .loginCnt(0L)
+ .readme("lee's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("조수아")
+ .department(departementRepository.findByName("법학부"))
+ .studentNum("21600223")
+ .semester(5)
+ .major1(majorRepository.findByName("한국법전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-9292-9292")
+ .email("jeong@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@jeong.github")
+ .loginCnt(0L)
+ .readme("jeong's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("김빛나리")
+ .department(departementRepository.findByName("커뮤니케이션학부"))
+ .studentNum("22200023")
+ .semester(3)
+ .major1(majorRepository.findByName("공연영상학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-2332-4333")
+ .email("woo@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@woo.github")
+ .loginCnt(0L)
+ .readme("woo's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("김혜린")
+ .department(departementRepository.findByName("상담심리사회복지학부"))
+ .studentNum("21900021")
+ .semester(4)
+ .major1(majorRepository.findByName("사회복지학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-4444-1234")
+ .email("wi@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@wi.github")
+ .loginCnt(0L)
+ .readme("wi's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("이소희")
+ .department(departementRepository.findByName("공간환경시스템공학부"))
+ .studentNum("21800002")
+ .semester(9)
+ .major1(majorRepository.findByName("도시환경공학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-3221-6665")
+ .email("ha@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@ha.github")
+ .loginCnt(0L)
+ .readme("ha's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("이소연")
+ .department(departementRepository.findByName("콘텐츠융합디자인학부"))
+ .studentNum("21400025")
+ .semester(2)
+ .major1(majorRepository.findByName("컴퓨터공학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-4211-1123")
+ .email("ma@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@ma.github")
+ .loginCnt(0L)
+ .readme("ma's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("이동영")
+ .department(departementRepository.findByName("기계제어공학부"))
+ .studentNum("21100234")
+ .semester(10)
+ .major1(majorRepository.findByName("기계공학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-2311-9992")
+ .email("yu@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@yu.github")
+ .loginCnt(0L)
+ .readme("yu's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("김시온")
+ .department(departementRepository.findByName("전산전자공학부"))
+ .studentNum("22100032")
+ .semester(2)
+ .major1(majorRepository.findByName("컴퓨터공학전공"))
+ .major2(majorRepository.findByName("생명과학전공"))
+ .phone("010-3232-6767")
+ .email("kim@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@kim.github")
+ .loginCnt(0L)
+ .readme("kim's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("황유민")
+ .department(departementRepository.findByName("국제어문학부"))
+ .studentNum("21600432")
+ .semester(1)
+ .major1(majorRepository.findByName("국제지역학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-4322-9009")
+ .email("park@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@park.github")
+ .loginCnt(0L)
+ .readme("park's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("엄서영")
+ .department(departementRepository.findByName("경영경제학부"))
+ .studentNum("22000231")
+ .semester(5)
+ .major1(majorRepository.findByName("경영학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-6653-4231")
+ .email("lee@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@lee.github")
+ .loginCnt(0L)
+ .readme("lee's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("이찬유")
+ .department(departementRepository.findByName("법학부"))
+ .studentNum("21600423")
+ .semester(5)
+ .major1(majorRepository.findByName("한국법전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-9292-9232")
+ .email("jeong@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@jeong.github")
+ .loginCnt(0L)
+ .readme("jeong's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("천그루")
+ .department(departementRepository.findByName("커뮤니케이션학부"))
+ .studentNum("22200026")
+ .semester(3)
+ .major1(majorRepository.findByName("공연영상학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-2312-4343")
+ .email("woo@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@woo.github")
+ .loginCnt(0L)
+ .readme("woo's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("이하민")
+ .department(departementRepository.findByName("상담심리사회복지학부"))
+ .studentNum("21910032")
+ .semester(4)
+ .major1(majorRepository.findByName("사회복지학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-4444-4234")
+ .email("wi@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@wi.github")
+ .loginCnt(0L)
+ .readme("wi's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("현요섭")
+ .department(departementRepository.findByName("콘텐츠융합디자인학부"))
+ .studentNum("21400325")
+ .semester(2)
+ .major1(majorRepository.findByName("컴퓨터공학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-4211-1673")
+ .email("ma@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@ma.github")
+ .loginCnt(0L)
+ .readme("ma's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("이찬호")
+ .department(departementRepository.findByName("기계제어공학부"))
+ .studentNum("21100734")
+ .semester(10)
+ .major1(majorRepository.findByName("기계공학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-2911-9192")
+ .email("yu@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@yu.github")
+ .loginCnt(0L)
+ .readme("yu's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("곤잘레스")
+ .department(departementRepository.findByName("상담심리사회복지학부"))
+ .studentNum("21900112")
+ .semester(4)
+ .major1(majorRepository.findByName("사회복지학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-1144-4214")
+ .email("wi@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@wi.github")
+ .loginCnt(0L)
+ .readme("wi's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("다비드")
+ .department(departementRepository.findByName("공간환경시스템공학부"))
+ .studentNum("21800332")
+ .semester(9)
+ .major1(majorRepository.findByName("도시환경공학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-3331-6365")
+ .email("ha@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@ha.github")
+ .loginCnt(0L)
+ .readme("ha's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("김영헌")
+ .department(departementRepository.findByName("공간환경시스템공학부"))
+ .studentNum("21810232")
+ .semester(9)
+ .major1(majorRepository.findByName("도시환경공학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-3431-6365")
+ .email("ha@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@ha.github")
+ .loginCnt(0L)
+ .readme("ha's readme")
+ .build());
+ studentRepository.save(Student.builder()
+ .name("김하은")
+ .department(departementRepository.findByName("콘텐츠융합디자인학부"))
+ .studentNum("21400825")
+ .semester(2)
+ .major1(majorRepository.findByName("컴퓨터공학전공"))
+ .major2(majorRepository.findByName("컴퓨터공학전공"))
+ .phone("010-4111-2673")
+ .email("ma@handong.ac.kr")
+ .profile("https://hispath.s3.ap-northeast-2.amazonaws.com/upload/student-5/plant-2004483_1920.jpg")
+ .blog("blog.com")
+ .githubId("@ma.github")
+ .loginCnt(0L)
+ .readme("ma's readme")
+ .build());
+ }
+
+ private void saveCategory() {
+ categoryRepository.save(Category.builder()
+ .name("전공마일리지")
+ .build());
+ categoryRepository.save(Category.builder()
+ .name("산학마일리지")
+ .build());
+ categoryRepository.save(Category.builder()
+ .name("비교과-연구활동")
+ .build());
+ categoryRepository.save(Category.builder()
+ .name("비교과-특강참여")
+ .build());
+ categoryRepository.save(Category.builder()
+ .name("비교과-행사참여")
+ .build());
+ categoryRepository.save(Category.builder()
+ .name("비교과-학회활동")
+ .build());
+ categoryRepository.save(Category.builder()
+ .name("기타")
+ .build());
+ }
+
+
+ private void saveDepartment() {
+ departementRepository.save(Department.builder()
+ .name("전산전자공학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982136-82098fb9-f082-40e3-a677-e84076ea7745.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("국제어문학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982173-f22aa5a5-0e7f-45cc-91b0-1870ced20441.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("경영경제학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982171-65bbc7d2-a8de-43d2-9db3-ca361aa36b1c.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("법학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982170-44a91016-1b6a-4d88-b7a1-4560966521f2.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("커뮤니케이션학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982168-d3cba5e1-2627-4941-a414-aa3e17fd2959.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("상담심리사회복지학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982129-0ed8a671-c04a-443f-b48e-7471074112ea.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("공간환경시스템공학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982164-378d214b-04ce-4d1f-b909-36daf17b5cdb.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("콘텐츠융합디자인학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982153-f2ae91d9-8984-40ed-9802-5b2f71f123b5.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("기계제어공학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982161-61e66aa6-6625-4eb0-819c-71edc01f47ad.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("ICT 창업학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982115-30963e7f-19e9-4f45-8390-bec128a1981b.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("생명과학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982143-6972a9ad-8b43-4024-b63f-59ce0969e922.png")
+ .build());
+ departementRepository.save(Department.builder()
+ .name("글로벌리더쉽학부")
+ .profile("https://user-images.githubusercontent.com/63008958/203982177-4324201c-63d8-4df0-abe7-09fd1c7cfd21.png")
+ .build());
+ }
+
+
+ public void saveActivities() {
+ activityRepository.save(Activity.builder()
+ .semester("2021-2")
+ .personal(false)
+ .remark("")
+ .requestStatus(1)
+ .name("공학프로젝트기획")
+ .weight(7)
+ .category(categoryRepository.findByName("전공마일리지"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-1")
+ .personal(false)
+ .remark("")
+ .requestStatus(1)
+ .name("공학설계입문")
+ .weight(5)
+ .category(categoryRepository.findByName("전공마일리지"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("")
+ .requestStatus(1)
+ .name("캡스톤 디자인")
+ .weight(10)
+ .category(categoryRepository.findByName("전공마일리지"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("")
+ .requestStatus(1)
+ .name("AI 프로젝트 입문")
+ .weight(5)
+ .category(categoryRepository.findByName("전공마일리지"))
+ .build());
+// 산학
+ activityRepository.save(Activity.builder()
+ .semester("2021-2")
+ .personal(false)
+ .remark("")
+ .requestStatus(1)
+ .name("현장실습")
+ .weight(7)
+ .category(categoryRepository.findByName("산학마일리지"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2021-2")
+ .personal(false)
+ .remark("BizFlow")
+ .requestStatus(1)
+ .name("현장실습")
+ .weight(7)
+ .category(categoryRepository.findByName("산학마일리지"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("카카오")
+ .requestStatus(1)
+ .name("현장실습")
+ .weight(7)
+ .category(categoryRepository.findByName("산학마일리지"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("엑슨투")
+ .requestStatus(1)
+ .name("현장실습")
+ .weight(7)
+ .category(categoryRepository.findByName("산학마일리지"))
+ .build());
+// 비교과연구활동
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("AI Deep Learning")
+ .requestStatus(1)
+ .name("논문 분석")
+ .weight(5)
+ .category(categoryRepository.findByName("비교과-연구활동"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("Brain Computer Interface")
+ .requestStatus(1)
+ .name("논문 분석")
+ .weight(5)
+ .category(categoryRepository.findByName("비교과-연구활동"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("ResNet Review")
+ .requestStatus(1)
+ .name("논문 분석")
+ .weight(5)
+ .category(categoryRepository.findByName("비교과-연구활동"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("Anomaly Analysis")
+ .requestStatus(1)
+ .name("논문 분석")
+ .weight(5)
+ .category(categoryRepository.findByName("비교과-연구활동"))
+ .build());
+// 비교과특강참여
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("디지털 시대와 개발자 (10.26)")
+ .requestStatus(1)
+ .name("CSEE 특강")
+ .weight(2)
+ .category(categoryRepository.findByName("비교과-특강참여"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("프로그래머로 산다는 것 (11.2)")
+ .requestStatus(1)
+ .name("CSEE 특강")
+ .weight(2)
+ .category(categoryRepository.findByName("비교과-특강참여"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("제네시스랩의 기술 창업 스토리")
+ .requestStatus(1)
+ .name("CSEE 특강")
+ .weight(2)
+ .category(categoryRepository.findByName("비교과-특강참여"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("웹과 클라우드 개발자 취업의 현장 (11.07)")
+ .requestStatus(1)
+ .name("CSEE 특강")
+ .weight(2)
+ .category(categoryRepository.findByName("비교과-특강참여"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("웹 개발자로 살아남는 법 (11.27)")
+ .requestStatus(1)
+ .name("CSEE 특강")
+ .weight(2)
+ .category(categoryRepository.findByName("비교과-특강참여"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("빅데이터 분석과 활용법 (12.10)")
+ .requestStatus(1)
+ .name("CSEE 특강")
+ .weight(2)
+ .category(categoryRepository.findByName("비교과-특강참여"))
+ .build());
+// 행사참여
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("")
+ .requestStatus(1)
+ .name("(캠프)웹서비스 프로젝트(spring)_장소연")
+ .weight(6)
+ .category(categoryRepository.findByName("비교과-행사참여"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("최우수상 수상")
+ .requestStatus(1)
+ .name("(캠프)미리미리C 캠프_김광")
+ .weight(5)
+ .category(categoryRepository.findByName("비교과-행사참여"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("우수상 수상")
+ .requestStatus(1)
+ .name("(캠프)Advanced Flutter Camp_조성배")
+ .weight(6)
+ .category(categoryRepository.findByName("비교과-행사참여"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("")
+ .requestStatus(1)
+ .name("캡스톤 페스티벌 참여")
+ .weight(5)
+ .category(categoryRepository.findByName("비교과-행사참여"))
+ .build());
+// 비교과 학회활동
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("CRA")
+ .requestStatus(1)
+ .name("전공동아리")
+ .weight(7)
+ .category(categoryRepository.findByName("비교과-학회활동"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("GHOST")
+ .requestStatus(1)
+ .name("전공동아리")
+ .weight(7)
+ .category(categoryRepository.findByName("비교과-학회활동"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("실전프로젝트 1스터디")
+ .requestStatus(1)
+ .name("전공스터디")
+ .weight(3)
+ .category(categoryRepository.findByName("비교과-학회활동"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("시선")
+ .requestStatus(1)
+ .name("전공학회")
+ .weight(5)
+ .category(categoryRepository.findByName("비교과-학회활동"))
+ .build());
+
+// 기타
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("SW중심대학 협의회장상")
+ .requestStatus(1)
+ .name("SW중심대학 공동해커톤 2022")
+ .weight(7)
+ .category(categoryRepository.findByName("기타"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("정보처리기사")
+ .requestStatus(1)
+ .name("자격증")
+ .weight(5)
+ .category(categoryRepository.findByName("기타"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("네이버 부스트캠프")
+ .requestStatus(1)
+ .name("외부캠프")
+ .weight(6)
+ .category(categoryRepository.findByName("기타"))
+ .build());
+ activityRepository.save(Activity.builder()
+ .semester("2022-2")
+ .personal(false)
+ .remark("TOPCIT")
+ .requestStatus(1)
+ .name("전공역량시험")
+ .weight(4)
+ .category(categoryRepository.findByName("기타"))
+ .build());
+ }
+
+
+ private void saveMajor() {
+ majorRepository.save(Major.builder().name("-").profile("https://user-images.githubusercontent.com/63008958/203987348-497d8992-98e2-47ff-9769-a7207e6961ed.png").build());
+ majorRepository.save(Major.builder().name("건설공학전공").profile("https://user-images.githubusercontent.com/63008958/203986081-cc605f80-7cb3-4fc9-93ed-9712a38506c6.jpg").build());
+ majorRepository.save(Major.builder().name("도시환경공학전공").profile("https://user-images.githubusercontent.com/63008958/203986080-4921f01e-8fdd-480c-b764-f1d926b070d3.jpg").build());
+ majorRepository.save(Major.builder().name("기계공학전공").profile("https://user-images.githubusercontent.com/63008958/203986079-59fe24a6-d934-4dad-9b80-35a1a5306535.jpg").build());
+ majorRepository.save(Major.builder().name("전자제어공학전공").profile("https://user-images.githubusercontent.com/63008958/203986077-425b14ae-37f5-480a-b00c-fdec96f09b9d.jpg").build());
+ majorRepository.save(Major.builder().name("생명과학전공").profile("https://user-images.githubusercontent.com/63008958/203986074-b785eed9-1531-4c32-b153-dec59ea10982.jpg").build());
+ majorRepository.save(Major.builder().name("글로벌융합전공").profile("https://user-images.githubusercontent.com/63008958/203986073-4a098ecc-5f91-4ab4-abb3-2a90149c566a.jpg").build());
+ majorRepository.save(Major.builder().name("수학통계전공").profile("https://user-images.githubusercontent.com/63008958/203986071-ba9e0fb7-e246-4cfc-b1cc-788264a9086b.jpg").build());
+ majorRepository.save(Major.builder().name("학생설계융합전공").profile("https://user-images.githubusercontent.com/63008958/203986068-5fd2f7d5-c894-49ed-92d7-30a63b4e88f9.jpg").build());
+ majorRepository.save(Major.builder().name("시각디자인전공").profile("https://user-images.githubusercontent.com/63008958/203986065-746e6d2d-38e0-494e-b5c4-9060d5bb329e.jpg").build());
+ majorRepository.save(Major.builder().name("제품디자인전공").profile("https://user-images.githubusercontent.com/63008958/203986063-d3aa8474-58c6-4e22-a23f-1a17edb40300.jpg").build());
+ majorRepository.save(Major.builder().name("컴퓨터공학전공").profile("https://user-images.githubusercontent.com/63008958/203986059-4fc80f57-49b3-453f-94de-6f51b729730a.jpg").build());
+ majorRepository.save(Major.builder().name("컴퓨터공학심화전공").profile("https://user-images.githubusercontent.com/63008958/203986052-b02066c1-0ff5-41ed-81e7-72bcf5284dc3.jpg").build());
+ majorRepository.save(Major.builder().name("전자공학전공").profile("https://user-images.githubusercontent.com/63008958/204516545-6c7ca818-1c99-4c1a-a4d4-569577d344d8.jpg").build());
+ majorRepository.save(Major.builder().name("전자공학심화전공").profile("https://user-images.githubusercontent.com/63008958/204516569-13f7310b-b5a5-4f9d-8171-065884cbf59c.jpg").build());
+ majorRepository.save(Major.builder().name("Information Technology").profile("https://user-images.githubusercontent.com/63008958/204516579-bad0d03e-d9ca-4a76-9e94-4a31fe605ce4.jpg").build());
+ majorRepository.save(Major.builder().name("ICT 융합전공").profile("https://user-images.githubusercontent.com/63008958/204516638-7c5c13c2-ebb7-4d41-895b-8af61801e7b4.jpg").build());
+ majorRepository.save(Major.builder().name("AI Convergence & Entrepreneurship 전공").profile("https://user-images.githubusercontent.com/63008958/204517597-e463b42b-17f3-4476-9314-fe33edb23e8e.jpg").build());
+ majorRepository.save(Major.builder().name("Global Entrepreneurship 전공").profile("https://user-images.githubusercontent.com/63008958/204516633-5be00a69-d31e-4edb-ada1-9f143f9ec5ee.jpg").build());
+ majorRepository.save(Major.builder().name("AI 융합 전공").profile("https://user-images.githubusercontent.com/63008958/204517614-2fd82907-7e30-488e-8df5-b34c1f5fd05f.jpg").build());
+ majorRepository.save(Major.builder().name("데이터 사이언스 전공").profile("https://user-images.githubusercontent.com/63008958/204516681-cee59ca5-3e83-45b0-9f2d-77d38aa9772a.jpg").build());
+ majorRepository.save(Major.builder().name("경영학전공").profile("https://user-images.githubusercontent.com/63008958/204516699-8d4ae330-79ce-4827-a9b1-4c6bb94a04dd.jpg").build());
+ majorRepository.save(Major.builder().name("경제학전공").profile("https://user-images.githubusercontent.com/63008958/204516724-255d3f3d-586c-44f2-bf30-20ae74500e5e.jpg").build());
+ majorRepository.save(Major.builder().name("Global Management").profile("https://user-images.githubusercontent.com/63008958/204516745-795ffbf4-3e25-410a-bb87-8957b17f974a.jpg").build());
+ majorRepository.save(Major.builder().name("국제지역학전공").profile("https://user-images.githubusercontent.com/63008958/204516767-6d058e2b-98eb-4156-84f2-41adc5961487.jpg").build());
+ majorRepository.save(Major.builder().name("영어전공").profile("https://user-images.githubusercontent.com/63008958/204516780-97509626-d605-4b33-871e-6c66d8b9bccb.jpg").build());
+ majorRepository.save(Major.builder().name("한국법전공").profile("https://user-images.githubusercontent.com/63008958/204519931-bd711496-c4cf-453c-9159-21bd471abdf7.jpg").build());
+ majorRepository.save(Major.builder().name("US & International Law").profile("https://user-images.githubusercontent.com/63008958/204519949-fbc6196b-3b22-4893-a94c-6aaf43404db3.jpg").build());
+ majorRepository.save(Major.builder().name("상담심리학전공").profile("https://user-images.githubusercontent.com/63008958/204519961-dfcc4cb7-770d-414c-b503-62daf17cb348.jpg").build());
+ majorRepository.save(Major.builder().name("사회복지학전공").profile("https://user-images.githubusercontent.com/63008958/204519984-9bd89f56-8bd5-4643-9c23-92e86fc3c97e.jpg").build());
+ majorRepository.save(Major.builder().name("공연영상학전공").profile("https://user-images.githubusercontent.com/63008958/204520461-e38be0f3-c3d4-42e8-b791-d57a914d90bb.jpg").build());
+ majorRepository.save(Major.builder().name("언론정보학전공").profile("https://user-images.githubusercontent.com/63008958/204520001-123c3cda-ab11-4009-b139-ebb6d0b4b458.jpg").build());
+ majorRepository.save(Major.builder().name("글로벌한국학전공").profile("https://user-images.githubusercontent.com/63008958/204520021-dc82a562-fab3-438c-abb2-9e1d85b27415.jpg").build());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/server/hispath/config/OauthConfig.java b/src/main/java/com/server/hispath/config/OauthConfig.java
new file mode 100644
index 0000000..9f2300d
--- /dev/null
+++ b/src/main/java/com/server/hispath/config/OauthConfig.java
@@ -0,0 +1,28 @@
+package com.server.hispath.config;
+
+import java.util.Map;
+
+import com.server.hispath.auth.domain.OauthProperties;
+import com.server.hispath.auth.domain.OauthProvider;
+import com.server.hispath.auth.infrastructure.ApiRequester;
+import com.server.hispath.auth.infrastructure.OauthHandler;
+
+import org.springframework.boot.context.properties.EnableConfigurationProperties;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import lombok.RequiredArgsConstructor;
+
+@Configuration
+@RequiredArgsConstructor
+@EnableConfigurationProperties(OauthProperties.class)
+public class OauthConfig {
+
+ private final OauthProperties properties;
+
+ @Bean
+ public OauthHandler oauthHandler() {
+ Map providers = properties.getOauthProviders();
+ return new OauthHandler(providers, new ApiRequester());
+ }
+}
diff --git a/src/main/java/com/server/hispath/config/QuerydslConfig.java b/src/main/java/com/server/hispath/config/QuerydslConfig.java
new file mode 100644
index 0000000..53e7f44
--- /dev/null
+++ b/src/main/java/com/server/hispath/config/QuerydslConfig.java
@@ -0,0 +1,20 @@
+package com.server.hispath.config;
+
+import javax.persistence.EntityManager;
+import javax.persistence.PersistenceContext;
+
+import com.querydsl.jpa.impl.JPAQueryFactory;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+public class QuerydslConfig {
+ @PersistenceContext
+ private EntityManager entityManager;
+
+ @Bean
+ public JPAQueryFactory jpaQueryFactory(){
+ return new JPAQueryFactory(entityManager);
+ }
+}
diff --git a/src/main/java/com/server/hispath/config/SwaggerConfig.java b/src/main/java/com/server/hispath/config/SwaggerConfig.java
new file mode 100644
index 0000000..a34c3ae
--- /dev/null
+++ b/src/main/java/com/server/hispath/config/SwaggerConfig.java
@@ -0,0 +1,33 @@
+package com.server.hispath.config;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+
+@Configuration
+public class SwaggerConfig {
+ @Bean
+ public Docket api() {
+ return new Docket(DocumentationType.OAS_30)
+ .useDefaultResponseMessages(false)
+ .select()
+ .apis(RequestHandlerSelectors.any())
+ .paths(PathSelectors.ant("/api/**"))
+ .build()
+ .apiInfo(apiInfo());
+ }
+
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder()
+ .title("HisPath Swagger")
+ .description("HisPath")
+ .version("1.0")
+ .build();
+ }
+}
diff --git a/src/main/java/com/server/hispath/config/WebConfig.java b/src/main/java/com/server/hispath/config/WebConfig.java
new file mode 100644
index 0000000..f32ea09
--- /dev/null
+++ b/src/main/java/com/server/hispath/config/WebConfig.java
@@ -0,0 +1,41 @@
+package com.server.hispath.config;
+
+import java.util.List;
+
+import com.server.hispath.auth.presentation.LoginInterceptor;
+import com.server.hispath.auth.presentation.LoginManagerArgumentResolver;
+import com.server.hispath.auth.presentation.LoginStudentArgumentResolver;
+
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.method.support.HandlerMethodArgumentResolver;
+import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
+import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
+
+import lombok.RequiredArgsConstructor;
+
+@RequiredArgsConstructor
+@Configuration
+public class WebConfig implements WebMvcConfigurer {
+ private final LoginInterceptor loginInterceptor;
+ private final LoginStudentArgumentResolver loginStudentArgumentResolver;
+ private final LoginManagerArgumentResolver loginManagerArgumentResolver;
+
+ @Override
+ public void addCorsMappings(CorsRegistry registry) {
+ registry.addMapping("/**")
+ .allowedMethods("*")
+ .allowedOrigins("http://localhost:3000", "http://localhost:8080", "https://hispath.kro.kr", "https://hispath-manager.kro.kr", "https://hispath-server.kro.kr");
+ }
+
+ @Override
+ public void addInterceptors(InterceptorRegistry registry) {
+ registry.addInterceptor(loginInterceptor).addPathPatterns("/api/**");
+ }
+
+ @Override
+ public void addArgumentResolvers(List resolvers) {
+ resolvers.add(loginStudentArgumentResolver);
+ resolvers.add(loginManagerArgumentResolver);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/server/hispath/department/application/DepartmentService.java b/src/main/java/com/server/hispath/department/application/DepartmentService.java
new file mode 100644
index 0000000..5089cc3
--- /dev/null
+++ b/src/main/java/com/server/hispath/department/application/DepartmentService.java
@@ -0,0 +1,54 @@
+package com.server.hispath.department.application;
+
+import com.server.hispath.department.application.dto.DepartmentDto;
+import com.server.hispath.department.domain.Department;
+import com.server.hispath.department.domain.repository.DepartementRepository;
+import com.server.hispath.exception.student.StudentNotFoundException;
+import lombok.RequiredArgsConstructor;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class DepartmentService {
+ private final DepartementRepository departmentRepository;
+
+ @Transactional
+ public Long create(DepartmentDto dto){
+ Department savedDepartment = departmentRepository.save(Department.from(dto));
+ return savedDepartment.getId();
+ }
+
+ @Transactional
+ public DepartmentDto find(Long id) {
+ Department department = this.findById(id);
+ return DepartmentDto.from(department);
+ }
+
+ @Transactional
+ public List findAll() {
+ List department = departmentRepository.findAll();
+ return department.stream()
+ .map(DepartmentDto::from)
+ .collect(Collectors.toList());
+ }
+
+ @Transactional
+ public DepartmentDto update(Long id, DepartmentDto dto) {
+ Department department = departmentRepository.findById(id).orElseThrow(StudentNotFoundException::new);;
+ department.update(dto);
+ return DepartmentDto.from(department);
+ }
+
+ @Transactional
+ public void delete(Long id) {
+ departmentRepository.deleteById(id);
+ }
+
+ public Department findById(Long id) {
+ return departmentRepository.findById(id).orElseThrow(StudentNotFoundException::new);
+ }
+}
diff --git a/src/main/java/com/server/hispath/department/application/dto/DepartmentDto b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto
new file mode 100644
index 0000000..e69de29
diff --git a/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java
new file mode 100644
index 0000000..0307f01
--- /dev/null
+++ b/src/main/java/com/server/hispath/department/application/dto/DepartmentDto.java
@@ -0,0 +1,31 @@
+package com.server.hispath.department.application.dto;
+
+import com.server.hispath.department.domain.Department;
+import com.server.hispath.department.presentation.request.DepartmentCRRequest;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class DepartmentDto {
+ private Long id;
+ private String name;
+ private String profile;
+
+ public DepartmentDto(Long id, String name) {
+ this.id = id;
+ this.name = name;
+ }
+
+ public static DepartmentDto from (Department department) {
+ return new DepartmentDto(department.getId(), department.getName(), department.getProfile());
+ }
+
+ public static DepartmentDto from(DepartmentCRRequest request) {
+ return new DepartmentDto(request.getDepartmentId(), request.getName());
+ }
+}
diff --git a/src/main/java/com/server/hispath/department/domain/Department.java b/src/main/java/com/server/hispath/department/domain/Department.java
new file mode 100644
index 0000000..9eed012
--- /dev/null
+++ b/src/main/java/com/server/hispath/department/domain/Department.java
@@ -0,0 +1,45 @@
+package com.server.hispath.department.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+import com.server.hispath.common.BaseEntity;
+
+import com.server.hispath.department.application.dto.DepartmentDto;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+
+@Entity
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Where(clause = "deleted = false")
+@SQLDelete(sql = "UPDATE department SET deleted = true Where id = ?")
+public class Department extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ private String name;
+
+ private String profile;
+
+ public void update(DepartmentDto dto) {
+ this.name = dto.getName();
+ }
+
+ public static Department from(DepartmentDto dto) {
+ return Department.builder()
+ .name(dto.getName())
+ .build();
+ }
+}
+
diff --git a/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java b/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java
new file mode 100644
index 0000000..a44c17b
--- /dev/null
+++ b/src/main/java/com/server/hispath/department/domain/repository/DepartementRepository.java
@@ -0,0 +1,10 @@
+package com.server.hispath.department.domain.repository;
+
+import java.util.Optional;
+
+import com.server.hispath.department.domain.Department;
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface DepartementRepository extends JpaRepository {
+ Department findByName(String name);
+}
diff --git a/src/main/java/com/server/hispath/department/presentation/DepartmentController.java b/src/main/java/com/server/hispath/department/presentation/DepartmentController.java
new file mode 100644
index 0000000..6d49e92
--- /dev/null
+++ b/src/main/java/com/server/hispath/department/presentation/DepartmentController.java
@@ -0,0 +1,71 @@
+package com.server.hispath.department.presentation;
+
+import com.server.hispath.auth.domain.RequiredLogin;
+import com.server.hispath.auth.domain.RequiredManagerLogin;
+import com.server.hispath.department.application.DepartmentService;
+import com.server.hispath.department.application.dto.DepartmentDto;
+import com.server.hispath.department.presentation.request.DepartmentCRRequest;
+import com.server.hispath.department.presentation.response.DepartmentResponse;
+import com.server.hispath.docs.ApiDoc;
+import io.swagger.annotations.ApiOperation;
+import lombok.RequiredArgsConstructor;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api")
+public class DepartmentController {
+ private final DepartmentService departmentService;
+
+ @PostMapping("/department")
+ @ApiOperation(value = ApiDoc.DEPARTMENT_CREATE)
+ @RequiredManagerLogin
+ public ResponseEntity create(@RequestBody DepartmentCRRequest request) {
+
+ Long savedId = departmentService.create(DepartmentDto.from(request));
+ return ResponseEntity.ok(savedId);
+ }
+
+ @GetMapping("/department/{id}")
+ @ApiOperation(value = ApiDoc.DEPARTMENT_READ)
+ @RequiredLogin
+ public ResponseEntity find(@PathVariable Long id) {
+
+ DepartmentDto dto = departmentService.find(id);
+ DepartmentResponse response = DepartmentResponse.from(dto);
+ return ResponseEntity.ok(response);
+ }
+
+ @GetMapping("/departments")
+ @ApiOperation(value = ApiDoc.DEPARTMENT_READ_ALL)
+ @RequiredLogin
+ public ResponseEntity> findAll() {
+
+ List dtos = departmentService.findAll();
+ List responses = dtos.stream()
+ .map(DepartmentResponse::from)
+ .collect(Collectors.toList());
+ return ResponseEntity.ok(responses);
+ }
+
+ @PatchMapping("/department/{id}")
+ @ApiOperation(value = ApiDoc.DEPARTMENT_UPDATE)
+ @RequiredManagerLogin
+ public ResponseEntity update(@PathVariable Long id, @RequestBody DepartmentCRRequest request) {
+ DepartmentDto dto = departmentService.update(id, DepartmentDto.from(request));
+ DepartmentResponse response = DepartmentResponse.from(dto);
+ return ResponseEntity.ok(response);
+ }
+
+ @DeleteMapping("/department/{id}")
+ @ApiOperation(value = ApiDoc.DEPARTMENT_DELETE)
+ @RequiredManagerLogin
+ public ResponseEntity delete(@PathVariable Long id) {
+ departmentService.delete(id);
+ return ResponseEntity.ok(id);
+ }
+}
diff --git a/src/main/java/com/server/hispath/department/presentation/request/DepartmentCRRequest.java b/src/main/java/com/server/hispath/department/presentation/request/DepartmentCRRequest.java
new file mode 100644
index 0000000..5224c2b
--- /dev/null
+++ b/src/main/java/com/server/hispath/department/presentation/request/DepartmentCRRequest.java
@@ -0,0 +1,12 @@
+package com.server.hispath.department.presentation.request;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+public class DepartmentCRRequest {
+ private Long departmentId;
+ private String name;
+}
diff --git a/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java b/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java
new file mode 100644
index 0000000..7112792
--- /dev/null
+++ b/src/main/java/com/server/hispath/department/presentation/response/DepartmentResponse.java
@@ -0,0 +1,21 @@
+package com.server.hispath.department.presentation.response;
+
+import com.server.hispath.department.application.dto.DepartmentDto;
+import com.server.hispath.student.application.dto.StudentDto;
+import com.server.hispath.student.presentation.response.StudentResponse;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.Setter;
+
+@Getter
+@Setter
+@AllArgsConstructor
+public class DepartmentResponse {
+ private Long departmentId;
+ private String name;
+ private String profile;
+
+ public static DepartmentResponse from (DepartmentDto dto) {
+ return new DepartmentResponse(dto.getId(), dto.getName(), dto.getProfile());
+ }
+}
diff --git a/src/main/java/com/server/hispath/docs/ApiDoc.java b/src/main/java/com/server/hispath/docs/ApiDoc.java
new file mode 100644
index 0000000..593d473
--- /dev/null
+++ b/src/main/java/com/server/hispath/docs/ApiDoc.java
@@ -0,0 +1,115 @@
+package com.server.hispath.docs;
+
+public class ApiDoc {
+
+ /* Activity 관련 API 명세 */
+ public static final String ACTIVITY_CREATE = "단일 활동 생성";
+ public static final String ACTIVITY_READ = "단일 활동 조회";
+ public static final String ACTIVITY_READ_ALL = "모든 활동 조회";
+ public static final String ACTIVITY_UPDATE = "활동 수정";
+ public static final String ACTIVITY_DELETE = "학생 활동 삭제";
+ public static final String MILEAGE_CREATE = "단일 마일리지 활동 등록";
+ public static final String MILEAGES_CREATE = "단일 마일리지 다중 등록";
+ public static final String MILEAGE_UPDATE = "마일리지 활동 수정";
+ public static final String MILEAGE_DELETE = "마일리지 활동 삭제";
+ public static final String MILEAGE_READ_SEMESTER = "승인된 마일리지 활동 학기별 조회";
+ public static final String MILEAGE_READ_ALL = "모든 승인된 마일리지 활동 조회";
+ public static final String MILEAGE_REGISTER_STUDENTS = "마일리지 활동 참가 학생 엑셀 등록";
+ public static final String MILEAGE_REGISTER_STUDENT = "마일리지 활동 참가 학생 단일 등록";
+ public static final String ACTIVITY_STUDENT_DELETE = "마일리지 활동 학생 참가 정보 삭제";
+ public static final String MILEAGE_READ = "단일 마일리지 활동 조회";
+ public static final String STUDENT_MILEAGE_READ = "학생별 마일리지 활동 조회";
+ public static final String STUDENT_READ_SEMESTER = "학생별 활동 학기 조회";
+ public static final String STUDENT_ACTIVITY_CREATE = "학생의 개인 활동 생성";
+ public static final String STUDENT_ACTIVITY_UPDATE = "학생의 참여 활동 수정";
+ public static final String STUDENT_ACTIVITY_READ_SEMESTER = "학생의 참여 활동 학기별 조회";
+ public static final String STUDENT_ACTIVITY_READ_SEMESTER_SECTION_STATUS = "학생의 참여 활동 상태와 함께 학기별, 섹션별 조회";
+
+ public static final String STUDENT_ACTIVITY_READ_PARTICIPATE = "전체 활동 중 학생 참여 활동 조회";
+ public static final String SECTION_READ_ALL = "모든 섹션 조회";
+ public static final String PARTICIPANT_DELETE = "학생 참여 데이터 삭제";
+ public static final String ACTIVITY_APPLY = "학생 활동 마일리지 신청";
+ public static final String ACTIVITY_APPROVE = "학생 활동 마일리지 승인";
+ public static final String ACTIVITY_REJECT = "학생 활동 마일리지 반려";
+ public static final String MILEAGE_CATEGORY_CHART_DATAS = "카테고리 당 마일리지 참여, 평균 수 조회";
+ public static final String ACTIVITY_STUDENT_DETAIL = "학생 개인 활동 상세 조회";
+
+ /* Chart 관련 API 명세 */
+ public static final String CHART_MILEAGE_CATEGORY = "카테고리에 따른 학생 마일리지 활동 차트 데이터 조회";
+ public static final String CHART_MILEAGE_POPULARITY_CATEGORY = "카테고리에 따른 전체 활동 갯수와 나의 참여수, 평균 참여수 차트 데이터 조회";
+ public static final String CHART_MILEAGE_RANK = "내 마일리지 총점이 어느정도 위치하는지 차트 데이터 조회";
+ public static final String CHART_MILEAGE_TIMELINE = "마일리지 활동 Timeline 차트 데이터 조회";
+ public static final String CHART_SCHOLARSHIP_WEIGHT = "학생의 전체 가중치 분포 차트 데이터 조회";
+ public static final String CHART_ACTIVITY_CATEGORY = "카테고리 별 활동 갯수 분포 차트 데이터 조회";
+ public static final String CHART_STUDENT_ACTIVITY = "학생들의 전체 섹션 활동 분포 차트 데이터 조회";
+ public static final String CHART_SCHOLARSHIP_GRADE = "학년 별 마일리지 수혜 학생 분포 차트 데이터 조회";
+ public static final String CHART_SCHOLARSHIP_DEPARTMENT = "학부 별 마일리지 수혜 학생 분포 차트 데이터 조회";
+
+ /* Category 관련 API 명세 */
+ public static final String CATEGORY_READ = "단일 카테고리 조회";
+ public static final String CATEGORY_READ_ALL = "모든 카테고리 조회";
+ public static final String CATEGORY_CREATE = "카테고리 생성";
+ public static final String CATEGORY_UPDATE = "카테고리 수정";
+ public static final String CATEGORY_DELETE = "카테고리 삭제";
+
+ public static final String ACTIVITY_READ_SEMESTER = "활동 학기 조회";
+ public static final String MAJOR_CREATE = "전공 생성";
+ public static final String MAJOR_READ = "단일 전공 조회";
+ public static final String MAJOR_READ_ALL = "모든 전공 조회";
+ public static final String MAJOR_UPDATE = "전공 수정";
+ public static final String MAJOR_DELETE = "전공 삭제";
+
+ public static final String NOTICE_CREATE = "공지 생성";
+ public static final String NOTICE_READ_ALL = "전체 공지 조회";
+ public static final String NOTICE_READ_IMP = "강제 공지 조회";
+ public static final String NOTICE_READ = "단일 공지 조회";
+ public static final String NOTICE_DELETE = "공지 삭제";
+ public static final String NOTICE_UPDATE = "공지 수정";
+
+
+ /* Student 관련 API 명세 */
+ public static final String STUDENT_READ = "단일 학생 조회";
+ public static final String STUDENT_READ_ALL = "모든 학생 조회";
+ public static final String STUDENT_CREATE = "학생 추가";
+ public static final String STUDENTS_CREATE = "학생 단일 추가";
+ public static final String STUDENT_UPDATE = "학생 수정";
+ public static final String STUDENT_DELETE = "학생 삭제";
+ public static final String DASHBOARD = "메인페이지 대시보드 정보 조회";
+ public static final String STUDENT_SEMESTER = "학생의 활동 학기들 조회";
+
+ /* Manager 관련 API 명세 */
+ public static final String MANAGER_READ = "단일 관리자 조회";
+ public static final String MANAGER_READ_ALL = "모든 관리자 조회";
+ public static final String MANAGER_CREATE = "관리자 생성";
+ public static final String MANAGER_UPDATE = "관리자 수정";
+ public static final String MANAGER_PROFILE_UPDATE = "관리자 프로필 수정";
+ public static final String MANAGER_APPROVE = "관리자 승인";
+ public static final String MANAGER_DELETE = "관리자 삭제";
+ public static final String MANAGER_DASHBOARD = "관리자 대시보드 조회";
+ public static final String MANAGER_EMAIL = "접속한 관리자 이메일 조회";
+
+ /* Department 관련 API 명세 */
+ public static final String DEPARTMENT_READ = "단일 학부 조회";
+ public static final String DEPARTMENT_READ_ALL = "모든 학부 조회";
+ public static final String DEPARTMENT_CREATE = "학부 추가";
+ public static final String DEPARTMENT_UPDATE = "학부 수정";
+ public static final String DEPARTMENT_DELETE = "학부 삭제";
+
+
+ /* Resume 관련 API 명세 */
+ public static final String RESUME_READ = "학생의 단일 이력서 조회";
+ public static final String RESUME_READ_ALL = "학생의 모든 이력서 조회";
+ public static final String RESUME_CREATE = "단일 이력서 생성";
+ public static final String RESUME_UPDATE = "이력서 수정";
+ public static final String RESUME_DELETE = "이력서 삭제";
+ public static final String RESUME_INFO = "학생의 모든 정보 및 활동정보 조회";
+
+ /* Scholarship 관련 API 명세 */
+ public static final String SCHOLARSHIP_CREATE = "장학금 신청 등록";
+ public static final String SCHOLARSHIP_READ_ALL = "장학금 수혜자들 명단 조회";
+ public static final String SCHOLARSHIP_ACTIVITIES = "장학금 수혜자 정보와 그 활동들 조회";
+ public static final String APPROVE_SCHOLARSHIPS = "현학기 장학금 승인 명단 엑셀 업로드";
+ public static final String SCHOLARSHIP_SEARCH_STUDENT = "장학금 수혜 학생 필터 검색";
+
+
+}
diff --git a/src/main/java/com/server/hispath/exception/ExceptionResponse.java b/src/main/java/com/server/hispath/exception/ExceptionResponse.java
new file mode 100644
index 0000000..63709f8
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/ExceptionResponse.java
@@ -0,0 +1,12 @@
+package com.server.hispath.exception;
+
+import lombok.Getter;
+
+@Getter
+public class ExceptionResponse {
+ private final String message;
+
+ public ExceptionResponse(String message) {
+ this.message = message;
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java
new file mode 100644
index 0000000..fd7dc9d
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/GlobalExceptionHandler.java
@@ -0,0 +1,37 @@
+package com.server.hispath.exception;
+
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.ControllerAdvice;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+@ControllerAdvice
+public class GlobalExceptionHandler {
+
+ private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
+
+ @ExceptionHandler(HisPathException.class)
+ public ResponseEntity hisPathException(HisPathException e) {
+
+ if (e.getHttpStatus().is4xxClientError()) {
+ logger.info("Client Error : " + e.getMessage());
+ } else if (e.getHttpStatus().is5xxServerError()) {
+ logger.error("Server Error : " + e.getMessage());
+ }
+
+ return ResponseEntity.status(e.getHttpStatus())
+ .body(new ExceptionResponse(e.getMessage()));
+ }
+
+ @ExceptionHandler(Exception.class)
+ public ResponseEntity commonException(Exception e) {
+
+ logger.error("Unknown Exception : " + e.getMessage());
+
+ return ResponseEntity.status(HttpStatus.INTERNAL_SERVER_ERROR)
+ .body(new ExceptionResponse(e.getMessage()));
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/HisPathException.java b/src/main/java/com/server/hispath/exception/HisPathException.java
new file mode 100644
index 0000000..d6d9b39
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/HisPathException.java
@@ -0,0 +1,16 @@
+package com.server.hispath.exception;
+
+import org.springframework.http.HttpStatus;
+
+public class HisPathException extends RuntimeException{
+ private final HttpStatus httpStatus;
+
+ public HisPathException(String message, HttpStatus httpStatus){
+ super(message);
+ this.httpStatus = httpStatus;
+ }
+
+ public HttpStatus getHttpStatus() {
+ return httpStatus;
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/MyPathLoginException.java b/src/main/java/com/server/hispath/exception/MyPathLoginException.java
new file mode 100644
index 0000000..fe3096e
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/MyPathLoginException.java
@@ -0,0 +1,16 @@
+package com.server.hispath.exception;
+
+import org.springframework.http.HttpStatus;
+
+public class MyPathLoginException extends RuntimeException {
+ private final HttpStatus httpStatus;
+
+ public MyPathLoginException(String message, HttpStatus httpStatus) {
+ super(message);
+ this.httpStatus = httpStatus;
+ }
+
+ public HttpStatus getHttpStatus() {
+ return httpStatus;
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/activity/ActivityApplyException.java b/src/main/java/com/server/hispath/exception/activity/ActivityApplyException.java
new file mode 100644
index 0000000..68fdd6f
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/activity/ActivityApplyException.java
@@ -0,0 +1,12 @@
+package com.server.hispath.exception.activity;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class ActivityApplyException extends ActivityException {
+ public ActivityApplyException() {
+ super("이미 처리된 활동은 다시 신청할 수 없습니다.", HttpStatus.BAD_REQUEST);
+ }
+}
+
diff --git a/src/main/java/com/server/hispath/exception/activity/ActivityException.java b/src/main/java/com/server/hispath/exception/activity/ActivityException.java
new file mode 100644
index 0000000..e5e13be
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/activity/ActivityException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.activity;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class ActivityException extends HisPathException {
+ protected ActivityException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/activity/ActivityNotFoundException.java b/src/main/java/com/server/hispath/exception/activity/ActivityNotFoundException.java
new file mode 100644
index 0000000..0ca6077
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/activity/ActivityNotFoundException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.activity;
+
+import org.springframework.http.HttpStatus;
+
+public class ActivityNotFoundException extends ActivityException {
+ public ActivityNotFoundException() {
+ super("존재하지 않는 활동입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/activity/ParticipantDuplicateException.java b/src/main/java/com/server/hispath/exception/activity/ParticipantDuplicateException.java
new file mode 100644
index 0000000..ba7a982
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/activity/ParticipantDuplicateException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.activity;
+
+import org.springframework.http.HttpStatus;
+
+public class ParticipantDuplicateException extends ActivityException {
+ public ParticipantDuplicateException(String studentNum, String name) {
+ super("이미 존재하는 참여자입니다.\n" + "학번: " + studentNum + " 이름: " + name, HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/activity/ParticipantNotFoundException.java b/src/main/java/com/server/hispath/exception/activity/ParticipantNotFoundException.java
new file mode 100644
index 0000000..e18dc92
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/activity/ParticipantNotFoundException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.activity;
+
+import org.springframework.http.HttpStatus;
+
+public class ParticipantNotFoundException extends ActivityException {
+ public ParticipantNotFoundException() {
+ super("존재하지 않는 참여자 정보입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/authorization/AuthorizationException.java b/src/main/java/com/server/hispath/exception/authorization/AuthorizationException.java
new file mode 100644
index 0000000..abf4062
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/authorization/AuthorizationException.java
@@ -0,0 +1,12 @@
+package com.server.hispath.exception.authorization;
+
+import com.server.hispath.exception.MyPathLoginException;
+
+import org.springframework.http.HttpStatus;
+
+public abstract class AuthorizationException extends MyPathLoginException {
+
+ protected AuthorizationException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/authorization/AuthorizationHeaderException.java b/src/main/java/com/server/hispath/exception/authorization/AuthorizationHeaderException.java
new file mode 100644
index 0000000..8bd90d4
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/authorization/AuthorizationHeaderException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.authorization;
+
+import org.springframework.http.HttpStatus;
+
+public class AuthorizationHeaderException extends AuthorizationException {
+ public AuthorizationHeaderException() {
+ super("로그인이 필요한 서비스입니다.", HttpStatus.UNAUTHORIZED);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/authorization/InvalidTokenException.java b/src/main/java/com/server/hispath/exception/authorization/InvalidTokenException.java
new file mode 100644
index 0000000..c2d5702
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/authorization/InvalidTokenException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.authorization;
+
+import org.springframework.http.HttpStatus;
+
+public class InvalidTokenException extends AuthorizationException {
+ public InvalidTokenException() {
+ super("로그인이 필요한 서비스입니다.", HttpStatus.UNAUTHORIZED);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/category/CategoryException.java b/src/main/java/com/server/hispath/exception/category/CategoryException.java
new file mode 100644
index 0000000..be6e934
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/category/CategoryException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.category;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class CategoryException extends HisPathException {
+ protected CategoryException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/category/CategoryNotFoundException.java b/src/main/java/com/server/hispath/exception/category/CategoryNotFoundException.java
new file mode 100644
index 0000000..9512ca1
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/category/CategoryNotFoundException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.category;
+
+import org.springframework.http.HttpStatus;
+
+public class CategoryNotFoundException extends CategoryException {
+ public CategoryNotFoundException() {
+ super("존재하지 않는 카테고리입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/common/CommonException.java b/src/main/java/com/server/hispath/exception/common/CommonException.java
new file mode 100644
index 0000000..b295bb3
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/common/CommonException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.common;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class CommonException extends HisPathException {
+ public CommonException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/common/ExcelDataFormatException.java b/src/main/java/com/server/hispath/exception/common/ExcelDataFormatException.java
new file mode 100644
index 0000000..730d0bd
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/common/ExcelDataFormatException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.common;
+
+import org.springframework.http.HttpStatus;
+
+public class ExcelDataFormatException extends CommonException{
+ public ExcelDataFormatException(String data) {
+ super("등록하려는 데이터의 양식에 문제가 있습니다.\n 문제되는 데이터 : " + data, HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/common/ExcelFormatException.java b/src/main/java/com/server/hispath/exception/common/ExcelFormatException.java
new file mode 100644
index 0000000..02cd485
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/common/ExcelFormatException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.common;
+
+import org.springframework.http.HttpStatus;
+
+public class ExcelFormatException extends CommonException{
+ public ExcelFormatException(String msg) {
+ super("등록하려는 데이터의 양식에 문제가 있습니다. : " + msg, HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/common/NotExcelExtensionException.java b/src/main/java/com/server/hispath/exception/common/NotExcelExtensionException.java
new file mode 100644
index 0000000..4366c32
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/common/NotExcelExtensionException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.common;
+
+import org.springframework.http.HttpStatus;
+
+public class NotExcelExtensionException extends CommonException{
+ public NotExcelExtensionException() {
+ super("Excel양식의 파일이 아닙니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/major/MajorException.java b/src/main/java/com/server/hispath/exception/major/MajorException.java
new file mode 100644
index 0000000..30eaee0
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/major/MajorException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.major;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class MajorException extends HisPathException {
+ protected MajorException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/major/MajorNotFoundException.java b/src/main/java/com/server/hispath/exception/major/MajorNotFoundException.java
new file mode 100644
index 0000000..ea6b9fd
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/major/MajorNotFoundException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.major;
+
+import org.springframework.http.HttpStatus;
+
+public class MajorNotFoundException extends MajorException {
+ public MajorNotFoundException() {
+ super("존재하지 않는 전공입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/manager/ManagerException.java b/src/main/java/com/server/hispath/exception/manager/ManagerException.java
new file mode 100644
index 0000000..e994378
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/manager/ManagerException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.manager;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class ManagerException extends HisPathException {
+ protected ManagerException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/manager/ManagerNoAuthorizationException.java b/src/main/java/com/server/hispath/exception/manager/ManagerNoAuthorizationException.java
new file mode 100644
index 0000000..96d20ee
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/manager/ManagerNoAuthorizationException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.manager;
+
+import org.springframework.http.HttpStatus;
+
+public class ManagerNoAuthorizationException extends ManagerException {
+ public ManagerNoAuthorizationException() {
+ super("사용 권한이 없습니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/manager/ManagerNotFoundException.java b/src/main/java/com/server/hispath/exception/manager/ManagerNotFoundException.java
new file mode 100644
index 0000000..20d1ec2
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/manager/ManagerNotFoundException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.manager;
+
+import org.springframework.http.HttpStatus;
+
+public class ManagerNotFoundException extends ManagerException {
+ public ManagerNotFoundException() {
+ super("존재하지 않는 관리자입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/notice/NoticeException.java b/src/main/java/com/server/hispath/exception/notice/NoticeException.java
new file mode 100644
index 0000000..f12dad1
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/notice/NoticeException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.notice;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class NoticeException extends HisPathException {
+ protected NoticeException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/notice/NoticeNotFoundException.java b/src/main/java/com/server/hispath/exception/notice/NoticeNotFoundException.java
new file mode 100644
index 0000000..7c8b991
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/notice/NoticeNotFoundException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.notice;
+
+import org.springframework.http.HttpStatus;
+
+public class NoticeNotFoundException extends NoticeException {
+ public NoticeNotFoundException() {
+ super("존재하지 않는 공지입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/oauth/GetAccessTokenException.java b/src/main/java/com/server/hispath/exception/oauth/GetAccessTokenException.java
new file mode 100644
index 0000000..8d46e21
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/oauth/GetAccessTokenException.java
@@ -0,0 +1,10 @@
+package com.server.hispath.exception.oauth;
+
+import org.springframework.http.HttpStatus;
+
+public class GetAccessTokenException extends OauthException {
+
+ public GetAccessTokenException() {
+ super("소셜 로그인에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/oauth/GetUserInfoException.java b/src/main/java/com/server/hispath/exception/oauth/GetUserInfoException.java
new file mode 100644
index 0000000..b95d708
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/oauth/GetUserInfoException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.oauth;
+
+import org.springframework.http.HttpStatus;
+
+public class GetUserInfoException extends OauthException {
+ public GetUserInfoException() {
+ super("소셜 로그인에 실패했습니다.", HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/oauth/InvalidTokenException.java b/src/main/java/com/server/hispath/exception/oauth/InvalidTokenException.java
new file mode 100644
index 0000000..2c1093c
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/oauth/InvalidTokenException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.oauth;
+
+import org.springframework.http.HttpStatus;
+
+public class InvalidTokenException extends OauthException {
+ public InvalidTokenException() {
+ super("유효하지 않은 토큰입니다.", HttpStatus.UNAUTHORIZED);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/oauth/NoSuchOAuthMemberException.java b/src/main/java/com/server/hispath/exception/oauth/NoSuchOAuthMemberException.java
new file mode 100644
index 0000000..3ed0cf1
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/oauth/NoSuchOAuthMemberException.java
@@ -0,0 +1,16 @@
+package com.server.hispath.exception.oauth;
+
+import org.springframework.http.HttpStatus;
+
+import lombok.Getter;
+
+@Getter
+public class NoSuchOAuthMemberException extends OauthException {
+
+ private final String email;
+
+ public NoSuchOAuthMemberException(String email) {
+ super("소셜 로그인 회원이 아닙니다. 회원가입을 진행합니다.", HttpStatus.UNAUTHORIZED);
+ this.email = email;
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/oauth/NotHandongEmailException.java b/src/main/java/com/server/hispath/exception/oauth/NotHandongEmailException.java
new file mode 100644
index 0000000..f893087
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/oauth/NotHandongEmailException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.oauth;
+
+import org.springframework.http.HttpStatus;
+
+public class NotHandongEmailException extends OauthException {
+ public NotHandongEmailException() {
+ super("한동대학교 메일이 아닙니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/oauth/OAuthLoginFailErrorResponse.java b/src/main/java/com/server/hispath/exception/oauth/OAuthLoginFailErrorResponse.java
new file mode 100644
index 0000000..106b945
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/oauth/OAuthLoginFailErrorResponse.java
@@ -0,0 +1,19 @@
+package com.server.hispath.exception.oauth;
+
+import com.server.hispath.exception.ExceptionResponse;
+
+import lombok.Getter;
+
+@Getter
+public class OAuthLoginFailErrorResponse extends ExceptionResponse {
+ private final String email;
+
+ private OAuthLoginFailErrorResponse(String message, String email) {
+ super(message);
+ this.email = email;
+ }
+
+ public static OAuthLoginFailErrorResponse from(NoSuchOAuthMemberException exception) {
+ return new OAuthLoginFailErrorResponse(exception.getMessage(), exception.getEmail());
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/oauth/OauthException.java b/src/main/java/com/server/hispath/exception/oauth/OauthException.java
new file mode 100644
index 0000000..ef3b66e
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/oauth/OauthException.java
@@ -0,0 +1,12 @@
+package com.server.hispath.exception.oauth;
+
+import com.server.hispath.exception.MyPathLoginException;
+
+import org.springframework.http.HttpStatus;
+
+public abstract class OauthException extends MyPathLoginException {
+
+ protected OauthException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/oauth/UnableToGetOauthResponseException.java b/src/main/java/com/server/hispath/exception/oauth/UnableToGetOauthResponseException.java
new file mode 100644
index 0000000..aed4135
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/oauth/UnableToGetOauthResponseException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.oauth;
+
+import org.springframework.http.HttpStatus;
+
+public class UnableToGetOauthResponseException extends OauthException {
+ public UnableToGetOauthResponseException(String message) {
+ super(message, HttpStatus.INTERNAL_SERVER_ERROR);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/oauth/UnsupportedOauthProviderException.java b/src/main/java/com/server/hispath/exception/oauth/UnsupportedOauthProviderException.java
new file mode 100644
index 0000000..3c81df2
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/oauth/UnsupportedOauthProviderException.java
@@ -0,0 +1,10 @@
+package com.server.hispath.exception.oauth;
+
+import org.springframework.http.HttpStatus;
+
+public class UnsupportedOauthProviderException extends OauthException {
+
+ public UnsupportedOauthProviderException() {
+ super("지원되지 않는 소셜로그인입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/resume/ResumeException.java b/src/main/java/com/server/hispath/exception/resume/ResumeException.java
new file mode 100644
index 0000000..61ed34d
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/resume/ResumeException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.resume;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class ResumeException extends HisPathException {
+ protected ResumeException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/resume/ResumeNotFoundException.java b/src/main/java/com/server/hispath/exception/resume/ResumeNotFoundException.java
new file mode 100644
index 0000000..d64c412
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/resume/ResumeNotFoundException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.resume;
+
+import org.springframework.http.HttpStatus;
+
+public class ResumeNotFoundException extends ResumeException {
+ public ResumeNotFoundException() {
+ super("존재하지 않는 이력서입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/scholarship/ScholarshipDuplicateException.java b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipDuplicateException.java
new file mode 100644
index 0000000..bfccd1d
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipDuplicateException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.scholarship;
+
+import org.springframework.http.HttpStatus;
+
+public class ScholarshipDuplicateException extends ScholarshipException {
+ public ScholarshipDuplicateException() {
+ super("중복되는 학생의 정보가 존재합니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/scholarship/ScholarshipException.java b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipException.java
new file mode 100644
index 0000000..711f3e2
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.scholarship;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class ScholarshipException extends HisPathException {
+ protected ScholarshipException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotFoundException.java b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotFoundException.java
new file mode 100644
index 0000000..9ad2a11
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotFoundException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.scholarship;
+
+import com.server.hispath.exception.resume.ResumeException;
+
+import org.springframework.http.HttpStatus;
+
+public class ScholarshipNotFoundException extends ScholarshipException {
+ public ScholarshipNotFoundException() {
+ super("존재하지 않는 장학금 수혜 내역입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotMatchException.java b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotMatchException.java
new file mode 100644
index 0000000..0cd8181
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/scholarship/ScholarshipNotMatchException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.scholarship;
+
+import org.springframework.http.HttpStatus;
+
+public class ScholarshipNotMatchException extends ScholarshipException {
+ public ScholarshipNotMatchException(String msg) {
+ super("입력 맞지 않는 내역입니다.\n" + msg, HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/student/SectionNotExistException.java b/src/main/java/com/server/hispath/exception/student/SectionNotExistException.java
new file mode 100644
index 0000000..203ff9d
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/student/SectionNotExistException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.student;
+
+import org.springframework.http.HttpStatus;
+
+public class SectionNotExistException extends StudentException{
+ public SectionNotExistException() {
+ super("존재하지 않는 섹션입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/student/StudentDataNotMatchException.java b/src/main/java/com/server/hispath/exception/student/StudentDataNotMatchException.java
new file mode 100644
index 0000000..879cd2c
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/student/StudentDataNotMatchException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.student;
+
+import org.springframework.http.HttpStatus;
+
+public class StudentDataNotMatchException extends StudentException {
+ public StudentDataNotMatchException(String studentNum, String name) {
+ super("정보가 일치하지 않습니다.\n 학번 : " + studentNum + "\n 이름 : " + name, HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/student/StudentException.java b/src/main/java/com/server/hispath/exception/student/StudentException.java
new file mode 100644
index 0000000..1e96c76
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/student/StudentException.java
@@ -0,0 +1,11 @@
+package com.server.hispath.exception.student;
+
+import com.server.hispath.exception.HisPathException;
+
+import org.springframework.http.HttpStatus;
+
+public class StudentException extends HisPathException {
+ protected StudentException(String message, HttpStatus httpStatus) {
+ super(message, httpStatus);
+ }
+}
diff --git a/src/main/java/com/server/hispath/exception/student/StudentNotFoundException.java b/src/main/java/com/server/hispath/exception/student/StudentNotFoundException.java
new file mode 100644
index 0000000..f2de707
--- /dev/null
+++ b/src/main/java/com/server/hispath/exception/student/StudentNotFoundException.java
@@ -0,0 +1,9 @@
+package com.server.hispath.exception.student;
+
+import org.springframework.http.HttpStatus;
+
+public class StudentNotFoundException extends StudentException{
+ public StudentNotFoundException() {
+ super("존재하지 않는 학생입니다.", HttpStatus.BAD_REQUEST);
+ }
+}
diff --git a/src/main/java/com/server/hispath/filters/LoggingFilter.java b/src/main/java/com/server/hispath/filters/LoggingFilter.java
new file mode 100644
index 0000000..002ca00
--- /dev/null
+++ b/src/main/java/com/server/hispath/filters/LoggingFilter.java
@@ -0,0 +1,133 @@
+package com.server.hispath.filters;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Objects;
+import java.util.UUID;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.http.HttpMethod;
+import org.springframework.http.MediaType;
+import org.springframework.stereotype.Component;
+import org.springframework.util.StreamUtils;
+import org.springframework.web.filter.OncePerRequestFilter;
+import org.springframework.web.util.ContentCachingResponseWrapper;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.MDC;
+
+@Component
+public class LoggingFilter extends OncePerRequestFilter {
+ protected static final Logger log = LoggerFactory.getLogger(LoggingFilter.class);
+
+ @Override
+ public void doFilterInternal(
+ HttpServletRequest request,
+ HttpServletResponse response,
+ FilterChain filterChain
+ ) throws ServletException, IOException {
+
+ MDC.put("traceId", UUID.randomUUID().toString());
+ if(isFileUpload(request)){
+ filterChain.doFilter(request,response);
+ MDC.clear();
+ return;
+ }
+ doFilterWrapped(new RequestWrapper(request), new ResponseWrapper(response), filterChain);
+ MDC.clear();
+ }
+
+ public void doFilterWrapped(
+ RequestWrapper request,
+ ContentCachingResponseWrapper response,
+ FilterChain filterChain
+ ) throws ServletException, IOException {
+
+ try {
+ logRequest(request);
+ filterChain.doFilter(request, response);
+ } finally {
+ logResponse(response);
+ response.copyBodyToResponse();
+ }
+ }
+
+ private static void logRequest(RequestWrapper request) throws IOException {
+ String queryString = request.getQueryString();
+ String requestURI = request.getRequestURI();
+ if (!Objects.isNull(queryString)) {
+ requestURI += queryString;
+ }
+ log.info("Request : {} uri=[{}] content-type=[{}]",
+ request.getMethod(),
+ requestURI,
+ request.getContentType()
+ );
+
+ logPayload("Request", request.getContentType(), request.getInputStream());
+ }
+
+ private static void logResponse(ContentCachingResponseWrapper response) throws IOException {
+ logPayload("Response", response.getContentType(), response.getContentInputStream());
+ }
+
+ private static void logPayload(String prefix, String contentType, InputStream inputStream) throws IOException {
+ if (Objects.isNull(contentType)) {
+ contentType = "application/json";
+ }
+ boolean visible = isVisible(MediaType.valueOf(contentType));
+ if (visible) {
+ logContentPayload(prefix, inputStream);
+ return;
+ }
+ log.info("{} Payload: Binary Content", prefix);
+ }
+
+ private static void logContentPayload(String prefix, InputStream inputStream) throws IOException {
+ byte[] content = StreamUtils.copyToByteArray(inputStream);
+ if (content.length > 0) {
+ String contentString = new String(content);
+ log.info("{} Payload: {}", prefix, contentString);
+ }
+ }
+
+ private static boolean isVisible(MediaType mediaType) {
+ final List VISIBLE_TYPES = Arrays.asList(
+ MediaType.valueOf("text/*"),
+ MediaType.APPLICATION_FORM_URLENCODED,
+ MediaType.APPLICATION_JSON,
+ MediaType.APPLICATION_XML,
+ MediaType.valueOf("application/*+json"),
+ MediaType.valueOf("application/*+xml"),
+ MediaType.MULTIPART_FORM_DATA
+ );
+
+ return VISIBLE_TYPES.stream()
+ .anyMatch(visibleType -> visibleType.includes(mediaType));
+ }
+
+
+ private boolean isFileUpload(HttpServletRequest request){
+ if(Objects.equals("POST", request.getMethod())){
+ if(Objects.equals("/api/mileages",request.getRequestURI())){
+ return true;
+ }
+ if(Objects.equals("/api/students",request.getRequestURI())){
+ return true;
+ }
+ if(Objects.equals("/api/mileage/students",request.getRequestURI())){
+ return true;
+ }
+ }
+ if(Objects.equals("PUT", request.getMethod()) && Objects.equals("/api/scholarship/approval", request.getRequestURI())){
+ return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/server/hispath/filters/RequestWrapper.java b/src/main/java/com/server/hispath/filters/RequestWrapper.java
new file mode 100644
index 0000000..339490b
--- /dev/null
+++ b/src/main/java/com/server/hispath/filters/RequestWrapper.java
@@ -0,0 +1,54 @@
+package com.server.hispath.filters;
+
+import java.io.ByteArrayInputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import javax.servlet.ReadListener;
+import javax.servlet.ServletInputStream;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.springframework.util.StreamUtils;
+
+public class RequestWrapper extends HttpServletRequestWrapper {
+
+ private byte[] cachedInputStream;
+
+ public RequestWrapper(HttpServletRequest request) throws IOException {
+ super(request);
+ InputStream requestInputStream = request.getInputStream();
+ this.cachedInputStream = StreamUtils.copyToByteArray(requestInputStream);
+ }
+
+ @Override
+ public ServletInputStream getInputStream() {
+ return new ServletInputStream() {
+ private InputStream cachedBodyInputStream = new ByteArrayInputStream(cachedInputStream);
+
+ @Override
+ public boolean isFinished() {
+ try {
+ return cachedBodyInputStream.available() == 0;
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ return false;
+ }
+
+ @Override
+ public boolean isReady() {
+ return true;
+ }
+
+ @Override
+ public void setReadListener(ReadListener readListener) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public int read() throws IOException {
+ return cachedBodyInputStream.read();
+ }
+ };
+ }
+}
diff --git a/src/main/java/com/server/hispath/filters/ResponseWrapper.java b/src/main/java/com/server/hispath/filters/ResponseWrapper.java
new file mode 100644
index 0000000..0c88e01
--- /dev/null
+++ b/src/main/java/com/server/hispath/filters/ResponseWrapper.java
@@ -0,0 +1,11 @@
+package com.server.hispath.filters;
+
+import javax.servlet.http.HttpServletResponse;
+
+import org.springframework.web.util.ContentCachingResponseWrapper;
+
+public class ResponseWrapper extends ContentCachingResponseWrapper {
+ public ResponseWrapper(HttpServletResponse response) {
+ super(response);
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/server/hispath/major/application/MajorService.java b/src/main/java/com/server/hispath/major/application/MajorService.java
new file mode 100644
index 0000000..a70e18a
--- /dev/null
+++ b/src/main/java/com/server/hispath/major/application/MajorService.java
@@ -0,0 +1,61 @@
+package com.server.hispath.major.application;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.server.hispath.exception.major.MajorNotFoundException;
+import com.server.hispath.major.application.dto.MajorContentDto;
+import com.server.hispath.major.application.dto.MajorDto;
+import com.server.hispath.major.domain.Major;
+import com.server.hispath.major.domain.repository.MajorRepository;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import lombok.RequiredArgsConstructor;
+
+
+@Service
+@RequiredArgsConstructor
+public class MajorService {
+
+ private final MajorRepository majorRepository;
+
+ @Transactional
+ public Long create(MajorContentDto dto) {
+ Major major = Major.from(dto);
+ Major savedMajor = majorRepository.save(major);
+ return savedMajor.getId();
+ }
+
+ @Transactional
+ public MajorDto find(Long id) {
+ Major major = this.findById(id);
+ return MajorDto.from(major);
+ }
+
+ @Transactional
+ public MajorDto update(Long id, MajorContentDto dto) {
+ Major major = this.findById(id);
+ major.update(dto);
+
+ return MajorDto.from(major);
+ }
+
+ @Transactional
+ public void delete(Long id) {
+ majorRepository.deleteById(id);
+ }
+
+ public Major findById(Long id) {
+ return majorRepository.findById(id).orElseThrow(MajorNotFoundException::new);
+ }
+
+ @Transactional(readOnly = true)
+ public List findAll() {
+ return majorRepository.findAll()
+ .stream()
+ .map(MajorDto::from)
+ .collect(Collectors.toList());
+ }
+}
diff --git a/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java b/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java
new file mode 100644
index 0000000..03c4008
--- /dev/null
+++ b/src/main/java/com/server/hispath/major/application/dto/MajorContentDto.java
@@ -0,0 +1,20 @@
+package com.server.hispath.major.application.dto;
+
+import com.server.hispath.major.presentation.request.MajorCURequest;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class MajorContentDto {
+
+ private String majorName;
+
+ public static MajorContentDto from(MajorCURequest request) {
+ return new MajorContentDto(request.getMajorName());
+ }
+}
diff --git a/src/main/java/com/server/hispath/major/application/dto/MajorDto.java b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java
new file mode 100644
index 0000000..6e95742
--- /dev/null
+++ b/src/main/java/com/server/hispath/major/application/dto/MajorDto.java
@@ -0,0 +1,18 @@
+package com.server.hispath.major.application.dto;
+
+import com.server.hispath.major.domain.Major;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class MajorDto {
+ private Long id;
+ private String name;
+ private String profile;
+ public static MajorDto from(Major major) {
+ return new MajorDto(major.getId(), major.getName(), major.getProfile());
+ }
+}
\ No newline at end of file
diff --git a/src/main/java/com/server/hispath/major/domain/Major.java b/src/main/java/com/server/hispath/major/domain/Major.java
new file mode 100644
index 0000000..44afc87
--- /dev/null
+++ b/src/main/java/com/server/hispath/major/domain/Major.java
@@ -0,0 +1,48 @@
+package com.server.hispath.major.domain;
+
+import javax.persistence.*;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.server.hispath.common.BaseEntity;
+
+
+import com.server.hispath.major.application.dto.MajorContentDto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+
+import java.time.LocalDate;
+
+@Entity
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Where(clause = "deleted = false")
+@SQLDelete(sql = "UPDATE major SET deleted = true Where id = ?")
+public class Major extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private String name;
+ private String profile;
+
+ public static Major from(MajorContentDto dto){
+ return Major.builder()
+ .name(dto.getMajorName())
+ .build();
+ }
+
+ public void update(MajorContentDto dto){
+ this.name = dto.getMajorName();
+ }
+
+
+
+
+}
diff --git a/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java b/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java
new file mode 100644
index 0000000..1cd245b
--- /dev/null
+++ b/src/main/java/com/server/hispath/major/domain/repository/MajorRepository.java
@@ -0,0 +1,12 @@
+package com.server.hispath.major.domain.repository;
+
+import java.util.Optional;
+
+import com.server.hispath.major.domain.Major;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface MajorRepository extends JpaRepository {
+
+ Major findByName(String name);
+}
diff --git a/src/main/java/com/server/hispath/major/presentation/MajorController.java b/src/main/java/com/server/hispath/major/presentation/MajorController.java
new file mode 100644
index 0000000..0fcca8e
--- /dev/null
+++ b/src/main/java/com/server/hispath/major/presentation/MajorController.java
@@ -0,0 +1,74 @@
+package com.server.hispath.major.presentation;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.server.hispath.auth.domain.RequiredLogin;
+import com.server.hispath.auth.domain.RequiredManagerLogin;
+import com.server.hispath.docs.ApiDoc;
+import com.server.hispath.major.application.MajorService;
+import com.server.hispath.major.application.dto.MajorContentDto;
+import com.server.hispath.major.application.dto.MajorDto;
+import com.server.hispath.major.presentation.request.MajorCURequest;
+import com.server.hispath.major.presentation.response.MajorResponse;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import io.swagger.annotations.ApiOperation;
+
+import lombok.RequiredArgsConstructor;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api")
+public class MajorController {
+
+ private final MajorService majorService;
+
+ @PostMapping("/major")
+ @ApiOperation(value = ApiDoc.MAJOR_CREATE)
+ @RequiredManagerLogin
+ public ResponseEntity create(@RequestBody MajorCURequest request) {
+ Long id = majorService.create(MajorContentDto.from(request));
+ return ResponseEntity.ok(id);
+ }
+
+
+ @GetMapping("/major/{id}")
+ @ApiOperation(value = ApiDoc.MAJOR_READ)
+ @RequiredLogin
+ public ResponseEntity find(@PathVariable Long id) {
+ MajorResponse response = MajorResponse.from(majorService.find(id));
+ return ResponseEntity.ok(response);
+ }
+
+ @PatchMapping("/major/{id}")
+ @ApiOperation(value = ApiDoc.MAJOR_UPDATE)
+ @RequiredManagerLogin
+ public ResponseEntity update(@PathVariable Long id, @RequestBody MajorCURequest request) {
+ MajorDto dto = majorService.update(id, MajorContentDto.from(request));
+ MajorResponse response = MajorResponse.from(dto);
+ return ResponseEntity.ok(response);
+ }
+
+ @DeleteMapping("/major/{id}")
+ @ApiOperation(value = ApiDoc.MAJOR_DELETE)
+ @RequiredManagerLogin
+ public ResponseEntity delete(@PathVariable Long id) {
+ majorService.delete(id);
+ return ResponseEntity.ok(id);
+ }
+
+ @GetMapping("/majors")
+ @ApiOperation(value = ApiDoc.MAJOR_READ_ALL)
+ @RequiredLogin
+ public ResponseEntity> findAll() {
+ List responses = majorService.findAll()
+ .stream()
+ .map(MajorResponse::from)
+ .collect(Collectors.toList());
+ return ResponseEntity.ok(responses);
+ }
+
+}
diff --git a/src/main/java/com/server/hispath/major/presentation/request/MajorCURequest.java b/src/main/java/com/server/hispath/major/presentation/request/MajorCURequest.java
new file mode 100644
index 0000000..b275101
--- /dev/null
+++ b/src/main/java/com/server/hispath/major/presentation/request/MajorCURequest.java
@@ -0,0 +1,12 @@
+package com.server.hispath.major.presentation.request;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+public class MajorCURequest {
+ private String majorName;
+}
diff --git a/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java b/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java
new file mode 100644
index 0000000..514dbda
--- /dev/null
+++ b/src/main/java/com/server/hispath/major/presentation/response/MajorResponse.java
@@ -0,0 +1,20 @@
+package com.server.hispath.major.presentation.response;
+
+
+import com.server.hispath.major.application.dto.MajorDto;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class MajorResponse {
+ private Long id;
+ private String name;
+ private String profile;
+
+ public static MajorResponse from(MajorDto dto) {
+ return new MajorResponse(dto.getId(), dto.getName(), dto.getProfile());
+ }
+}
diff --git a/src/main/java/com/server/hispath/manager/application/ManagerService.java b/src/main/java/com/server/hispath/manager/application/ManagerService.java
new file mode 100644
index 0000000..089259f
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/application/ManagerService.java
@@ -0,0 +1,97 @@
+package com.server.hispath.manager.application;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.server.hispath.exception.manager.ManagerNotFoundException;
+import com.server.hispath.manager.application.dto.ManagerCUDto;
+import com.server.hispath.manager.application.dto.ManagerDashboardDto;
+import com.server.hispath.manager.application.dto.ManagerDto;
+import com.server.hispath.manager.application.dto.ManagerUpdateDto;
+import com.server.hispath.manager.domain.DailyInfo;
+import com.server.hispath.manager.domain.Manager;
+import com.server.hispath.manager.domain.repository.DailyInfoRepository;
+import com.server.hispath.manager.domain.repository.ManagerRepository;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor
+public class ManagerService {
+
+ private final ManagerRepository managerRepository;
+ private final DailyInfoRepository dailyInfoRepository;
+
+ @Transactional
+ public Long create(ManagerCUDto dto) {
+ Manager savedManager = managerRepository.save(Manager.of(dto));
+ return savedManager.getId();
+ }
+
+ @Transactional(readOnly = true)
+ public ManagerDto findManager(Long id) {
+ return ManagerDto.of(this.findById(id));
+ }
+
+ @Transactional(readOnly = true)
+ public List findManagers() {
+ return managerRepository.findAll()
+ .stream()
+ .map(ManagerDto::of)
+ .collect(Collectors.toList());
+ }
+
+ @Transactional
+ public ManagerDto update(Long id, ManagerCUDto dto) {
+ Manager manager = this.findById(id);
+ manager.update(dto);
+ return ManagerDto.of(manager);
+ }
+
+ @Transactional
+ public ManagerDto update(Long id, ManagerUpdateDto dto){
+ Manager manager = this.findById(id);
+ manager.update(dto);
+ return ManagerDto.of(manager);
+ }
+
+ @Transactional
+ public Long delete(Long id) {
+ managerRepository.deleteById(id);
+ return id;
+ }
+
+ @Transactional
+ public Long approve(Long managerId, int level) {
+ Manager manager = this.findById(managerId);
+ manager.approve();
+ manager.updateLevel(level);
+ return managerId;
+ }
+
+ public Manager findById(Long id) {
+ return managerRepository.findById(id).orElseThrow(ManagerNotFoundException::new);
+ }
+
+ @Transactional(readOnly = true)
+ public ManagerDashboardDto getDashboard(Long managerId) {
+ Manager manager = this.findById(managerId);
+ List dailyInfos = dailyInfoRepository.findDailyInfoByDateBetweenOrderByDateAsc(LocalDate.now()
+ .minusDays(6), LocalDate.now());
+ Long[] loginCounts = dailyInfos.stream()
+ .map(DailyInfo::getLoginCnt)
+ .toArray(Long[]::new);
+ Long totalLoginCnt = dailyInfoRepository.getTotalLoginCnt();
+
+ return ManagerDashboardDto.of(manager, loginCounts, totalLoginCnt);
+ }
+
+ @Transactional(readOnly = true)
+ public String getEmail(Long memberId){
+ return this.findById(memberId).getEmail();
+ }
+}
diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java
new file mode 100644
index 0000000..b6df6d5
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerCUDto.java
@@ -0,0 +1,23 @@
+package com.server.hispath.manager.application.dto;
+
+import com.server.hispath.manager.presentation.request.ManagerCURequest;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ManagerCUDto {
+
+ private String name;
+ private String profile;
+ private String email;
+ private String department;
+
+ public static ManagerCUDto of(ManagerCURequest request) {
+ return new ManagerCUDto(request.getName(), request.getProfile(), request.getEmail(), request.getDepartment());
+ }
+
+}
\ No newline at end of file
diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerDashboardDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerDashboardDto.java
new file mode 100644
index 0000000..64aba69
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerDashboardDto.java
@@ -0,0 +1,27 @@
+package com.server.hispath.manager.application.dto;
+
+import com.server.hispath.manager.domain.Manager;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ManagerDashboardDto {
+ private Long id;
+ private String profile;
+ private String name;
+ private String department;
+ private boolean approved;
+ private String email;
+ private int power;
+ private Long[] loginCounts;
+ private Long totalCounts;
+
+ public static ManagerDashboardDto of(Manager manager, Long[] loginCounts, Long totalCounts) {
+ return new ManagerDashboardDto(manager.getId(), manager.getProfile(), manager.getName(), manager.getDepartment(),
+ manager.isApproved(), manager.getEmail(), manager.getPower(), loginCounts, totalCounts);
+ }
+}
diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java
new file mode 100644
index 0000000..8bf1496
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerDto.java
@@ -0,0 +1,31 @@
+package com.server.hispath.manager.application.dto;
+
+import com.server.hispath.manager.domain.Manager;
+import com.server.hispath.notice.domain.Notice;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import java.util.ArrayList;
+import java.util.List;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ManagerDto {
+ private Long id;
+ private String name;
+ private String email;
+ private String profile;
+ private String department;
+ private int power;
+ private boolean approved;
+
+ public static ManagerDto of(Manager manager) {
+ return new ManagerDto(manager.getId(), manager.getName(), manager.getEmail(),
+ manager.getProfile(), manager.getDepartment(), manager.getPower(), manager.isApproved());
+ }
+
+
+}
diff --git a/src/main/java/com/server/hispath/manager/application/dto/ManagerUpdateDto.java b/src/main/java/com/server/hispath/manager/application/dto/ManagerUpdateDto.java
new file mode 100644
index 0000000..f171d65
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/application/dto/ManagerUpdateDto.java
@@ -0,0 +1,22 @@
+package com.server.hispath.manager.application.dto;
+
+import com.server.hispath.manager.presentation.request.ManagerUpdateRequest;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ManagerUpdateDto {
+ private String name;
+ private String profile;
+ private String email;
+ private String department;
+ private int power;
+
+ public static ManagerUpdateDto from(ManagerUpdateRequest request){
+ return new ManagerUpdateDto(request.getName(), request.getProfile(), request.getEmail(), request.getDepartment(), request.getPower());
+ }
+}
diff --git a/src/main/java/com/server/hispath/manager/domain/DailyInfo.java b/src/main/java/com/server/hispath/manager/domain/DailyInfo.java
new file mode 100644
index 0000000..0736443
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/domain/DailyInfo.java
@@ -0,0 +1,36 @@
+package com.server.hispath.manager.domain;
+
+import java.time.LocalDate;
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+import com.server.hispath.common.BaseEntity;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+
+@Entity
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+@Where(clause = "deleted = false")
+@SQLDelete(sql = "UPDATE dailyInfo SET deleted = true Where id = ?")
+public class DailyInfo extends BaseEntity {
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ LocalDate date = LocalDate.now();
+
+ Long loginCnt = 1L;
+
+ public void login(){
+ loginCnt++;
+ }
+}
diff --git a/src/main/java/com/server/hispath/manager/domain/Manager.java b/src/main/java/com/server/hispath/manager/domain/Manager.java
new file mode 100644
index 0000000..b3b54eb
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/domain/Manager.java
@@ -0,0 +1,73 @@
+package com.server.hispath.manager.domain;
+
+import javax.persistence.Entity;
+import javax.persistence.GeneratedValue;
+import javax.persistence.GenerationType;
+import javax.persistence.Id;
+
+import com.server.hispath.common.BaseEntity;
+import com.server.hispath.manager.application.dto.ManagerCUDto;
+import com.server.hispath.manager.application.dto.ManagerUpdateDto;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+
+@Entity
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Where(clause = "deleted = false")
+@SQLDelete(sql = "UPDATE manager SET deleted = true Where id = ?")
+public class Manager extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+ private int power;
+ private String name;
+ private String email;
+ private String profile;
+ private String department;
+ private boolean approved;
+
+
+ public static Manager of(ManagerCUDto dto) {
+ return Manager.builder()
+ .name(dto.getName())
+ .email(dto.getEmail())
+ .profile(dto.getProfile())
+ .department(dto.getDepartment())
+ .approved(false)
+ .build();
+ }
+
+ public void update(ManagerCUDto dto) {
+ this.email = dto.getEmail();
+ this.name = dto.getName();
+ this.profile = dto.getProfile();
+ this.department = dto.getDepartment();
+ }
+
+ public void update(ManagerUpdateDto dto){
+ this.email = dto.getEmail();
+ this.name = dto.getName();
+ this.profile = dto.getProfile();
+ this.department = dto.getDepartment();
+ this.power = dto.getPower();
+ }
+
+ public void approve() {
+ this.approved = true;
+ }
+
+ public void updateLevel(int level) {this.power = level;}
+
+ public boolean isSuperManager() {
+ return this.power > 1;
+ }
+}
diff --git a/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java b/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java
new file mode 100644
index 0000000..5c5d54e
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/domain/repository/DailyInfoRepository.java
@@ -0,0 +1,20 @@
+package com.server.hispath.manager.domain.repository;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Optional;
+
+import com.server.hispath.manager.domain.DailyInfo;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Query;
+
+public interface DailyInfoRepository extends JpaRepository {
+ Optional findFirstByDate(LocalDate date);
+
+ List findDailyInfoByDateBetweenOrderByDateAsc(LocalDate start, LocalDate end);
+
+ @Query("select sum(d.loginCnt) from DailyInfo d ")
+ Long getTotalLoginCnt();
+
+}
diff --git a/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java b/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java
new file mode 100644
index 0000000..734b2d4
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/domain/repository/ManagerRepository.java
@@ -0,0 +1,12 @@
+package com.server.hispath.manager.domain.repository;
+
+import java.util.Optional;
+
+import com.server.hispath.manager.domain.Manager;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface ManagerRepository extends JpaRepository {
+
+ Optional findByEmail(String email);
+}
diff --git a/src/main/java/com/server/hispath/manager/presentation/ManagerController.java b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java
new file mode 100644
index 0000000..b754262
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/presentation/ManagerController.java
@@ -0,0 +1,107 @@
+package com.server.hispath.manager.presentation;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.server.hispath.auth.domain.LoginManager;
+import com.server.hispath.auth.domain.ManagerLogin;
+import com.server.hispath.auth.domain.RequiredManagerLogin;
+import com.server.hispath.auth.domain.RequiredSuperManagerLogin;
+import com.server.hispath.docs.ApiDoc;
+import com.server.hispath.manager.application.ManagerService;
+import com.server.hispath.manager.application.dto.ManagerCUDto;
+import com.server.hispath.manager.application.dto.ManagerDashboardDto;
+import com.server.hispath.manager.application.dto.ManagerUpdateDto;
+import com.server.hispath.manager.presentation.request.ManagerApproveRequest;
+import com.server.hispath.manager.presentation.request.ManagerCURequest;
+import com.server.hispath.manager.presentation.request.ManagerUpdateRequest;
+import com.server.hispath.manager.presentation.response.ManagerEmailResponse;
+import com.server.hispath.manager.presentation.response.ManagerResponse;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import io.swagger.annotations.ApiOperation;
+
+import lombok.RequiredArgsConstructor;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api")
+public class ManagerController {
+
+ private final ManagerService managerService;
+
+ @PostMapping("/manager")
+ @ApiOperation(value = ApiDoc.MANAGER_CREATE)
+ @RequiredManagerLogin
+ public ResponseEntity create(@RequestBody ManagerCURequest request) {
+ Long savedId = managerService.create(ManagerCUDto.of(request));
+ return ResponseEntity.ok(savedId);
+ }
+
+ @GetMapping("/manager/{id}")
+ @ApiOperation(value = ApiDoc.MANAGER_READ)
+ @RequiredManagerLogin
+ public ResponseEntity find(@PathVariable Long id) {
+ ManagerResponse response = ManagerResponse.of(managerService.findManager(id));
+ return ResponseEntity.ok(response);
+ }
+
+ @GetMapping("/managers")
+ @ApiOperation(value = ApiDoc.MANAGER_READ_ALL)
+ @RequiredManagerLogin
+ public ResponseEntity> findAll() {
+ List responses = managerService.findManagers()
+ .stream()
+ .map(ManagerResponse::of)
+ .collect(Collectors.toList());
+ return ResponseEntity.ok(responses);
+ }
+
+ @PutMapping("/manager/{id}")
+ @ApiOperation(value = ApiDoc.MANAGER_UPDATE)
+ @RequiredSuperManagerLogin
+ public ResponseEntity update(@PathVariable Long id, @RequestBody ManagerUpdateRequest request) {
+ ManagerResponse response = ManagerResponse.of(managerService.update(id, ManagerUpdateDto.from(request)));
+ return ResponseEntity.ok(response);
+ }
+
+ @PutMapping("/manager")
+ @ApiOperation(value = ApiDoc.MANAGER_PROFILE_UPDATE)
+ @RequiredManagerLogin
+ public ResponseEntity updateProfile(@ManagerLogin LoginManager loginManager, @RequestBody ManagerCURequest request) {
+ ManagerResponse response = ManagerResponse.of(managerService.update(loginManager.getId(), ManagerCUDto.of(request)));
+ return ResponseEntity.ok(response);
+ }
+
+ @PutMapping("/manager/approve")
+ @ApiOperation(value = ApiDoc.MANAGER_APPROVE)
+ @RequiredSuperManagerLogin
+ public ResponseEntity approve(@RequestBody ManagerApproveRequest request) {
+ Long response = managerService.approve(request.getManagerId(), request.getLevel());
+ return ResponseEntity.ok(response);
+ }
+
+ @DeleteMapping("/manager/{id}")
+ @ApiOperation(value = ApiDoc.MANAGER_DELETE)
+ @RequiredSuperManagerLogin
+ public ResponseEntity delete(@PathVariable Long id) {
+ Long response = managerService.delete(id);
+ return ResponseEntity.ok(response);
+ }
+
+ @GetMapping("/manager/dashboard")
+ @ApiOperation(value = ApiDoc.MANAGER_DASHBOARD)
+ @RequiredManagerLogin
+ public ResponseEntity getDashboard(@ManagerLogin LoginManager loginManager) {
+ return ResponseEntity.ok(managerService.getDashboard(loginManager.getId()));
+ }
+
+ @GetMapping("/manager/email")
+ @ApiOperation(value = ApiDoc.MANAGER_EMAIL)
+ @RequiredManagerLogin
+ public ResponseEntity getEmail(@ManagerLogin LoginManager loginManager) {
+ return ResponseEntity.ok(new ManagerEmailResponse(managerService.getEmail(loginManager.getId())));
+ }
+}
diff --git a/src/main/java/com/server/hispath/manager/presentation/request/ManagerApproveRequest.java b/src/main/java/com/server/hispath/manager/presentation/request/ManagerApproveRequest.java
new file mode 100644
index 0000000..ff4f801
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/presentation/request/ManagerApproveRequest.java
@@ -0,0 +1,15 @@
+package com.server.hispath.manager.presentation.request;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ManagerApproveRequest {
+ private Long managerId;
+ private int level;
+}
diff --git a/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java
new file mode 100644
index 0000000..d2e58e8
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/presentation/request/ManagerCURequest.java
@@ -0,0 +1,17 @@
+package com.server.hispath.manager.presentation.request;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+public class ManagerCURequest {
+
+ private String name;
+ private String profile;
+ private String email;
+ private String department;
+
+}
diff --git a/src/main/java/com/server/hispath/manager/presentation/request/ManagerUpdateRequest.java b/src/main/java/com/server/hispath/manager/presentation/request/ManagerUpdateRequest.java
new file mode 100644
index 0000000..3829524
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/presentation/request/ManagerUpdateRequest.java
@@ -0,0 +1,18 @@
+package com.server.hispath.manager.presentation.request;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+public class ManagerUpdateRequest {
+
+ private String name;
+ private String profile;
+ private String email;
+ private String department;
+ private int power;
+
+}
diff --git a/src/main/java/com/server/hispath/manager/presentation/response/ManagerEmailResponse.java b/src/main/java/com/server/hispath/manager/presentation/response/ManagerEmailResponse.java
new file mode 100644
index 0000000..a2ededf
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/presentation/response/ManagerEmailResponse.java
@@ -0,0 +1,12 @@
+package com.server.hispath.manager.presentation.response;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ManagerEmailResponse {
+ private String email;
+}
diff --git a/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java b/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java
new file mode 100644
index 0000000..b967442
--- /dev/null
+++ b/src/main/java/com/server/hispath/manager/presentation/response/ManagerResponse.java
@@ -0,0 +1,27 @@
+package com.server.hispath.manager.presentation.response;
+
+import com.server.hispath.manager.application.dto.ManagerDto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ManagerResponse {
+ private Long id;
+ private int power;
+ private String name;
+ private String email;
+ private String profile;
+ private String department;
+ private boolean approved;
+
+
+ public static ManagerResponse of(ManagerDto dto) {
+ return new ManagerResponse(dto.getId(), dto.getPower(), dto.getName(),
+ dto.getEmail(), dto.getProfile(), dto.getDepartment(), dto.isApproved());
+ }
+
+}
diff --git a/src/main/java/com/server/hispath/notice/application/NoticeService.java b/src/main/java/com/server/hispath/notice/application/NoticeService.java
new file mode 100644
index 0000000..5d9754e
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/application/NoticeService.java
@@ -0,0 +1,83 @@
+package com.server.hispath.notice.application;
+
+import com.server.hispath.exception.notice.NoticeNotFoundException;
+import com.server.hispath.manager.application.ManagerService;
+import com.server.hispath.manager.domain.Manager;
+import com.server.hispath.notice.application.dto.DashboardNoticeDto;
+import com.server.hispath.notice.application.dto.NoticeContentDto;
+import com.server.hispath.notice.application.dto.NoticeDto;
+import com.server.hispath.notice.domain.Notice;
+import com.server.hispath.notice.domain.repository.NoticeRepository;
+
+import com.server.hispath.notice.presentation.request.NoticeRequest;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import lombok.RequiredArgsConstructor;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@Service
+@RequiredArgsConstructor
+public class NoticeService {
+
+ private final NoticeRepository noticeRepository;
+
+ private final ManagerService managerService;
+
+ private Notice findById(Long id) {
+ Notice ret = noticeRepository.findById(id).orElseThrow(NoticeNotFoundException::new);
+ return ret;
+ }
+
+ @Transactional
+ public Long create(Long managerId, NoticeContentDto dto) {
+ Manager manager = managerService.findById(managerId);
+ Notice notice = Notice.from(manager, dto);
+ Notice savedNotice = noticeRepository.save(notice);
+ return savedNotice.getId();
+ }
+
+ @Transactional(readOnly = true)
+ public List findAll() {
+ List notices = noticeRepository.findAll();
+ return notices.stream().map(NoticeDto::from).collect(Collectors.toList());
+ }
+ @Transactional(readOnly = true)
+ public List findImp() {
+ LocalDate today = LocalDate.now();
+ List notices = noticeRepository.findAllImpInPub(today);
+ return notices.stream().map(DashboardNoticeDto::of).collect(Collectors.toList());
+ }
+
+ @Transactional
+ public NoticeDto find(Long id) {
+ Notice notice = this.findById(id);
+ notice.viewCount();
+ return NoticeDto.from(notice);
+ }
+
+ @Transactional
+ public NoticeDto update(Long id, Long managerId, NoticeContentDto dto) {
+ Notice notice = this.findById(id);
+ Manager manager = managerService.findById(managerId);
+ notice.update(manager, dto);
+ return NoticeDto.from(notice);
+ }
+
+ @Transactional
+ public void delete(Long id) {
+ noticeRepository.deleteById(id);
+ }
+
+ @Transactional(readOnly = true)
+ public List findRecentNotice() {
+ List notices = noticeRepository.findTop6ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate.now(), LocalDate.now());
+
+ return notices.stream()
+ .map(DashboardNoticeDto::of)
+ .collect(Collectors.toList());
+ }
+}
diff --git a/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java
new file mode 100644
index 0000000..b21421d
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/application/dto/DashboardNoticeDto.java
@@ -0,0 +1,25 @@
+package com.server.hispath.notice.application.dto;
+
+import java.time.LocalDate;
+
+import com.server.hispath.notice.domain.Notice;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class DashboardNoticeDto {
+ private Long id;
+ private String title;
+ private String content;
+ private LocalDate pubDate;
+ private LocalDate expDate;
+ private LocalDate regDate;
+
+ public static DashboardNoticeDto of(Notice notice) {
+ return new DashboardNoticeDto(notice.getId(), notice.getTitle(), notice.getContent(), notice.getPubDate(), notice.getExpDate(), notice.getCreatedAt().toLocalDate());
+ }
+}
diff --git a/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java b/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java
new file mode 100644
index 0000000..a043d16
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/application/dto/NoticeContentDto.java
@@ -0,0 +1,33 @@
+package com.server.hispath.notice.application.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.server.hispath.notice.presentation.request.NoticeRequest;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.persistence.Column;
+import java.time.LocalDate;
+
+@Getter
+@Setter
+@NoArgsConstructor
+@AllArgsConstructor
+public class NoticeContentDto {
+ private String title;
+ private String content;
+ private int viewCnt;
+ private boolean importance;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate pubDate;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate expDate;
+
+ public static NoticeContentDto from(NoticeRequest request){
+ return new NoticeContentDto(request.getTitle(), request.getContent(),
+ request.getViewCnt(), request.isImportance(), request.getPubDate(), request.getExpDate());
+ }
+}
diff --git a/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java
new file mode 100644
index 0000000..f3cb7b7
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/application/dto/NoticeDto.java
@@ -0,0 +1,38 @@
+package com.server.hispath.notice.application.dto;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.server.hispath.manager.application.dto.ManagerDto;
+import com.server.hispath.notice.domain.Notice;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class NoticeDto{
+ private Long id;
+ private ManagerDto manager;
+ private String title;
+ private String content;
+ private int viewCnt;
+ private boolean importance;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDateTime regDate;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate pubDate;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate expDate;
+
+ public static NoticeDto from(Notice notice) {
+ return new NoticeDto(notice.getId(), ManagerDto.of(notice.getManager()), notice.getTitle(),
+ notice.getContent(), notice.getViewCnt(), notice.isImportance(),notice.getCreatedAt() ,notice.getPubDate(), notice.getExpDate());
+ }
+}
diff --git a/src/main/java/com/server/hispath/notice/domain/Notice.java b/src/main/java/com/server/hispath/notice/domain/Notice.java
new file mode 100644
index 0000000..d9f8394
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/domain/Notice.java
@@ -0,0 +1,78 @@
+package com.server.hispath.notice.domain;
+
+import javax.persistence.*;
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.server.hispath.manager.domain.Manager;
+import com.server.hispath.common.BaseEntity;
+
+import com.server.hispath.notice.application.dto.NoticeContentDto;
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+
+import java.time.LocalDate;
+
+@Entity
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Where(clause = "deleted = false")
+@SQLDelete(sql = "UPDATE notice SET deleted = true Where id = ?")
+public class Notice extends BaseEntity {
+
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ private Manager manager;
+
+ private String title;
+
+ @Column(columnDefinition = "TEXT")
+ private String content;
+
+ private int viewCnt;
+
+ private boolean importance;
+
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate pubDate;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate expDate;
+
+ public static Notice from(Manager manager, NoticeContentDto dto) {
+ return Notice.builder()
+ .manager(manager)
+ .title(dto.getTitle())
+ .content(dto.getContent())
+ .viewCnt(dto.getViewCnt())
+ .importance(dto.isImportance())
+ .pubDate(dto.getPubDate())
+ .expDate(dto.getExpDate())
+ .build();
+ }
+
+ public void update(Manager manager, NoticeContentDto dto) {
+ this.manager = manager;
+ this.title = dto.getTitle();
+ this.content = dto.getContent();
+ this.viewCnt = dto.getViewCnt();
+ this.importance = dto.isImportance();
+ this.pubDate = dto.getPubDate();
+ this.expDate = dto.getExpDate();
+ }
+ public void viewCount(){
+ this.viewCnt++;
+ }
+
+
+}
diff --git a/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java
new file mode 100644
index 0000000..74395a8
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/domain/repository/NoticeRepository.java
@@ -0,0 +1,26 @@
+package com.server.hispath.notice.domain.repository;
+
+import com.server.hispath.activity.domain.Activity;
+import com.server.hispath.notice.domain.Notice;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+import org.springframework.data.jpa.repository.Modifying;
+import org.springframework.data.jpa.repository.Query;
+import org.springframework.data.repository.query.Param;
+import org.springframework.stereotype.Repository;
+
+import java.time.LocalDate;
+import java.util.List;
+import java.util.Optional;
+
+@Repository
+public interface NoticeRepository extends JpaRepository {
+ List findTop6ByPubDateLessThanEqualAndExpDateGreaterThanEqualOrderByPubDateDesc(LocalDate pubDate, LocalDate expDate);
+
+ @Query("select n from Notice n " +
+ "where n.importance = true " +
+ "and n.pubDate <= :today " +
+ "and n.expDate >= :today")
+ List findAllImpInPub(LocalDate today);
+
+}
diff --git a/src/main/java/com/server/hispath/notice/presentation/NoticeController.java b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java
new file mode 100644
index 0000000..deeef36
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/presentation/NoticeController.java
@@ -0,0 +1,86 @@
+package com.server.hispath.notice.presentation;
+
+import com.server.hispath.auth.domain.LoginManager;
+import com.server.hispath.auth.domain.ManagerLogin;
+import com.server.hispath.auth.domain.RequiredLogin;
+import com.server.hispath.auth.domain.RequiredManagerLogin;
+import com.server.hispath.docs.ApiDoc;
+import com.server.hispath.notice.application.dto.DashboardNoticeDto;
+import com.server.hispath.notice.application.dto.NoticeContentDto;
+import com.server.hispath.notice.application.dto.NoticeDto;
+import com.server.hispath.notice.application.NoticeService;
+
+import com.server.hispath.notice.domain.Notice;
+import com.server.hispath.notice.presentation.request.NoticeRequest;
+import com.server.hispath.notice.presentation.response.NoticeDashboardResponse;
+import com.server.hispath.notice.presentation.response.NoticeResponse;
+import io.swagger.annotations.ApiOperation;
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import lombok.RequiredArgsConstructor;
+
+import java.util.Comparator;
+import java.util.List;
+import java.util.stream.Collectors;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api")
+public class NoticeController {
+
+ private final NoticeService noticeService;
+
+
+ @PostMapping("/notice/add")
+ @ApiOperation(value= ApiDoc.NOTICE_CREATE)
+ @RequiredManagerLogin
+ public ResponseEntity create(@ManagerLogin LoginManager loginManager, @RequestBody NoticeRequest request){
+ Long id = noticeService.create(loginManager.getId(), NoticeContentDto.from(request));
+ return ResponseEntity.ok(id);
+ }
+
+ @GetMapping("/notice")
+ @RequiredLogin
+ @ApiOperation(value = ApiDoc.NOTICE_READ_ALL)
+ public ResponseEntity> findAll() {
+ List responses = noticeService.findAll().stream().sorted(Comparator.comparing(NoticeDto::getRegDate).reversed()).map(NoticeResponse::from).collect(Collectors.toList());
+ return ResponseEntity.ok(responses);
+ }
+
+ @GetMapping("/notice/imp")
+ @ApiOperation(value = ApiDoc.NOTICE_READ_IMP)
+ @RequiredLogin
+ public ResponseEntity> findImp() {
+ List responses = noticeService.findImp().stream().sorted(Comparator.comparing(DashboardNoticeDto::getPubDate).reversed()).map(NoticeDashboardResponse::of).collect(Collectors.toList());
+ return ResponseEntity.ok(responses);
+ }
+
+ @GetMapping("/notice/{id}")
+ @ApiOperation(value = ApiDoc.NOTICE_READ)
+ @RequiredLogin
+ public ResponseEntity find(@PathVariable Long id){
+// noticeService.increaseViewCnt(id);
+ NoticeResponse response = NoticeResponse.from(noticeService.find(id));
+ return ResponseEntity.ok(response);
+ }
+
+
+ @PatchMapping("/notice/{id}")
+ @ApiOperation(value = ApiDoc.NOTICE_UPDATE)
+ @RequiredManagerLogin
+ public ResponseEntity update(@PathVariable Long id, @RequestBody NoticeRequest request){
+ NoticeDto dto = noticeService.update(id, request.getManagerId(), NoticeContentDto.from(request));
+ NoticeResponse response = NoticeResponse.from(dto);
+ return ResponseEntity.ok(response);
+ }
+
+ @DeleteMapping("/notice/{id}")
+ @ApiOperation(value = ApiDoc.NOTICE_DELETE)
+ @RequiredManagerLogin
+ public ResponseEntity delete(@PathVariable Long id){
+ noticeService.delete(id);
+ return ResponseEntity.ok(id);
+ }
+
+}
diff --git a/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java b/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java
new file mode 100644
index 0000000..3fbb87f
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/presentation/request/NoticeRequest.java
@@ -0,0 +1,28 @@
+package com.server.hispath.notice.presentation.request;
+import com.fasterxml.jackson.annotation.JsonFormat;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+import javax.persistence.Column;
+import java.time.LocalDate;
+import java.time.LocalDateTime;
+
+@Setter
+@Getter
+@NoArgsConstructor
+public class NoticeRequest{
+
+ private Long managerId;
+ private String title;
+ private String content;
+ private int viewCnt;
+ private boolean importance;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate pubDate;
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate expDate;
+
+
+}
diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java
new file mode 100644
index 0000000..ea3ad12
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeDashboardResponse.java
@@ -0,0 +1,25 @@
+package com.server.hispath.notice.presentation.response;
+
+import java.time.LocalDate;
+
+import com.server.hispath.notice.application.dto.DashboardNoticeDto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class NoticeDashboardResponse {
+ private Long noticeId;
+ private String title;
+ private String content;
+ private LocalDate pubDate;
+ private LocalDate expDate;
+ private LocalDate regDate;
+
+ static public NoticeDashboardResponse of(DashboardNoticeDto dto) {
+ return new NoticeDashboardResponse(dto.getId(), dto.getTitle(), dto.getContent(), dto.getPubDate(), dto.getExpDate(), dto.getRegDate());
+ }
+}
diff --git a/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java
new file mode 100644
index 0000000..f50bba4
--- /dev/null
+++ b/src/main/java/com/server/hispath/notice/presentation/response/NoticeResponse.java
@@ -0,0 +1,41 @@
+package com.server.hispath.notice.presentation.response;
+
+
+import com.fasterxml.jackson.annotation.JsonFormat;
+import com.server.hispath.notice.application.dto.NoticeDto;
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+import javax.persistence.Column;
+import java.time.LocalDate;
+
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class NoticeResponse {
+
+
+ private Long id;
+ private Long managerId;
+ private String managerName;
+ private String title;
+ private String content;
+ private int viewCnt;
+ private boolean importance;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate regDate;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate pubDate;
+
+ @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd", timezone = "Asia/Seoul")
+ private LocalDate expDate;
+
+ public static NoticeResponse from(NoticeDto dto) {
+ return new NoticeResponse(dto.getId(), dto.getManager().getId(), dto.getManager().getName(),
+ dto.getTitle(), dto.getContent(), dto.getViewCnt(), dto.isImportance(),dto.getRegDate().toLocalDate() ,dto.getPubDate(), dto.getExpDate());
+ }
+}
diff --git a/src/main/java/com/server/hispath/resume/application/ResumeService.java b/src/main/java/com/server/hispath/resume/application/ResumeService.java
new file mode 100644
index 0000000..02fdac5
--- /dev/null
+++ b/src/main/java/com/server/hispath/resume/application/ResumeService.java
@@ -0,0 +1,77 @@
+package com.server.hispath.resume.application;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.server.hispath.exception.resume.ResumeNotFoundException;
+import com.server.hispath.resume.application.dto.ResumeDto;
+import com.server.hispath.resume.domain.Resume;
+import com.server.hispath.resume.domain.repository.ResumeRepository;
+import com.server.hispath.student.application.StudentService;
+import com.server.hispath.student.domain.Student;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor
+public class ResumeService {
+
+ private final ResumeRepository resumeRepository;
+ private final StudentService studentService;
+
+ @Transactional
+ public Long create(Long studentId, ResumeDto resumeDto) {
+ Student student = studentService.findById(studentId);
+ Resume resume = Resume.builder()
+ .student(student)
+ .title(resumeDto.getTitle())
+ .content(resumeDto.getContent())
+ .build();
+
+ Resume savedResume = resumeRepository.save(resume);
+ student.addResume(savedResume);
+ return savedResume.getId();
+ }
+
+ @Transactional
+ public ResumeDto update(ResumeDto resumeDto) {
+ Resume resume = this.findById(resumeDto.getId());
+ resume.updateContent(resumeDto);
+ return ResumeDto.of(resume);
+ }
+
+ public Resume findById(Long id) {
+ return resumeRepository.findById(id).orElseThrow(ResumeNotFoundException::new);
+ }
+
+ @Transactional
+ public void delete(Long id) {
+ resumeRepository.deleteById(id);
+ }
+
+ @Transactional(readOnly = true)
+ public ResumeDto find(Long id) {
+ return ResumeDto.of(this.findById(id));
+ }
+
+ @Transactional(readOnly = true)
+ public List findAllStudentResumes(Long studentId) {
+ Student student = studentService.findById(studentId);
+ return resumeRepository.findByStudent(student)
+ .stream()
+ .map(ResumeDto::of)
+ .collect(Collectors.toList());
+ }
+
+ @Transactional(readOnly = true)
+ public List findRecentResumes(Long studentId) {
+ Student student = studentService.findById(studentId);
+ return resumeRepository.findTop6ByStudentOrderByUpdatedAtDesc(student)
+ .stream()
+ .map(ResumeDto::of)
+ .collect(Collectors.toList());
+ }
+}
diff --git a/src/main/java/com/server/hispath/resume/application/dto/ResumeDto.java b/src/main/java/com/server/hispath/resume/application/dto/ResumeDto.java
new file mode 100644
index 0000000..990ebf7
--- /dev/null
+++ b/src/main/java/com/server/hispath/resume/application/dto/ResumeDto.java
@@ -0,0 +1,37 @@
+package com.server.hispath.resume.application.dto;
+
+import java.time.LocalDateTime;
+
+import com.server.hispath.resume.domain.Resume;
+import com.server.hispath.resume.presentation.request.ResumeCURequest;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResumeDto {
+ private Long id;
+ private String title;
+ private String content;
+ private LocalDateTime createdAt;
+ private LocalDateTime updateAt;
+
+ public ResumeDto(Long id, ResumeCURequest request) {
+ this.id = id;
+ this.title = request.getTitle();
+ this.content = request.getContent();
+ }
+
+ public ResumeDto(ResumeCURequest request) {
+ this.title = request.getTitle();
+ this.content = request.getContent();
+ }
+
+ public static ResumeDto of(Resume resume) {
+ return new ResumeDto(resume.getId(), resume.getTitle(), resume.getContent(),
+ resume.getCreatedAt(), resume.getUpdatedAt());
+ }
+}
diff --git a/src/main/java/com/server/hispath/resume/domain/Resume.java b/src/main/java/com/server/hispath/resume/domain/Resume.java
new file mode 100644
index 0000000..1b7a059
--- /dev/null
+++ b/src/main/java/com/server/hispath/resume/domain/Resume.java
@@ -0,0 +1,44 @@
+package com.server.hispath.resume.domain;
+
+import javax.persistence.*;
+
+import com.server.hispath.common.BaseEntity;
+import com.server.hispath.resume.application.dto.ResumeDto;
+import com.server.hispath.student.domain.Student;
+
+import lombok.AllArgsConstructor;
+import lombok.Builder;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import org.hibernate.annotations.SQLDelete;
+import org.hibernate.annotations.Where;
+
+@Entity
+@Getter
+@Builder
+@NoArgsConstructor
+@AllArgsConstructor
+@Where(clause = "deleted = false")
+@SQLDelete(sql = "UPDATE resume SET deleted = true Where id = ?")
+public class Resume extends BaseEntity {
+
+ @Id
+ @GeneratedValue(strategy = GenerationType.IDENTITY)
+ private Long id;
+
+ @ManyToOne(fetch = FetchType.LAZY)
+ private Student student;
+
+ private String title;
+
+ @Column(length = 5555)
+ private String content;
+
+ // ToDo 여러 템플릿을 위한 필드
+ // private Template template;
+
+ public void updateContent(ResumeDto resumeDto){
+ this.title = resumeDto.getTitle();
+ this.content = resumeDto.getContent();
+ }
+}
diff --git a/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java b/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java
new file mode 100644
index 0000000..58a2dad
--- /dev/null
+++ b/src/main/java/com/server/hispath/resume/domain/repository/ResumeRepository.java
@@ -0,0 +1,14 @@
+package com.server.hispath.resume.domain.repository;
+
+import java.util.List;
+
+import com.server.hispath.resume.domain.Resume;
+import com.server.hispath.student.domain.Student;
+
+import org.springframework.data.jpa.repository.JpaRepository;
+
+public interface ResumeRepository extends JpaRepository {
+ List findByStudent(Student student);
+
+ List findTop6ByStudentOrderByUpdatedAtDesc(Student student);
+}
diff --git a/src/main/java/com/server/hispath/resume/presentation/ResumeController.java b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java
new file mode 100644
index 0000000..d6bcdea
--- /dev/null
+++ b/src/main/java/com/server/hispath/resume/presentation/ResumeController.java
@@ -0,0 +1,90 @@
+package com.server.hispath.resume.presentation;
+
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.server.hispath.activity.application.ActivityService;
+import com.server.hispath.activity.application.dto.ActivityParticipantDto;
+import com.server.hispath.auth.domain.LoginStudent;
+import com.server.hispath.auth.domain.RequiredLogin;
+import com.server.hispath.auth.domain.StudentLogin;
+import com.server.hispath.docs.ApiDoc;
+import com.server.hispath.resume.application.ResumeService;
+import com.server.hispath.resume.application.dto.ResumeDto;
+import com.server.hispath.resume.presentation.request.ResumeCURequest;
+import com.server.hispath.resume.presentation.response.ResumeResponse;
+import com.server.hispath.resume.presentation.response.ResumeStudentInfo;
+import com.server.hispath.student.application.StudentService;
+import com.server.hispath.student.application.dto.StudentDto;
+
+import org.springframework.http.ResponseEntity;
+import org.springframework.web.bind.annotation.*;
+
+import io.swagger.annotations.ApiOperation;
+
+import lombok.RequiredArgsConstructor;
+
+@RestController
+@RequiredArgsConstructor
+@RequestMapping("/api")
+public class ResumeController {
+ private final ResumeService resumeService;
+ private final StudentService studentService;
+ private final ActivityService activityService;
+
+ @PostMapping("/resume")
+ @ApiOperation(value = ApiDoc.RESUME_CREATE)
+ @RequiredLogin
+ public ResponseEntity create(
+ @StudentLogin LoginStudent loginStudent,
+ @RequestBody ResumeCURequest request) {
+ Long response = resumeService.create(loginStudent.getId(), new ResumeDto(request));
+ return ResponseEntity.ok(response);
+ }
+
+ @PutMapping("/resume/{id}")
+ @ApiOperation(value = ApiDoc.RESUME_UPDATE)
+ @RequiredLogin
+ public ResponseEntity update(@PathVariable Long id, @RequestBody ResumeCURequest request) {
+ ResumeResponse response = ResumeResponse.of(resumeService.update(new ResumeDto(id, request)));
+ return ResponseEntity.ok(response);
+ }
+
+ @DeleteMapping("/resume/{id}")
+ @ApiOperation(value = ApiDoc.RESUME_DELETE)
+ @RequiredLogin
+ public ResponseEntity delete(@PathVariable Long id) {
+ resumeService.delete(id);
+ return ResponseEntity.ok(null);
+ }
+
+ @GetMapping("/resume")
+ @ApiOperation(value = ApiDoc.RESUME_READ)
+ @RequiredLogin
+ public ResponseEntity find(@RequestParam Long resumeId) {
+ return ResponseEntity.ok(ResumeResponse.of(resumeService.find(resumeId)));
+ }
+
+ @GetMapping("/resumes")
+ @ApiOperation(value = ApiDoc.RESUME_READ_ALL)
+ @RequiredLogin
+ public ResponseEntity> findAll(@StudentLogin LoginStudent loginStudent) {
+
+ List responses = resumeService.findAllStudentResumes(loginStudent.getId())
+ .stream()
+ .map(ResumeResponse::of)
+ .collect(Collectors.toList());
+
+ return ResponseEntity.ok(responses);
+ }
+
+ @GetMapping("/resume/info")
+ @ApiOperation(value = ApiDoc.RESUME_INFO)
+ @RequiredLogin
+ public ResponseEntity findStudentActivityInfo(@StudentLogin LoginStudent loginStudent) {
+
+ StudentDto studentDto = studentService.find(loginStudent.getId());
+ List activities = activityService.findAllParticipantActivites(studentDto.getId(), "ALL", "ALL");
+ return ResponseEntity.ok(new ResumeStudentInfo(studentDto, activities));
+ }
+}
diff --git a/src/main/java/com/server/hispath/resume/presentation/request/ResumeCURequest.java b/src/main/java/com/server/hispath/resume/presentation/request/ResumeCURequest.java
new file mode 100644
index 0000000..5d93613
--- /dev/null
+++ b/src/main/java/com/server/hispath/resume/presentation/request/ResumeCURequest.java
@@ -0,0 +1,13 @@
+package com.server.hispath.resume.presentation.request;
+
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+import lombok.Setter;
+
+@Getter
+@Setter
+@NoArgsConstructor
+public class ResumeCURequest {
+ private String title;
+ private String content;
+}
diff --git a/src/main/java/com/server/hispath/resume/presentation/response/ResumeResponse.java b/src/main/java/com/server/hispath/resume/presentation/response/ResumeResponse.java
new file mode 100644
index 0000000..be27ca8
--- /dev/null
+++ b/src/main/java/com/server/hispath/resume/presentation/response/ResumeResponse.java
@@ -0,0 +1,26 @@
+package com.server.hispath.resume.presentation.response;
+
+
+import java.time.LocalDateTime;
+
+import com.server.hispath.resume.application.dto.ResumeDto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResumeResponse {
+ private Long resumeId;
+ private String title;
+ private String content;
+ private LocalDateTime createdAt;
+ private LocalDateTime updateAt;
+
+ public static ResumeResponse of(ResumeDto resumeDto) {
+ return new ResumeResponse(resumeDto.getId(), resumeDto.getTitle(), resumeDto.getContent(),
+ resumeDto.getCreatedAt(), resumeDto.getUpdateAt());
+ }
+}
diff --git a/src/main/java/com/server/hispath/resume/presentation/response/ResumeStudentInfo.java b/src/main/java/com/server/hispath/resume/presentation/response/ResumeStudentInfo.java
new file mode 100644
index 0000000..0275592
--- /dev/null
+++ b/src/main/java/com/server/hispath/resume/presentation/response/ResumeStudentInfo.java
@@ -0,0 +1,44 @@
+package com.server.hispath.resume.presentation.response;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+
+import com.server.hispath.activity.application.dto.ActivityParticipantDto;
+import com.server.hispath.activity.presentation.response.ActivitySimpleResponse;
+import com.server.hispath.student.application.dto.StudentDto;
+
+import lombok.AllArgsConstructor;
+import lombok.Getter;
+import lombok.NoArgsConstructor;
+
+@Getter
+@NoArgsConstructor
+@AllArgsConstructor
+public class ResumeStudentInfo {
+ private String studentName;
+ private String phone;
+ private String profile;
+ private String email;
+ private String departmentName;
+ private String major1;
+ private String major2;
+ private String blog;
+ private String githubId;
+ private List activities = new ArrayList<>();
+
+ public ResumeStudentInfo(StudentDto studentDto, List activityDtos){
+ this.studentName = studentDto.getName();
+ this.phone = studentDto.getPhone();
+ this.profile = studentDto.getProfile();
+ this.email = studentDto.getEmail();
+ this.departmentName = studentDto.getDepartmentDto().getName();
+ this.major1 = studentDto.getMajor1().getName();
+ this.major2 = studentDto.getMajor2().getName();
+ this.blog = studentDto.getBlog();
+ this.githubId = studentDto.getGithubId();
+ this.activities = activityDtos.stream()
+ .map(ActivitySimpleResponse::of)
+ .collect(Collectors.toList());
+ }
+}
diff --git a/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java
new file mode 100644
index 0000000..1aa0e12
--- /dev/null
+++ b/src/main/java/com/server/hispath/scholarship/application/ScholarshipService.java
@@ -0,0 +1,236 @@
+package com.server.hispath.scholarship.application;
+
+import java.util.*;
+import java.util.stream.Collectors;
+
+import com.server.hispath.activity.application.dto.ChartDepartmentDataDto;
+import com.server.hispath.activity.application.dto.ChartGradeDataDto;
+import com.server.hispath.activity.application.dto.ChartSearchRequestDto;
+import com.server.hispath.activity.application.dto.ChartTimelineDto;
+import com.server.hispath.activity.application.dto.chart.ChartRankDto;
+import com.server.hispath.activity.domain.Activity;
+import com.server.hispath.activity.domain.repository.ActivityRepository;
+import com.server.hispath.exception.scholarship.ScholarshipDuplicateException;
+import com.server.hispath.exception.scholarship.ScholarshipNotFoundException;
+import com.server.hispath.exception.scholarship.ScholarshipNotMatchException;
+import com.server.hispath.exception.student.StudentNotFoundException;
+import com.server.hispath.scholarship.application.dto.ScholarshipApprovalDto;
+import com.server.hispath.scholarship.application.dto.ScholarshipContentDto;
+import com.server.hispath.scholarship.application.dto.ScholarshipDto;
+import com.server.hispath.scholarship.application.dto.SearchRequestDto;
+import com.server.hispath.scholarship.domain.Scholarship;
+import com.server.hispath.scholarship.domain.repository.ScholarshipRepository;
+import com.server.hispath.scholarship.domain.repository.ScholarshipRepositoryCustom;
+import com.server.hispath.student.application.StudentService;
+import com.server.hispath.student.domain.Student;
+import com.server.hispath.student.domain.repository.StudentRepository;
+
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
+
+import lombok.RequiredArgsConstructor;
+
+@Service
+@RequiredArgsConstructor
+public class ScholarshipService {
+ private final ScholarshipRepository scholarshipRepository;
+ private final ScholarshipRepositoryCustom scholarshipRepositoryCustom;
+ private final StudentService studentService;
+ private final ActivityRepository activityRepository;
+ private final StudentRepository studentRepository;
+
+ @Transactional
+ public Long create(Long studentId, String semester) {
+ Student student = studentService.findById(studentId);
+
+ Optional existScholarship = scholarshipRepository.findFirstByStudentAndSemester(student, semester);
+ existScholarship.ifPresent(scholarshipRepository::delete);
+
+ int totalWeight = getTotalWeight(student, semester);
+
+ Scholarship scholarship = Scholarship.builder()
+ .student(student)
+ .semester(semester)
+ .studentSemester(student.getSemester())
+ .totalMileage(totalWeight)
+ .sMajor1(student.getMajor1())
+ .sMajor2(student.getMajor2())
+ .sDepartment(student.getDepartment())
+ .build();
+
+ Scholarship savedScholarship = scholarshipRepository.save(scholarship);
+ return savedScholarship.getId();
+ }
+
+ private int getTotalWeight(Student student, String semester) {
+ return activityRepository.findActivitiesByStudentAndSemester(student, semester)
+ .stream()
+ .map(Activity::getWeight)
+ .reduce(0, Integer::sum);
+ }
+
+ @Transactional(readOnly = true)
+ public List findAll() {
+ List scholarships = scholarshipRepository.findAll();
+ return scholarships.stream()
+ .map(ScholarshipContentDto::from)
+ .collect(Collectors.toList());
+ }
+
+ @Transactional(readOnly = true)
+ public List findAllScholarshipStudent(boolean approved, String semester) {
+ List scholarships = scholarshipRepository.findAllByApprovedAndSemester(approved, semester);
+ return scholarships.stream()
+ .map(ScholarshipDto::of)
+ .collect(Collectors.toList());
+ }
+
+ @Transactional(readOnly = true)
+ public ScholarshipDto findScholarshipStudent(Long studentId, String semester) {
+ Scholarship scholarship = scholarshipRepository.findStudentIdAndSemester(studentId, semester)
+ .orElseThrow(ScholarshipNotFoundException::new);
+ return ScholarshipDto.of(scholarship);
+ }
+
+ @Transactional
+ public void approveAll(List scholarshipApprovalDtos, String semester) {
+ validateScholarshipDatas(scholarshipApprovalDtos, semester);
+ checkDuplicate(scholarshipApprovalDtos);
+
+ scholarshipApprovalDtos.forEach(dto -> {
+ Student student = studentRepository.findByStudentNum(dto.getStudentNum())
+ .orElseThrow(StudentNotFoundException::new);
+ Scholarship scholarship = scholarshipRepository.findFirstByStudentAndSemester(student, semester)
+ .orElseThrow(ScholarshipNotFoundException::new);
+ scholarship.approve(dto.getResult());
+ });
+
+
+ }
+
+ private void checkDuplicate(List scholarshipApprovalDtos) {
+ Set set = scholarshipApprovalDtos.stream()
+ .map(ScholarshipApprovalDto::StudentInfo)
+ .collect(Collectors.toSet());
+
+ if (set.size() < scholarshipApprovalDtos.size()) {
+ throw new ScholarshipDuplicateException();
+ }
+ }
+
+ private boolean validateError(ScholarshipApprovalDto dto, String semester) {
+ Optional optionalStudent = studentRepository.findByStudentNum(dto.getStudentNum());
+ if (optionalStudent.isEmpty())
+ return true;
+ Student student = optionalStudent.get();
+ if (!student.isNameMatch(dto.getName()))
+ return true;
+ Optional optionalScholarship = scholarshipRepository.findFirstByStudentAndSemester(student, semester);
+ if (optionalScholarship.isEmpty())
+ return true;
+ Scholarship scholarship = optionalScholarship.get();
+ if (!scholarship.isStudentSemesterMatch(dto.getStudentSemester()))
+ return true;
+ return scholarship.getTotalMileage() != dto.getWeight();
+ }
+
+ private void validateScholarshipDatas(List scholarshipApprovalDtos, String semester) {
+ List errors = scholarshipApprovalDtos.stream()
+ .filter(dto -> validateError(dto, semester))
+ .collect(Collectors.toList());
+ if (errors.size() != 0) {
+ String errorMsg = errors.stream()
+ .map(ScholarshipApprovalDto::toString)
+ .collect(Collectors.joining("\n"));
+ throw new ScholarshipNotMatchException(errorMsg);
+ }
+ }
+
+ @Transactional(readOnly = true)
+ public List searchScholarshipStudent(SearchRequestDto dto) {
+ return scholarshipRepositoryCustom.searchScholarshipStudent(dto)
+ .stream()
+ .map(ScholarshipDto::of)
+ .collect(Collectors.toList());
+ }
+
+ @Transactional(readOnly = true)
+ public ChartRankDto getRankChartData(Long studentId, ChartSearchRequestDto dto) {
+
+ Student student = studentService.findById(studentId);
+ int myWeight = scholarshipRepository.findFirstByStudentAndSemester(student, dto.getSemester())
+ .orElseGet(() -> Scholarship.builder().totalMileage(0).build())
+ .getTotalMileage();
+ Double avgWeight = scholarshipRepositoryCustom.getTotalMileageAvg(dto);
+ int maxWeight = activityRepository.sumActivityWeight(dto.getSemester());
+ return new ChartRankDto(myWeight, avgWeight, maxWeight);
+ }
+
+ @Transactional(readOnly = true)
+ public List getChartTimelines(Long studentId) {
+ return studentRepository.findStudentWithScholarships(studentId)
+ .orElseThrow(StudentNotFoundException::new)
+ .getScholarships()
+ .stream()
+ .filter(Scholarship::isApproved)
+ .map(ChartTimelineDto::of)
+ .sorted(Comparator.comparing(ChartTimelineDto::getSemester))
+ .collect(Collectors.toList());
+ }
+
+ @Transactional(readOnly = true)
+ public List getChartWeightDistribution(String semester) {
+ List scholarships = scholarshipRepository.findAllBySemesterAndApprovedTrue(semester);
+ Long[] chartWeightDistribute = new Long[6];
+ Arrays.fill(chartWeightDistribute, 0L);
+ scholarships.forEach(scholarship -> {
+ if (scholarship.getTotalMileage() < 20)
+ chartWeightDistribute[0]++;
+ else if (scholarship.getTotalMileage() < 40)
+ chartWeightDistribute[1]++;
+ else if (scholarship.getTotalMileage() < 60)
+ chartWeightDistribute[2]++;
+ else if (scholarship.getTotalMileage() < 80)
+ chartWeightDistribute[3]++;
+ else if (scholarship.getTotalMileage() < 100)
+ chartWeightDistribute[4]++;
+ else
+ chartWeightDistribute[5]++;
+ });
+
+ return Arrays.asList(chartWeightDistribute);
+ }
+
+ @Transactional(readOnly = true)
+ public List