From faba35ccfdf77152deac4d29db62982a2a1f23ec Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Mon, 2 Feb 2026 21:23:44 +0900 Subject: [PATCH 1/5] =?UTF-8?q?fix:=20=EB=A9=98=ED=86=A0=20=EC=A7=80?= =?UTF-8?q?=EC=9B=90=EC=84=9C=20=EC=8A=B9=EC=9D=B8=20=EC=8B=9C=20=EC=9C=A0?= =?UTF-8?q?=EC=A0=80=20Role=20=EC=9D=84=20Mentor=EB=A1=9C=20=EC=8A=B9?= =?UTF-8?q?=EA=B2=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../AdminMentorApplicationService.java | 5 +++ .../siteuser/domain/SiteUser.java | 4 +++ .../AdminMentorApplicationServiceTest.java | 33 +++++++++++-------- 3 files changed, 29 insertions(+), 13 deletions(-) diff --git a/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java b/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java index 48249f7d..6124ad4f 100644 --- a/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java +++ b/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java @@ -46,6 +46,11 @@ public void approveMentorApplication(Long mentorApplicationId) { .orElseThrow(() -> new CustomException(MENTOR_APPLICATION_NOT_FOUND)); mentorApplication.approve(); + + SiteUser siteUser = siteUserRepository.findById(mentorApplication.getSiteUserId()) + .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + + siteUser.becomeMentor(); } @Transactional diff --git a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java index a82291d7..f6c3f3b3 100644 --- a/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java +++ b/src/main/java/com/example/solidconnection/siteuser/domain/SiteUser.java @@ -130,4 +130,8 @@ public void updatePassword(String newEncodedPassword) { public void updateUserStatus(UserStatus status) { this.userStatus = status; } + + public void becomeMentor() { + this.role = Role.MENTOR; + } } diff --git a/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java b/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java index 5160b283..c763fd7b 100644 --- a/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java +++ b/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java @@ -21,8 +21,10 @@ import com.example.solidconnection.mentor.domain.UniversitySelectType; import com.example.solidconnection.mentor.fixture.MentorApplicationFixture; import com.example.solidconnection.mentor.repository.MentorApplicationRepository; +import com.example.solidconnection.siteuser.domain.Role; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; +import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.support.TestContainerSpringBootTest; import com.example.solidconnection.university.domain.HostUniversity; import com.example.solidconnection.university.fixture.UniversityFixture; @@ -56,6 +58,9 @@ class AdminMentorApplicationServiceTest { @Autowired private MentorApplicationRepository mentorApplicationRepository; + @Autowired + private SiteUserRepository siteUserRepository; + private MentorApplication mentorApplication1; private MentorApplication mentorApplication2; private MentorApplication mentorApplication3; @@ -100,7 +105,7 @@ class 멘토_승격_지원서_목록_조회 { @Test void 멘토_승격_상태를_조건으로_페이징하여_조회한다() { // given - MentorApplicationSearchCondition condition = new MentorApplicationSearchCondition(MentorApplicationStatus.PENDING,null, null, null); + MentorApplicationSearchCondition condition = new MentorApplicationSearchCondition(MentorApplicationStatus.PENDING, null, null, null); Pageable pageable = PageRequest.of(0, 10); List expectedMentorApplications = List.of(mentorApplication2, mentorApplication5, mentorApplication7); @@ -122,7 +127,7 @@ class 멘토_승격_지원서_목록_조회 { } @Test - void 닉네임_keyword_에_맞는_멘토_지원서를_페이징하여_조회한다(){ + void 닉네임_keyword_에_맞는_멘토_지원서를_페이징하여_조회한다() { // given String nickname = "test1"; MentorApplicationSearchCondition condition = new MentorApplicationSearchCondition(null, nickname, null, null); @@ -147,7 +152,7 @@ class 멘토_승격_지원서_목록_조회 { } @Test - void 대학명_keyword_에_맞는_멘토_지원서를_페이징하여_조회한다(){ + void 대학명_keyword_에_맞는_멘토_지원서를_페이징하여_조회한다() { // given String universityKoreanName = "메이지 대학"; MentorApplicationSearchCondition condition = new MentorApplicationSearchCondition(null, universityKoreanName, null, null); @@ -172,7 +177,7 @@ class 멘토_승격_지원서_목록_조회 { } @Test - void 지역명_keyword_에_맞는_멘토_지원서를_페이징하여_조회한다(){ + void 지역명_keyword_에_맞는_멘토_지원서를_페이징하여_조회한다() { // given String regionKoreanName = "유럽"; MentorApplicationSearchCondition condition = new MentorApplicationSearchCondition(null, regionKoreanName, null, null); @@ -197,10 +202,10 @@ class 멘토_승격_지원서_목록_조회 { } @Test - void 나라명_keyword_에_맞는_멘토_지원서를_페이징하여_조회한다(){ + void 나라명_keyword_에_맞는_멘토_지원서를_페이징하여_조회한다() { // given String countryKoreanName = "오스트리아"; - MentorApplicationSearchCondition condition = new MentorApplicationSearchCondition(null, countryKoreanName, null,null); + MentorApplicationSearchCondition condition = new MentorApplicationSearchCondition(null, countryKoreanName, null, null); Pageable pageable = PageRequest.of(0, 10); List expectedMentorApplications = List.of(mentorApplication3, mentorApplication4); @@ -302,7 +307,7 @@ class 멘토_승격_지원서_목록_조회 { } @Nested - class 멘토_승격_지원서_승인{ + class 멘토_승격_지원서_승인 { @Test void 대기중인_멘토_지원서를_승인한다() { @@ -314,14 +319,16 @@ class 멘토_승격_지원서_승인{ // then MentorApplication result = mentorApplicationRepository.findById(mentorApplication2.getId()).get(); + SiteUser mentor = siteUserRepository.findById(result.getSiteUserId()).get(); assertAll( () -> assertThat(result.getMentorApplicationStatus()).isEqualTo(MentorApplicationStatus.APPROVED), - () -> assertThat(result.getApprovedAt()).isNotNull() + () -> assertThat(result.getApprovedAt()).isNotNull(), + () -> assertThat(mentor.getRole()).isEqualTo(Role.MENTOR) ); } @Test - void 대학이_선택되지_않은_멘토_지원서를_승인하면_예외가_발생한다(){ + void 대학이_선택되지_않은_멘토_지원서를_승인하면_예외가_발생한다() { // given SiteUser user = siteUserFixture.사용자(); MentorApplication noUniversityIdMentorApplication = mentorApplicationFixture.대기중_멘토신청(user.getId(), UniversitySelectType.OTHER, null); @@ -367,7 +374,7 @@ class 멘토_승격_지원서_승인{ } @Nested - class 멘토_승격_지원서_거절{ + class 멘토_승격_지원서_거절 { @Test void 대기중인_멘토_지원서를_거절한다() { @@ -517,7 +524,7 @@ class 멘토_지원서에_대학_매핑 { .hasMessage(UNIVERSITY_NOT_FOUND.getMessage()); } } - + @Nested class 멘토_지원서_이력_조회 { @@ -539,7 +546,7 @@ class 멘토_지원서_이력_조회 { .containsExactly(app3.getId(), app2.getId(), app1.getId()), () -> assertThat(response) .extracting(MentorApplicationHistoryResponse::applicationOrder) - .containsExactly(3,2,1) + .containsExactly(3, 2, 1) ); } @@ -565,7 +572,7 @@ class 멘토_지원서_이력_조회 { .containsExactly(app7.getId(), app6.getId(), app5.getId(), app4.getId(), app3.getId()), () -> assertThat(response) .extracting(MentorApplicationHistoryResponse::applicationOrder) - .containsExactly(7,6,5,4,3) + .containsExactly(7, 6, 5, 4, 3) ); } From ca98121b85a18e22381c552dd59cd73122eef58c Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Sat, 7 Feb 2026 00:45:08 +0900 Subject: [PATCH 2/5] =?UTF-8?q?fix:=20=EB=A9=98=ED=86=A0=20=EC=A7=80?= =?UTF-8?q?=EC=9B=90=EC=84=9C=20=EC=8A=B9=EC=9D=B8=20=EC=8B=9C=20=EB=A9=98?= =?UTF-8?q?=ED=86=A0=20=EC=83=9D=EC=84=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../service/AdminMentorApplicationService.java | 13 +++++++++++++ .../service/AdminMentorApplicationServiceTest.java | 14 ++++++++++++-- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java b/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java index 6124ad4f..a49b3169 100644 --- a/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java +++ b/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java @@ -9,9 +9,11 @@ import com.example.solidconnection.admin.dto.MentorApplicationSearchCondition; import com.example.solidconnection.admin.dto.MentorApplicationSearchResponse; import com.example.solidconnection.common.exception.CustomException; +import com.example.solidconnection.mentor.domain.Mentor; import com.example.solidconnection.mentor.domain.MentorApplication; import com.example.solidconnection.mentor.domain.MentorApplicationStatus; import com.example.solidconnection.mentor.repository.MentorApplicationRepository; +import com.example.solidconnection.mentor.repository.MentorRepository; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.repository.SiteUserRepository; import com.example.solidconnection.university.domain.HostUniversity; @@ -31,6 +33,7 @@ public class AdminMentorApplicationService { private final MentorApplicationRepository mentorApplicationRepository; private final HostUniversityRepository hostUniversityRepository; private final SiteUserRepository siteUserRepository; + private final MentorRepository mentorRepository; @Transactional(readOnly = true) public Page searchMentorApplications( @@ -51,6 +54,16 @@ public void approveMentorApplication(Long mentorApplicationId) { .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); siteUser.becomeMentor(); + + Mentor mentor = new Mentor( + "", + "", + siteUser.getId(), + mentorApplication.getUniversityId(), + mentorApplication.getTermId() + ); + + mentorRepository.save(mentor); } @Transactional diff --git a/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java b/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java index c763fd7b..5a214092 100644 --- a/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java +++ b/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java @@ -16,11 +16,13 @@ import com.example.solidconnection.admin.dto.MentorApplicationSearchCondition; import com.example.solidconnection.admin.dto.MentorApplicationSearchResponse; import com.example.solidconnection.common.exception.CustomException; +import com.example.solidconnection.mentor.domain.Mentor; import com.example.solidconnection.mentor.domain.MentorApplication; import com.example.solidconnection.mentor.domain.MentorApplicationStatus; import com.example.solidconnection.mentor.domain.UniversitySelectType; import com.example.solidconnection.mentor.fixture.MentorApplicationFixture; import com.example.solidconnection.mentor.repository.MentorApplicationRepository; +import com.example.solidconnection.mentor.repository.MentorRepository; import com.example.solidconnection.siteuser.domain.Role; import com.example.solidconnection.siteuser.domain.SiteUser; import com.example.solidconnection.siteuser.fixture.SiteUserFixture; @@ -61,6 +63,9 @@ class AdminMentorApplicationServiceTest { @Autowired private SiteUserRepository siteUserRepository; + @Autowired + private MentorRepository mentorRepository; + private MentorApplication mentorApplication1; private MentorApplication mentorApplication2; private MentorApplication mentorApplication3; @@ -319,11 +324,16 @@ class 멘토_승격_지원서_승인 { // then MentorApplication result = mentorApplicationRepository.findById(mentorApplication2.getId()).get(); - SiteUser mentor = siteUserRepository.findById(result.getSiteUserId()).get(); + SiteUser mentorUser = siteUserRepository.findById(result.getSiteUserId()).get(); + Mentor mentor = mentorRepository.findBySiteUserId(result.getSiteUserId()).get(); assertAll( () -> assertThat(result.getMentorApplicationStatus()).isEqualTo(MentorApplicationStatus.APPROVED), () -> assertThat(result.getApprovedAt()).isNotNull(), - () -> assertThat(mentor.getRole()).isEqualTo(Role.MENTOR) + () -> assertThat(mentorUser.getRole()).isEqualTo(Role.MENTOR), + () -> assertThat(mentor).isNotNull(), + () -> assertThat(mentor.getSiteUserId()).isEqualTo(result.getSiteUserId()), + () -> assertThat(mentor.getUniversityId()).isEqualTo(result.getUniversityId()), + () -> assertThat(mentor.getTermId()).isEqualTo(result.getTermId()) ); } From 0c380d1dc735cd7f5c795124527628151a9f0ca6 Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Sat, 7 Feb 2026 00:46:03 +0900 Subject: [PATCH 3/5] =?UTF-8?q?fix:=20=EB=A9=98=ED=86=A0=EC=9D=98=20introd?= =?UTF-8?q?uction,=20passTip=20null=20=ED=97=88=EC=9A=A9=ED=95=98=EB=8F=84?= =?UTF-8?q?=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - not null 인 필드에 빈문자열로 값을 채우는 것 보다, null 허용이 더 의미 있다 판단하여 null 을 허용하도록 하였습니다. --- .../admin/service/AdminMentorApplicationService.java | 4 ++-- .../com/example/solidconnection/mentor/domain/Mentor.java | 4 ++-- .../V44__modify_mentor_introduction_pass_tip_nullable.sql | 5 +++++ 3 files changed, 9 insertions(+), 4 deletions(-) create mode 100644 src/main/resources/db/migration/V44__modify_mentor_introduction_pass_tip_nullable.sql diff --git a/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java b/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java index a49b3169..98581aae 100644 --- a/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java +++ b/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java @@ -56,8 +56,8 @@ public void approveMentorApplication(Long mentorApplicationId) { siteUser.becomeMentor(); Mentor mentor = new Mentor( - "", - "", + null, + null, siteUser.getId(), mentorApplication.getUniversityId(), mentorApplication.getTermId() diff --git a/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java b/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java index 30dbfec2..ba8507c3 100644 --- a/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java +++ b/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java @@ -33,10 +33,10 @@ public class Mentor extends BaseEntity { @Column private boolean hasBadge = false; - @Column(length = 1000, nullable = false) + @Column(length = 1000) private String introduction; - @Column(length = 1000, nullable = false) + @Column(length = 1000) private String passTip; @Column diff --git a/src/main/resources/db/migration/V44__modify_mentor_introduction_pass_tip_nullable.sql b/src/main/resources/db/migration/V44__modify_mentor_introduction_pass_tip_nullable.sql new file mode 100644 index 00000000..e81eb049 --- /dev/null +++ b/src/main/resources/db/migration/V44__modify_mentor_introduction_pass_tip_nullable.sql @@ -0,0 +1,5 @@ +ALTER TABLE mentor + MODIFY introduction VARCHAR(1000) NULL; + +ALTER TABLE mentor + MODIFY pass_tip VARCHAR(1000) NULL; From 99b64a11e75342a6e13d3aa36dbcd23e04ecc650 Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Sat, 7 Feb 2026 01:01:30 +0900 Subject: [PATCH 4/5] =?UTF-8?q?fix:=20=EC=82=AC=EC=9A=A9=ED=95=98=EC=A7=80?= =?UTF-8?q?=20=EC=95=8A=EB=8A=94=20=20=EB=A9=98=ED=86=A0=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20api=20=EC=A0=9C=EA=B1=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 멘토 생성의 주체가 어드민으로 변경되어 Mentor 도메인의 Mentor 생성 api 를 제거 --- .../controller/MentorMyPageController.java | 12 -- .../solidconnection/mentor/domain/Mentor.java | 7 -- .../mentor/dto/MentorMyPageCreateRequest.java | 20 --- .../mentor/service/MentorMyPageService.java | 40 +----- .../service/MentorMyPageServiceTest.java | 116 ------------------ 5 files changed, 1 insertion(+), 194 deletions(-) delete mode 100644 src/main/java/com/example/solidconnection/mentor/dto/MentorMyPageCreateRequest.java diff --git a/src/main/java/com/example/solidconnection/mentor/controller/MentorMyPageController.java b/src/main/java/com/example/solidconnection/mentor/controller/MentorMyPageController.java index 76c951a7..dd9289a3 100644 --- a/src/main/java/com/example/solidconnection/mentor/controller/MentorMyPageController.java +++ b/src/main/java/com/example/solidconnection/mentor/controller/MentorMyPageController.java @@ -1,7 +1,6 @@ package com.example.solidconnection.mentor.controller; import com.example.solidconnection.common.resolver.AuthorizedUser; -import com.example.solidconnection.mentor.dto.MentorMyPageCreateRequest; import com.example.solidconnection.mentor.dto.MentorMyPageResponse; import com.example.solidconnection.mentor.dto.MentorMyPageUpdateRequest; import com.example.solidconnection.mentor.service.MentorMyPageService; @@ -11,7 +10,6 @@ import lombok.RequiredArgsConstructor; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.PutMapping; import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; @@ -42,14 +40,4 @@ public ResponseEntity updateMentorMyPage( mentorMyPageService.updateMentorMyPage(siteUserId, mentorMyPageUpdateRequest); return ResponseEntity.ok().build(); } - - @RequireRoleAccess(roles = Role.MENTOR) - @PostMapping - public ResponseEntity createMentorMyPage( - @AuthorizedUser long siteUserId, - @Valid @RequestBody MentorMyPageCreateRequest request - ) { - mentorMyPageService.createMentorMyPage(siteUserId, request); - return ResponseEntity.ok().build(); - } } diff --git a/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java b/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java index ba8507c3..5caba230 100644 --- a/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java +++ b/src/main/java/com/example/solidconnection/mentor/domain/Mentor.java @@ -96,11 +96,4 @@ public void updateChannels(List channels) { } } } - - public void createChannels(List channels) { - for(Channel channel : channels) { - channel.updateMentor(this); - this.channels.add(channel); - } - } } diff --git a/src/main/java/com/example/solidconnection/mentor/dto/MentorMyPageCreateRequest.java b/src/main/java/com/example/solidconnection/mentor/dto/MentorMyPageCreateRequest.java deleted file mode 100644 index be0269b2..00000000 --- a/src/main/java/com/example/solidconnection/mentor/dto/MentorMyPageCreateRequest.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.example.solidconnection.mentor.dto; - -import jakarta.validation.Valid; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import java.util.List; - -public record MentorMyPageCreateRequest( - @NotBlank(message = "자기소개를 입력해주세요.") - String introduction, - - @NotBlank(message = "합격 레시피를 입력해주세요.") - String passTip, - - @NotNull - @Valid - List channels -) { - -} diff --git a/src/main/java/com/example/solidconnection/mentor/service/MentorMyPageService.java b/src/main/java/com/example/solidconnection/mentor/service/MentorMyPageService.java index f32c1012..ed24fd79 100644 --- a/src/main/java/com/example/solidconnection/mentor/service/MentorMyPageService.java +++ b/src/main/java/com/example/solidconnection/mentor/service/MentorMyPageService.java @@ -1,8 +1,6 @@ package com.example.solidconnection.mentor.service; import static com.example.solidconnection.common.exception.ErrorCode.CHANNEL_REGISTRATION_LIMIT_EXCEEDED; -import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_ALREADY_EXISTS; -import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_APPLICATION_NOT_FOUND; import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_NOT_FOUND; import static com.example.solidconnection.common.exception.ErrorCode.TERM_NOT_FOUND; import static com.example.solidconnection.common.exception.ErrorCode.UNIVERSITY_NOT_FOUND; @@ -11,10 +9,7 @@ import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.mentor.domain.Channel; import com.example.solidconnection.mentor.domain.Mentor; -import com.example.solidconnection.mentor.domain.MentorApplication; -import com.example.solidconnection.mentor.domain.MentorApplicationStatus; import com.example.solidconnection.mentor.dto.ChannelRequest; -import com.example.solidconnection.mentor.dto.MentorMyPageCreateRequest; import com.example.solidconnection.mentor.dto.MentorMyPageResponse; import com.example.solidconnection.mentor.dto.MentorMyPageUpdateRequest; import com.example.solidconnection.mentor.repository.MentorApplicationRepository; @@ -65,50 +60,17 @@ public void updateMentorMyPage(long siteUserId, MentorMyPageUpdateRequest reques mentor.updateIntroduction(request.introduction()); mentor.updatePassTip(request.passTip()); - updateChannel(request.channels(), mentor); - } - private void updateChannel(List channelRequests, Mentor mentor) { - List newChannels = buildChannels(channelRequests); + List newChannels = buildChannels(request.channels()); mentor.updateChannels(newChannels); } - @Transactional - public void createMentorMyPage(long siteUserId, MentorMyPageCreateRequest request) { - validateUserCanCreateMentor(siteUserId); - validateChannelRegistrationLimit(request.channels()); - MentorApplication mentorApplication = mentorApplicationRepository.findBySiteUserIdAndMentorApplicationStatus(siteUserId, MentorApplicationStatus.APPROVED) - .orElseThrow(() -> new CustomException(MENTOR_APPLICATION_NOT_FOUND)); - - Mentor mentor = new Mentor( - request.introduction(), - request.passTip(), - siteUserId, - mentorApplication.getUniversityId(), - mentorApplication.getTermId() - ); - - createChannels(request.channels(), mentor); - mentorRepository.save(mentor); - } - - private void validateUserCanCreateMentor(long siteUserId) { - if (mentorRepository.existsBySiteUserId(siteUserId)) { - throw new CustomException(MENTOR_ALREADY_EXISTS); - } - } - private void validateChannelRegistrationLimit(List channelRequests) { if (channelRequests.size() > CHANNEL_REGISTRATION_LIMIT) { throw new CustomException(CHANNEL_REGISTRATION_LIMIT_EXCEEDED); } } - private void createChannels(List channelRequests, Mentor mentor) { - List newChannels = buildChannels(channelRequests); - mentor.createChannels(newChannels); - } - private List buildChannels(List channelRequests) { int sequence = CHANNEL_SEQUENCE_START_NUMBER; List newChannels = new ArrayList<>(); diff --git a/src/test/java/com/example/solidconnection/mentor/service/MentorMyPageServiceTest.java b/src/test/java/com/example/solidconnection/mentor/service/MentorMyPageServiceTest.java index 71eab1b7..dd3d853e 100644 --- a/src/test/java/com/example/solidconnection/mentor/service/MentorMyPageServiceTest.java +++ b/src/test/java/com/example/solidconnection/mentor/service/MentorMyPageServiceTest.java @@ -1,24 +1,15 @@ package com.example.solidconnection.mentor.service; -import static com.example.solidconnection.common.exception.ErrorCode.CHANNEL_REGISTRATION_LIMIT_EXCEEDED; -import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_ALREADY_EXISTS; -import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_APPLICATION_NOT_FOUND; import static com.example.solidconnection.mentor.domain.ChannelType.BLOG; -import static com.example.solidconnection.mentor.domain.ChannelType.BRUNCH; import static com.example.solidconnection.mentor.domain.ChannelType.INSTAGRAM; -import static com.example.solidconnection.mentor.domain.ChannelType.YOUTUBE; import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatCode; import static org.assertj.core.api.Assertions.tuple; import static org.junit.jupiter.api.Assertions.assertAll; -import com.example.solidconnection.common.exception.CustomException; import com.example.solidconnection.mentor.domain.Channel; import com.example.solidconnection.mentor.domain.Mentor; -import com.example.solidconnection.mentor.domain.UniversitySelectType; import com.example.solidconnection.mentor.dto.ChannelRequest; import com.example.solidconnection.mentor.dto.ChannelResponse; -import com.example.solidconnection.mentor.dto.MentorMyPageCreateRequest; import com.example.solidconnection.mentor.dto.MentorMyPageResponse; import com.example.solidconnection.mentor.dto.MentorMyPageUpdateRequest; import com.example.solidconnection.mentor.fixture.ChannelFixture; @@ -172,111 +163,4 @@ class 멘토의_마이_페이지를_수정한다 { ); } } - - @Nested - class 멘토의_마이페이지를_생성한다 { - - @Test - void 멘토_정보를_생성한다() { - // given - String introduction = "멘토 자기소개"; - String passTip = "멘토의 합격 팁"; - List channels = List.of( - new ChannelRequest(BLOG, "https://blog.com"), - new ChannelRequest(INSTAGRAM, "https://instagram.com"), - new ChannelRequest(YOUTUBE, "https://youtubr.com"), - new ChannelRequest(BRUNCH, "https://brunch.com") - ); - MentorMyPageCreateRequest request = new MentorMyPageCreateRequest(introduction, passTip, channels); - mentorApplicationFixture.승인된_멘토신청(siteUser.getId(), UniversitySelectType.CATALOG, university.getId()); - - // when - mentorMyPageService.createMentorMyPage(siteUser.getId(), request); - - // then - Mentor createMentor = mentorRepository.findBySiteUserId(siteUser.getId()).get(); - List createChannels = channelRepositoryForTest.findAllByMentorId(createMentor.getId()); - assertAll( - () -> assertThat(createMentor.getIntroduction()).isEqualTo(introduction), - () -> assertThat(createMentor.getPassTip()).isEqualTo(passTip), - () -> assertThat(createMentor.getTermId()).isEqualTo(term.getId()), - () -> assertThat(createMentor.getUniversityId()).isEqualTo(university.getId()), - () -> assertThat(createMentor.getSiteUserId()).isEqualTo(siteUser.getId()), - () -> assertThat(createMentor.getMenteeCount()).isEqualTo(0), - () -> assertThat(createMentor.isHasBadge()).isFalse(), - () -> assertThat(createChannels).extracting(Channel::getSequence, Channel::getType, Channel::getUrl) - .containsExactlyInAnyOrder( - tuple(1, BLOG, "https://blog.com"), - tuple(2, INSTAGRAM, "https://instagram.com"), - tuple(3, YOUTUBE, "https://youtubr.com"), - tuple(4, BRUNCH, "https://brunch.com") - ) - ); - } - - @Test - void 이미_멘토_정보가_존재하는데_생성_요청_시_예외가_발생한다() { - // given - MentorMyPageCreateRequest request = new MentorMyPageCreateRequest("introduction", "passTip", List.of()); - mentorFixture.멘토(siteUser.getId(), university.getId()); - - // when & then - assertThatCode(() -> mentorMyPageService.createMentorMyPage(siteUser.getId(), request)) - .isInstanceOf(CustomException.class) - .hasMessage(MENTOR_ALREADY_EXISTS.getMessage()); - } - - @Test - void 채널을_제한_이상_생성하면_예외가_발생한다() { - // given - List newChannels = List.of( - new ChannelRequest(BLOG, "https://blog.com"), - new ChannelRequest(INSTAGRAM, "https://instagram.com"), - new ChannelRequest(YOUTUBE, "https://youtubr.com"), - new ChannelRequest(BRUNCH, "https://brunch.com"), - new ChannelRequest(BLOG, "https://blog.com") - ); - MentorMyPageCreateRequest request = new MentorMyPageCreateRequest("introduction", "passTip", newChannels); - - // when & then - assertThatCode(() -> mentorMyPageService.createMentorMyPage(siteUser.getId(), request)) - .isInstanceOf(CustomException.class) - .hasMessage(CHANNEL_REGISTRATION_LIMIT_EXCEEDED.getMessage()); - } - - @Test - void 멘토_승격_요청_없이_멘토_정보_생성_시_예외가_발생한다() { - // given - MentorMyPageCreateRequest request = new MentorMyPageCreateRequest("introduction", "passTip", List.of()); - - // when & then - assertThatCode(() -> mentorMyPageService.createMentorMyPage(siteUser.getId(), request)) - .isInstanceOf(CustomException.class) - .hasMessage(MENTOR_APPLICATION_NOT_FOUND.getMessage()); - } - - @Test - void 멘토_승격_요청_상태가_REJECTED_면_예외가_발생한다() { - // given - MentorMyPageCreateRequest request = new MentorMyPageCreateRequest("introduction", "passTip", List.of()); - mentorApplicationFixture.거절된_멘토신청(siteUser.getId(), UniversitySelectType.CATALOG, university.getId()); - - // when & then - assertThatCode(() -> mentorMyPageService.createMentorMyPage(siteUser.getId(), request)) - .isInstanceOf(CustomException.class) - .hasMessage(MENTOR_APPLICATION_NOT_FOUND.getMessage()); - } - - @Test - void 멘토_승격_요청_상태가_PENDING_면_예외가_발생한다() { - // given - MentorMyPageCreateRequest request = new MentorMyPageCreateRequest("introduction", "passTip", List.of()); - mentorApplicationFixture.대기중_멘토신청(siteUser.getId(), UniversitySelectType.CATALOG, university.getId()); - - // when & then - assertThatCode(() -> mentorMyPageService.createMentorMyPage(siteUser.getId(), request)) - .isInstanceOf(CustomException.class) - .hasMessage(MENTOR_APPLICATION_NOT_FOUND.getMessage()); - } - } } From 828f2a5f8b2883d13a966686e582187c79da1455 Mon Sep 17 00:00:00 2001 From: sukangpunch Date: Sat, 7 Feb 2026 01:32:49 +0900 Subject: [PATCH 5/5] =?UTF-8?q?feat:=20=EB=A9=98=ED=86=A0=20=EC=A7=80?= =?UTF-8?q?=EC=9B=90=EC=84=9C=20=EC=8A=B9=EC=9D=B8=20=EC=98=88=EC=99=B8?= =?UTF-8?q?=EC=B2=98=EB=A6=AC=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 중복 멘토 생성 예외 처리 및 테스트 추가 --- .../AdminMentorApplicationService.java | 10 ++++++++-- .../AdminMentorApplicationServiceTest.java | 19 +++++++++++++++++++ 2 files changed, 27 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java b/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java index 98581aae..f12aca28 100644 --- a/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java +++ b/src/main/java/com/example/solidconnection/admin/service/AdminMentorApplicationService.java @@ -1,5 +1,6 @@ package com.example.solidconnection.admin.service; +import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_ALREADY_EXISTS; import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_APPLICATION_NOT_FOUND; import static com.example.solidconnection.common.exception.ErrorCode.USER_NOT_FOUND; @@ -47,14 +48,13 @@ public Page searchMentorApplications( public void approveMentorApplication(Long mentorApplicationId) { MentorApplication mentorApplication = mentorApplicationRepository.findById(mentorApplicationId) .orElseThrow(() -> new CustomException(MENTOR_APPLICATION_NOT_FOUND)); - mentorApplication.approve(); SiteUser siteUser = siteUserRepository.findById(mentorApplication.getSiteUserId()) .orElseThrow(() -> new CustomException(USER_NOT_FOUND)); + validateUserCanCreateMentor(siteUser.getId()); siteUser.becomeMentor(); - Mentor mentor = new Mentor( null, null, @@ -66,6 +66,12 @@ public void approveMentorApplication(Long mentorApplicationId) { mentorRepository.save(mentor); } + private void validateUserCanCreateMentor(long siteUserId) { + if (mentorRepository.existsBySiteUserId(siteUserId)) { + throw new CustomException(MENTOR_ALREADY_EXISTS); + } + } + @Transactional public void rejectMentorApplication( Long mentorApplicationId, diff --git a/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java b/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java index 5a214092..c9029c49 100644 --- a/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java +++ b/src/test/java/com/example/solidconnection/admin/service/AdminMentorApplicationServiceTest.java @@ -1,5 +1,6 @@ package com.example.solidconnection.admin.service; +import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_ALREADY_EXISTS; import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_APPLICATION_ALREADY_CONFIRMED; import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_APPLICATION_NOT_FOUND; import static com.example.solidconnection.common.exception.ErrorCode.MENTOR_APPLICATION_NOT_OTHER_STATUS; @@ -21,6 +22,7 @@ import com.example.solidconnection.mentor.domain.MentorApplicationStatus; import com.example.solidconnection.mentor.domain.UniversitySelectType; import com.example.solidconnection.mentor.fixture.MentorApplicationFixture; +import com.example.solidconnection.mentor.fixture.MentorFixture; import com.example.solidconnection.mentor.repository.MentorApplicationRepository; import com.example.solidconnection.mentor.repository.MentorRepository; import com.example.solidconnection.siteuser.domain.Role; @@ -54,6 +56,9 @@ class AdminMentorApplicationServiceTest { @Autowired private MentorApplicationFixture mentorApplicationFixture; + @Autowired + private MentorFixture mentorFixture; + @Autowired private UniversityFixture universityFixture; @@ -381,6 +386,20 @@ class 멘토_승격_지원서_승인 { .isInstanceOf(CustomException.class) .hasMessage(MENTOR_APPLICATION_NOT_FOUND.getMessage()); } + + @Test + void 이미_멘토인_사용자의_지원서를_승인하면_예외가_발생한다() { + // given + SiteUser user = siteUserFixture.사용자(); + HostUniversity university = universityFixture.메이지_대학(); + MentorApplication pendingApplication = mentorApplicationFixture.대기중_멘토신청(user.getId(), UniversitySelectType.CATALOG, university.getId()); + mentorFixture.멘토(user.getId(), university.getId()); + + // when & then + assertThatCode(() -> adminMentorApplicationService.approveMentorApplication(pendingApplication.getId())) + .isInstanceOf(CustomException.class) + .hasMessage(MENTOR_ALREADY_EXISTS.getMessage()); + } } @Nested