From d472511f7d6098cf4425705ffcec1f9e4533228f Mon Sep 17 00:00:00 2001 From: Dohun Kim Date: Fri, 20 Mar 2026 00:25:12 +0900 Subject: [PATCH 1/6] =?UTF-8?q?[feat]=20#186=20Member=20=EC=97=94=ED=8B=B0?= =?UTF-8?q?=ED=8B=B0=EC=97=90=20=EC=82=B0=EC=97=85=ED=95=84=EB=93=9C,=20?= =?UTF-8?q?=EC=A4=80=EB=B9=84=EC=83=81=ED=83=9C=20=ED=95=84=EB=93=9C=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80=20=EB=B0=8F=20=EC=88=98=EC=A0=95=20=EB=A9=94?= =?UTF-8?q?=EC=84=9C=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/org/sopt/kareer/domain/member/entity/Member.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/org/sopt/kareer/domain/member/entity/Member.java b/src/main/java/org/sopt/kareer/domain/member/entity/Member.java index 590c834..f12662b 100644 --- a/src/main/java/org/sopt/kareer/domain/member/entity/Member.java +++ b/src/main/java/org/sopt/kareer/domain/member/entity/Member.java @@ -74,6 +74,10 @@ public class Member extends BaseEntity { @Column(length = 1000) private String targetJobSkill; + private String preparationStatus; + + private String fieldsOfInterest; + @Enumerated(EnumType.STRING) @Column(nullable = false) private RoadmapStatus roadmapStatus; @@ -81,6 +85,10 @@ public class Member extends BaseEntity { public void updateInfo(String name, LocalDate birthDate, Country country, + String university, + EnglishLevel englishLevel, + String fieldsOfInterests, + String preparationStatuses, LanguageLevel languageLevel, Degree degree, LocalDate expectedGraduationDate, From 78c587b7f993f133c4d457d2b8d5417cdc4756d0 Mon Sep 17 00:00:00 2001 From: Dohun Kim Date: Fri, 20 Mar 2026 00:26:01 +0900 Subject: [PATCH 2/6] =?UTF-8?q?[feat]=20#186=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20v2=20API=20=EA=B5=AC=ED=98=84=20=EB=B0=8F=20=EA=B4=80?= =?UTF-8?q?=EB=A0=A8=20DTO=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberControllerV2.java | 34 +++++++++ .../dto/request/MemberOnboardV2Request.java | 76 +++++++++++++++++++ .../domain/member/service/MemberService.java | 52 ++++++++++--- 3 files changed, 152 insertions(+), 10 deletions(-) create mode 100644 src/main/java/org/sopt/kareer/domain/member/controller/MemberControllerV2.java create mode 100644 src/main/java/org/sopt/kareer/domain/member/dto/request/MemberOnboardV2Request.java diff --git a/src/main/java/org/sopt/kareer/domain/member/controller/MemberControllerV2.java b/src/main/java/org/sopt/kareer/domain/member/controller/MemberControllerV2.java new file mode 100644 index 0000000..c4bb16c --- /dev/null +++ b/src/main/java/org/sopt/kareer/domain/member/controller/MemberControllerV2.java @@ -0,0 +1,34 @@ +package org.sopt.kareer.domain.member.controller; + +import io.swagger.v3.oas.annotations.Operation; +import io.swagger.v3.oas.annotations.tags.Tag; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.sopt.kareer.domain.member.dto.request.*; +import org.sopt.kareer.domain.member.service.MemberService; +import org.sopt.kareer.global.annotation.CustomExceptionDescription; +import org.sopt.kareer.global.config.swagger.SwaggerResponseDescription; +import org.sopt.kareer.global.response.BaseResponse; +import org.springframework.http.*; +import org.springframework.security.core.annotation.AuthenticationPrincipal; +import org.springframework.web.bind.annotation.*; + +@RestController +@RequiredArgsConstructor +@RequestMapping("/api/v2/members") +@Tag(name = "Member API V2", description = "회원 API 버전 2") +public class MemberControllerV2 { + + private final MemberService memberService; + + @PostMapping("/onboard") + @Operation(summary = "회원 온보딩 V2", description = "PENDING 상태의 회원의 온보딩 결과를 저장합니다.") + @CustomExceptionDescription(SwaggerResponseDescription.MEMBER_ONBOARD) + public ResponseEntity> onboardMember(@AuthenticationPrincipal Long memberId, + @Valid @RequestBody MemberOnboardV2Request request) { + memberService.onboardMemberV2(request, memberId); + return ResponseEntity + .status(HttpStatus.OK) + .body(BaseResponse.ok("회원 온보딩이 완료되었습니다.")); + } +} diff --git a/src/main/java/org/sopt/kareer/domain/member/dto/request/MemberOnboardV2Request.java b/src/main/java/org/sopt/kareer/domain/member/dto/request/MemberOnboardV2Request.java new file mode 100644 index 0000000..11e125a --- /dev/null +++ b/src/main/java/org/sopt/kareer/domain/member/dto/request/MemberOnboardV2Request.java @@ -0,0 +1,76 @@ +package org.sopt.kareer.domain.member.dto.request; + +import io.swagger.v3.oas.annotations.media.Schema; +import jakarta.validation.constraints.*; +import java.time.LocalDate; +import java.util.List; +import org.sopt.kareer.domain.member.entity.enums.*; + +public record MemberOnboardV2Request( + @NotBlank(message = "이름은 필수 입력값입니다.") + String name, + + @NotNull(message = "생년월일은 필수 입력값입니다.") + LocalDate birthDate, + + @NotNull(message = "대학교는 필수 입력값입니다.") + String university, + + @NotNull(message = "국가는 필수 입력값입니다.") + Country country, + + @NotNull(message = "언어 능력은 필수 입력값입니다.") + LanguageLevel languageLevel, + + @NotNull(message = "영어 능력은 필수 입력값입니다.") + EnglishLevel englishLevel, + + @NotNull(message = "학위는 필수 입력값입니다.") + Degree degree, + + @NotNull(message = "비자 유형은 필수 입력값입니다.") + VisaType visaType, + + @Schema(description = "예상 졸업일, D2 비자인 경우만", type = "string", format = "date", example = "2025-08-31") + LocalDate expectedGraduationDate, + + @NotNull(message = "비자 시작일은 필수 입력값입니다.") + LocalDate visaStartDate, + + @NotNull(message = "비자 만료일은 필수 입력값입니다.") + LocalDate visaExpiredAt, + + @Schema(description = "비자 점수, D10 비자인 경우만", example = "50") + Integer visaPoint, + + @NotBlank(message = "제1전공은 필수 입력값입니다.") + String primaryMajor, + + String secondaryMajor, + + @NotNull(message = "관심 분야는 필수 입력값입니다. (최소 1개, 최대 5개)") + List fieldsOfInterests, + + List preparationStatuses, + + @NotBlank(message = "희망 직무는 필수 입력값입니다.") + String targetJob, + + String targetJobSkill, + + @NotBlank(message = "개인 배경은 필수 입력값입니다.") + @Size(max = 1000, message = "개인 배경은 최대 1000자까지 입력할 수 있습니다.") + String personalBackground +) { + @AssertTrue(message = "visaPoint는 D10 비자인 경우에만 입력할 수 있습니다.") + @Schema(hidden = true) + public boolean isVisaPointValid() { + if (visaType == null) { + return visaPoint == null; + } + if (visaType == VisaType.D10) { + return visaPoint != null; + } + return visaPoint == null; + } +} diff --git a/src/main/java/org/sopt/kareer/domain/member/service/MemberService.java b/src/main/java/org/sopt/kareer/domain/member/service/MemberService.java index 6e51069..69d6405 100644 --- a/src/main/java/org/sopt/kareer/domain/member/service/MemberService.java +++ b/src/main/java/org/sopt/kareer/domain/member/service/MemberService.java @@ -1,17 +1,12 @@ package org.sopt.kareer.domain.member.service; import lombok.RequiredArgsConstructor; -import org.sopt.kareer.domain.member.dto.request.MemberOnboardRequest; -import org.sopt.kareer.domain.member.dto.response.MemberInfoResponse; -import org.sopt.kareer.domain.member.dto.response.MemberStatusResponse; -import org.sopt.kareer.domain.member.dto.response.MypageResponse; -import org.sopt.kareer.domain.member.entity.Member; -import org.sopt.kareer.domain.member.entity.MemberVisa; +import org.sopt.kareer.domain.member.dto.request.*; +import org.sopt.kareer.domain.member.dto.response.*; +import org.sopt.kareer.domain.member.entity.*; import org.sopt.kareer.domain.member.entity.enums.MemberStatus; -import org.sopt.kareer.domain.member.exception.MemberErrorCode; -import org.sopt.kareer.domain.member.exception.MemberException; -import org.sopt.kareer.domain.member.repository.MemberRepository; -import org.sopt.kareer.domain.member.repository.MemberVisaRepository; +import org.sopt.kareer.domain.member.exception.*; +import org.sopt.kareer.domain.member.repository.*; import org.sopt.kareer.domain.member.service.dto.request.MypageCommand; import org.sopt.kareer.global.exception.customexception.GlobalException; import org.sopt.kareer.global.exception.errorcode.GlobalErrorCode; @@ -71,6 +66,43 @@ public void onboardMember(MemberOnboardRequest request, Long memberId) { request.name(), request.birthDate(), request.country(), + null, + null, + null, + null, + request.languageLevel(), + request.degree(), + request.expectedGraduationDate(), + request.primaryMajor(), + request.secondaryMajor(), + request.targetJob(), + request.targetJobSkill() + ); + + MemberVisa memberVisa = MemberVisa.createMemberVisa( + member, + request.visaType(), + request.visaExpiredAt(), + request.visaPoint(), + request.visaStartDate() + ); + memberVisaRepository.save(memberVisa); + } + + @Transactional + public void onboardMemberV2(MemberOnboardV2Request request, Long memberId) { + Member member = getById(memberId); + String fieldOfInterest = String.join(",", request.fieldsOfInterests()); + String preparationStatus = String.join(",", request.preparationStatuses()); + + member.updateInfo( + request.name(), + request.birthDate(), + request.country(), + request.university(), + request.englishLevel(), + fieldOfInterest, + preparationStatus, request.languageLevel(), request.degree(), request.expectedGraduationDate(), From cccad4b1e221771f4dd0b6af222fbb1cda464416 Mon Sep 17 00:00:00 2001 From: Dohun Kim Date: Fri, 20 Mar 2026 00:26:27 +0900 Subject: [PATCH 3/6] =?UTF-8?q?[feat]=20#186=20=EC=82=B0=EC=97=85=ED=95=84?= =?UTF-8?q?=EB=93=9C=20=EB=B0=8F=20=EB=8C=80=ED=95=99=20=EB=A6=AC=EC=8A=A4?= =?UTF-8?q?=ED=8A=B8=20=EC=A1=B0=ED=9A=8C=20API=20=EA=B5=AC=ED=98=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/controller/MemberController.java | 32 ++- .../dto/response/OnboardFieldsResponse.java | 11 + .../response/OnboardUniversitiesResponse.java | 11 + .../domain/member/entity/constants/Field.java | 72 +++++ .../member/entity/constants/University.java | 251 ++++++++++++++++++ 5 files changed, 371 insertions(+), 6 deletions(-) create mode 100644 src/main/java/org/sopt/kareer/domain/member/dto/response/OnboardFieldsResponse.java create mode 100644 src/main/java/org/sopt/kareer/domain/member/dto/response/OnboardUniversitiesResponse.java create mode 100644 src/main/java/org/sopt/kareer/domain/member/entity/constants/Field.java create mode 100644 src/main/java/org/sopt/kareer/domain/member/entity/constants/University.java diff --git a/src/main/java/org/sopt/kareer/domain/member/controller/MemberController.java b/src/main/java/org/sopt/kareer/domain/member/controller/MemberController.java index 1ac202e..c6eb2b9 100644 --- a/src/main/java/org/sopt/kareer/domain/member/controller/MemberController.java +++ b/src/main/java/org/sopt/kareer/domain/member/controller/MemberController.java @@ -12,7 +12,7 @@ import org.sopt.kareer.domain.member.dto.request.MemberOnboardRequest; import org.sopt.kareer.domain.member.dto.request.MypageRequest; import org.sopt.kareer.domain.member.dto.response.*; -import org.sopt.kareer.domain.member.entity.constants.Major; +import org.sopt.kareer.domain.member.entity.constants.*; import org.sopt.kareer.domain.member.entity.enums.Country; import org.sopt.kareer.domain.member.service.MemberService; import org.sopt.kareer.domain.roadmap.dto.response.RoadmapTestResponse; @@ -58,6 +58,15 @@ public ResponseEntity> onboardMember(@AuthenticationPrincipal .body(BaseResponse.ok("회원 온보딩이 완료되었습니다.")); } + @GetMapping("/onboard/universities") + @Operation(summary = "온보딩 대학교 목록 조회", description = "회원 온보딩 시 선택할 수 있는 대학교 목록을 조회합니다.") + public ResponseEntity> getOnboardUniversities() { + return ResponseEntity + .status(HttpStatus.OK) + .body(BaseResponse.ok(OnboardUniversitiesResponse.from(University.UNIVERSITY_LIST), + "온보딩 대학교 목록 조회에 성공하였습니다.")); + } + @GetMapping("/onboard/countries") @Operation(summary = "온보딩 국가 목록 조회", description = "회원 온보딩 시 선택할 수 있는 국가 목록을 조회합니다.") public ResponseEntity> getOnboardCountries() { @@ -77,11 +86,20 @@ public ResponseEntity> getOnboardMajors() { ); } + @GetMapping("/onboard/fields") + @Operation(summary = "온보딩 관심 분야 목록 조회", description = "회원 온보딩 시 선택할 수 있는 관심 분야 목록을 조회합니다.") + public ResponseEntity> getOnboardFields() { + return ResponseEntity + .status(HttpStatus.OK) + .body(BaseResponse.ok(OnboardFieldsResponse.from(Field.FIELD_LIST), "온보딩 관심 분야 목록 조회에 성공하였습니다.") + ); + } + @Operation(summary = "AI 로드맵 생성 API", description = "사용자가 온보딩에 입력한 정보를 통해 로드맵을 생성합니다.") @CustomExceptionDescription(CREATE_ROADMAP) @PostMapping("roadmap") public ResponseEntity> generateRoadmap( - @AuthenticationPrincipal Long memberId){ + @AuthenticationPrincipal Long memberId) { roadMapService.createRoadmap(memberId); @@ -93,7 +111,7 @@ public ResponseEntity> generateRoadmap( @CustomExceptionDescription(CREATE_ROADMAP) @PostMapping("roadmap/test") public ResponseEntity> generateRoadmapForTest( - @AuthenticationPrincipal Long memberId){ + @AuthenticationPrincipal Long memberId) { return ResponseEntity.status(HttpStatus.OK) .body(BaseResponse.ok(roadMapService.createRoadmapTest(memberId), "AI 로드맵 생성에 성공하였습니다.")); @@ -114,10 +132,12 @@ public ResponseEntity> getMypage(@AuthenticationPri return ResponseEntity.status(HttpStatus.OK) .body(BaseResponse.ok(memberService.getMypage(memberId), "마이페이지 조회에 성공하였습니다.")); } + @Operation(summary = "마이페이지 수정", description = "마이페이지에서 유저 프로필을 수정합니다.") @CustomExceptionDescription(UPDATE_MYPAGE) @PutMapping("mypage") - public ResponseEntity> updateMypage(@AuthenticationPrincipal Long memberId, @Valid @RequestBody MypageRequest request){ + public ResponseEntity> updateMypage(@AuthenticationPrincipal Long memberId, + @Valid @RequestBody MypageRequest request) { memberService.updateMypage(memberId, request.toCommand()); return ResponseEntity.status(HttpStatus.OK) .body(BaseResponse.ok("마이페이지 수정에 성공하였습니다.")); @@ -127,8 +147,8 @@ public ResponseEntity> updateMypage(@AuthenticationPrincipal @CustomExceptionDescription(MEMBER_DELETE) @DeleteMapping("/me") public ResponseEntity> deleteMember(@AuthenticationPrincipal Long memberId, - HttpServletRequest request, - HttpServletResponse response) { + HttpServletRequest request, + HttpServletResponse response) { memberService.deleteMember(memberId); authService.signOut(request, response); return ResponseEntity.status(HttpStatus.OK) diff --git a/src/main/java/org/sopt/kareer/domain/member/dto/response/OnboardFieldsResponse.java b/src/main/java/org/sopt/kareer/domain/member/dto/response/OnboardFieldsResponse.java new file mode 100644 index 0000000..7a35c50 --- /dev/null +++ b/src/main/java/org/sopt/kareer/domain/member/dto/response/OnboardFieldsResponse.java @@ -0,0 +1,11 @@ +package org.sopt.kareer.domain.member.dto.response; + +import java.util.List; + +public record OnboardFieldsResponse( + List fields +) { + public static OnboardFieldsResponse from(List fields) { + return new OnboardFieldsResponse(fields); + } +} diff --git a/src/main/java/org/sopt/kareer/domain/member/dto/response/OnboardUniversitiesResponse.java b/src/main/java/org/sopt/kareer/domain/member/dto/response/OnboardUniversitiesResponse.java new file mode 100644 index 0000000..911e137 --- /dev/null +++ b/src/main/java/org/sopt/kareer/domain/member/dto/response/OnboardUniversitiesResponse.java @@ -0,0 +1,11 @@ +package org.sopt.kareer.domain.member.dto.response; + +import java.util.List; + +public record OnboardUniversitiesResponse( + List universities +) { + public static OnboardUniversitiesResponse from(List universities) { + return new OnboardUniversitiesResponse(universities); + } +} diff --git a/src/main/java/org/sopt/kareer/domain/member/entity/constants/Field.java b/src/main/java/org/sopt/kareer/domain/member/entity/constants/Field.java new file mode 100644 index 0000000..f93140b --- /dev/null +++ b/src/main/java/org/sopt/kareer/domain/member/entity/constants/Field.java @@ -0,0 +1,72 @@ +package org.sopt.kareer.domain.member.entity.constants; + +import java.util.List; + +public class Field { + + private Field() { + } + + public static final List FIELD_LIST = List.of( + "Automotive", + "Aerospace", + "Energy", + "Oil & Gas", + "Renewable Energy", + "Manufacturing", + "Construction", + "Engineering", + "Healthcare", + "Pharmaceuticals", + "Biotechnology", + "Medical Devices", + "Education", + "EdTech", + "Finance", + "Banking", + "Insurance", + "FinTech", + "Investment & Asset Management", + "Retail", + "E-commerce", + "Consumer Goods", + "Telecommunications", + "Media", + "Entertainment", + "Gaming", + "Agriculture", + "Food & Beverage", + "Hospitality", + "Travel & Tourism", + "Logistics", + "Supply Chain", + "Real Estate", + "Consulting", + "Legal", + "Government & Public Sector", + "Nonprofit & NGO", + "Information Technology", + "Software Development", + "Artificial Intelligence", + "Data & Analytics", + "Cybersecurity", + "Cloud Computing", + "Blockchain", + "Internet of Things (IoT)", + "Robotics", + "Semiconductors", + "Electronics", + "Hardware", + "Design", + "Marketing & Advertising", + "Human Resources", + "Sports", + "Fashion & Apparel", + "Beauty & Cosmetics", + "Environment", + "Sustainability", + "Smart City", + "Defense", + "Space Industry" + ); +} diff --git a/src/main/java/org/sopt/kareer/domain/member/entity/constants/University.java b/src/main/java/org/sopt/kareer/domain/member/entity/constants/University.java new file mode 100644 index 0000000..db5fd37 --- /dev/null +++ b/src/main/java/org/sopt/kareer/domain/member/entity/constants/University.java @@ -0,0 +1,251 @@ +package org.sopt.kareer.domain.member.entity.constants; + +import java.util.List; + +public class University { + + private University() { + } + + public static final List UNIVERSITY_LIST = List.of( + "Kunsan National University", + "Kongju National University", + "Gyeongguk National University", + "Gangneung Wonju National University", + "Kwangju Women’S University", + "Gwangju University", + "Gwangju National University Of Education", + "Gwangju Institute Of Science And Technology", + "Gwangju Catholic University", + "Kwangwoon University", + "Kwangshin University", + "Gongju National University Of Education", + "Kosin University", + "The Cyber University Of Korea", + "Korea University Sejong Campus", + "Korea University", + "Keimyung University", + "Kyung Hee Cyber University", + "Kyung Hee University", + "Kyungil University", + "Gyeongin National University Of Education", + "Kyungwoon University", + "Kyungsung University", + "Gyeongsang National University", + "Kyungpook National University", + "Kyungdong University", + "Kyungnam University", + "Gyeongnam National University Of Science And Technology", + "Kyonggi University", + "Konyang Cyber University", + "Konyang University", + "Konkuk University", + "Kangwon National University", + "GANGSEO UNIVERSITY", + "Kangnam University", + "Methodist Theological University", + "The Catholic University Of Korea", + "Catholic Kkottongnae University", + "Catholic Kwandong University", + "Gachon University", + "Kaya University", + "Gyeonggi University Of Science And Technology", + "Geoje University", + "Gangwon State University", + "Kangwon Tourism College", + "Gangneung Yeongdong University", + "Gangdong University", + "Catholic Sangji College", + "ICT Polytech Institute of Korea", + "Hwashin Cyber University", + "HWASUNG MEDI-SCIENCE UNIVERSITY", + "Hongik University", + "Howon University", + "Hoseo University", + "Honam Theological University & Seminary", + "Honam University", + "Hyupsung University", + "Hanzhong University", + "Haniluniv.&Presb.Theol.Sem.", + "Hanyang Cyber University", + "Hanyang University Erica Campus", + "Hanyang University", + "Hanshin University", + "Hansei University", + "Hansung University", + "Hanseo University", + "Hanbuk University", + "Hanbat National University", + "Hallym University", + "Hanlyo University", + "Halla University", + "Handong Global University", + "Hannam University", + "Korea Aerospace University", + "Korea Baptist Theological University/Seminary", + "Korea National Sport University", + "Korea National University Of Cultural Heritage", + "Hankuk University Of Foreign Studies", + "Korea National University Of Arts", + "Open Cyber University Of Korea (OCU)", + "Korea institute of Energy Technology", + "Korean Bible University", + "Korea National Open University", + "Korea University of Technology and Education", + "Korea National University Of Education", + "Korea Advanced Institute of Science And Technology(KAIST)", + "Tech University of Korea", + "Hankyong National University", + "Pohang University Of Science And Technology (Postech)", + "Pyeongtaek University", + "TAEJAE UNIVERSITY", + "Tamna University", + "Calvin University", + "Chungbuk National University", + "Chungnam National University", + "Chuncheon National University Of Education", + "Chugye University For The Arts", + "Chongshin University", + "Chodang University", + "Cheongju University", + "Chongjunationaluniversityofeducation", + "Chungwoon University", + "Changshin University", + "CHA University", + "Jinju National University", + "Chinju National University Of Education", + "Jungwon University", + "Joong-Ang Sangha University", + "Chung-Ang University", + "Joongbu University", + "Chosun University", + "Jeju National University", + "Jeju International University", + "Jungseok Institute Of Technology", + "Jeonju University", + "Jeonju National University Of Education", + "Jeonbuk National University", + "Chonnam National University", + "Presbyterian University & Theological Seminary", + "Inha University", + "Incheon National University", + "Incheon Catholic University", + "Inje University", + "Ewha Womans University", + "Eulji University", + "U1 University", + "Uiduk University", + "Wonkwang Digital University", + "Wonkwang University", + "University Of Ulsan", + "Ulsan National Institute of Science and Technology", + "Woosong University", + "Woosuk University", + "Yong In University", + "Yewon Arts University", + "Jesus University", + "Youngsan University Of Seon Studies", + "Youngsan University", + "Youngnam Theological University & Seminary", + "Yeungnam University", + "Yonsei University MIRAE Campus", + "Yonsei University", + "Anyang University", + "Ajou University", + "ACTS University", + "Shinhan University", + "Silla University", + "SinGyeongju University", + "Korea Soongsil Cyber University", + "Soongsil University", + "Soonchunhyang University", + "Korea Christian College", + "Sookmyung Women’S University", + "The University Of Suwon", + "Suwon Catholic University", + "Songwon University", + "Sehan University", + "Sejong Cyber University", + "Sejong University", + "Semyung University", + "Sungshin Women’S University", + "Sungkyunkwan University", + "Sungkonghoe University", + "Sungkyul University", + "Sun Moon University", + "Seowon University", + "Seoul Hanyoung University", + "Seoul Jangsin University", + "Seoul Women’s University", + "Seoul Theological University", + "University Of Seoul", + "Seoul Cyber University", + "Seoul Digital University", + "Seoul National University", + "Seoul Christian University", + "Seoul National University Of Education", + "Seoul National University Of Science And Technology", + "Seonam University", + "Seokyeong University", + "Sogang University", + "Sangji University", + "Sangmyung University", + "Sangmyung University (Seoul)", + "Sahmyook University", + "Cyber Hankuk University Of Foreign Studies", + "Busan Presbyterian University", + "Busan University Of Foreign Studies", + "Busandigital University", + "Pusan National University", + "Busan National University Of Education", + "Catholic University Of Pusan", + "Baekseok University", + "Pai Chai University", + "Mokpo Catholic University", + "Mokwon University", + "Myongji University Social Science Campus", + "Myongji University Natural Science Campus", + "Luther University", + "Digital Seoul Culture Arts University", + "Dong-Eui University", + "Dongyang University", + "Dong-A University", + "Dongshin University", + "Dongseo University", + "Tongmyong University", + "Dongduk Women’s University", + "Dongguk University", + "Duksung Women’S University", + "Daejin University", + "Daejeon Theological University", + "Daejeon University", + "Daejeoncatholic University", + "Daeshin University", + "Daegu Haany University", + "Daegu University Of Foreign Studies", + "Daegu Arts University", + "Daegu Cyber University", + "Daegu University", + "Daegu National University Of Education", + "DGIST", + "Daegu Catholic University", + "Dankook University", + "Namseoul University", + "Nambu University", + "Korea Nazarene University", + "Gimcheon University", + "Geumgang University", + "Global Cyber University", + "Far East University", + "Gukje Cyber University", + "Kookmin University", + "Korea Maritime & Ocean University", + "Korea National University Of Transportation", + "Changwon National University", + "Sunchon National University", + "Pukyong National University", + "Mokpo National Maritime University", + "Mokpo National University", + "Kumoh National Institute Of Technology" + ); +} From c0aedf66c24ef735842bb4e6500225987f4fa031 Mon Sep 17 00:00:00 2001 From: Dohun Kim Date: Fri, 20 Mar 2026 00:50:12 +0900 Subject: [PATCH 4/6] =?UTF-8?q?[feat]=20#186=20=EB=8C=80=ED=95=99=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=20=EC=A4=91=20=EC=98=A4=ED=83=80=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../sopt/kareer/domain/member/entity/constants/University.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/kareer/domain/member/entity/constants/University.java b/src/main/java/org/sopt/kareer/domain/member/entity/constants/University.java index db5fd37..edc88af 100644 --- a/src/main/java/org/sopt/kareer/domain/member/entity/constants/University.java +++ b/src/main/java/org/sopt/kareer/domain/member/entity/constants/University.java @@ -108,7 +108,7 @@ private University() { "Chongshin University", "Chodang University", "Cheongju University", - "Chongjunationaluniversityofeducation", + "Chongju National University Of Education", "Chungwoon University", "Changshin University", "CHA University", From e74f0ace9e33ffd8498c56c4e8aa602065aec320 Mon Sep 17 00:00:00 2001 From: Dohun Kim Date: Fri, 20 Mar 2026 00:51:36 +0900 Subject: [PATCH 5/6] =?UTF-8?q?[feat]=20#186=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20V2=20API=20=ED=95=84=ED=84=B0=20=ED=97=88=EC=9A=A9=20?= =?UTF-8?q?=EB=A6=AC=EC=8A=A4=ED=8A=B8=EC=97=90=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../global/security/filter/OnboardingRestrictionFilter.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/kareer/global/security/filter/OnboardingRestrictionFilter.java b/src/main/java/org/sopt/kareer/global/security/filter/OnboardingRestrictionFilter.java index 7f0dc4b..6f3462a 100644 --- a/src/main/java/org/sopt/kareer/global/security/filter/OnboardingRestrictionFilter.java +++ b/src/main/java/org/sopt/kareer/global/security/filter/OnboardingRestrictionFilter.java @@ -37,7 +37,8 @@ public class OnboardingRestrictionFilter extends OncePerRequestFilter { ); private static final List ONBOARD_ALLOWED_PATHS = List.of( - "/api/v1/members/onboard/**" + "/api/v1/members/onboard/**", + "/api/v2/members/onboard/**" ); private final MemberService memberService; From 1d5b1cecd5f9814114f65519d67498d41097d8c6 Mon Sep 17 00:00:00 2001 From: Dohun Kim Date: Fri, 20 Mar 2026 00:52:53 +0900 Subject: [PATCH 6/6] =?UTF-8?q?[feat]=20#186=20=EC=98=A8=EB=B3=B4=EB=94=A9?= =?UTF-8?q?=20DTO=EC=97=90=20=EA=B4=80=EC=8B=AC=20=EB=B6=84=EC=95=BC=20?= =?UTF-8?q?=EC=A0=9C=EC=95=BD=20=EC=A1=B0=EA=B1=B4=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../domain/member/dto/request/MemberOnboardV2Request.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/sopt/kareer/domain/member/dto/request/MemberOnboardV2Request.java b/src/main/java/org/sopt/kareer/domain/member/dto/request/MemberOnboardV2Request.java index 11e125a..e6770c3 100644 --- a/src/main/java/org/sopt/kareer/domain/member/dto/request/MemberOnboardV2Request.java +++ b/src/main/java/org/sopt/kareer/domain/member/dto/request/MemberOnboardV2Request.java @@ -48,7 +48,8 @@ public record MemberOnboardV2Request( String secondaryMajor, - @NotNull(message = "관심 분야는 필수 입력값입니다. (최소 1개, 최대 5개)") + @NotNull(message = "관심 분야는 필수 입력값입니다.") + @Size(min = 1, max = 5, message = "관심 분야는 최소 1개, 최대 5개까지 선택할 수 있습니다.") List fieldsOfInterests, List preparationStatuses,