Skip to content

Commit d648c42

Browse files
dooongdaengsso0omluckheetlswltjqdbfgml2000
authored
Feat/262 (#335)
* fix: DB 외래키 문제 발생 로직 주석 처리 * fix: 기존과 동일하게 트랜잭션 처리하도록 수정 * Revert "[Fix] 운영 DB 외래키 문제 제" * feat:모든멘토 조회 --------- Co-authored-by: sso0om <[email protected]> Co-authored-by: 석희성 <[email protected]> Co-authored-by: 신지섭 <[email protected]> Co-authored-by: dbfgml20 <[email protected]> Co-authored-by: dbfgml20 <[email protected]>
1 parent 6b7b0c0 commit d648c42

File tree

6 files changed

+163
-5
lines changed

6 files changed

+163
-5
lines changed

back/src/main/java/com/back/domain/member/member/controller/MemberAuthController.java

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,6 @@
11
package com.back.domain.member.member.controller;
22

3-
import com.back.domain.member.member.dto.MenteeSignupRequest;
4-
import com.back.domain.member.member.dto.MentorSignupVerifyRequest;
5-
import com.back.domain.member.member.dto.MentorVerificationRequest;
6-
import com.back.domain.member.member.dto.LoginRequest;
7-
import com.back.domain.member.member.dto.MemberMeResponse;
3+
import com.back.domain.member.member.dto.*;
84
import com.back.domain.member.member.entity.Member;
95
import com.back.domain.member.member.service.MemberService;
106
import com.back.global.rq.Rq;
@@ -119,4 +115,14 @@ public RsData<Void> withdrawMember() {
119115
return new RsData<>("200-7", "회원 탈퇴가 완료되었습니다.");
120116
}
121117

118+
@GetMapping("/mentors")
119+
@Operation(summary = "모든 멘토 조회")
120+
public RsData<MentorPagingResponse> getAllMentors(
121+
@RequestParam(defaultValue = "0") int page,
122+
@RequestParam(defaultValue = "10") int size
123+
) {
124+
MentorPagingResponse response = memberService.getAllMentors(page, size);
125+
return new RsData<>("200-8", "멘토 목록 조회 성공", response);
126+
}
127+
122128
}
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package com.back.domain.member.member.dto;
2+
3+
import com.back.domain.member.mentor.entity.Mentor;
4+
5+
public record MentorListResponse(
6+
Long mentorId,
7+
Long memberId,
8+
String name,
9+
String nickname,
10+
String job,
11+
Integer careerYears,
12+
Double rate
13+
) {
14+
public static MentorListResponse from(Mentor mentor) {
15+
return new MentorListResponse(
16+
mentor.getId(),
17+
mentor.getMember().getId(),
18+
mentor.getMember().getName(),
19+
mentor.getMember().getNickname(),
20+
mentor.getJob() != null ? mentor.getJob().getName() : null,
21+
mentor.getCareerYears(),
22+
mentor.getRate()
23+
);
24+
}
25+
}
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package com.back.domain.member.member.dto;
2+
3+
import io.swagger.v3.oas.annotations.media.Schema;
4+
import org.springframework.data.domain.Page;
5+
6+
import java.util.List;
7+
8+
public record MentorPagingResponse(
9+
@Schema(description = "멘토 목록")
10+
List<MentorListResponse> mentors,
11+
@Schema(description = "현재 페이지 (0부터 시작)")
12+
int currentPage,
13+
@Schema(description = "총 페이지")
14+
int totalPage,
15+
@Schema(description = "총 개수")
16+
long totalElements,
17+
@Schema(description = "다음 페이지 존재 여부")
18+
boolean hasNext
19+
) {
20+
21+
public static MentorPagingResponse from(Page<MentorListResponse> page) {
22+
return new MentorPagingResponse(
23+
page.getContent(),
24+
page.getNumber(),
25+
page.getTotalPages(),
26+
page.getTotalElements(),
27+
page.hasNext()
28+
);
29+
}
30+
}

back/src/main/java/com/back/domain/member/member/service/MemberService.java

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.springframework.stereotype.Service;
1919
import org.springframework.transaction.annotation.Transactional;
2020

21+
import java.util.List;
2122
import java.util.Map;
2223
import java.util.Optional;
2324

@@ -389,4 +390,21 @@ private void validateNicknameDuplicate(String nickname, Member currentMember) {
389390
}
390391
}
391392

393+
public MentorPagingResponse getAllMentors(int page, int size) {
394+
List<Mentor> allMentors = mentorRepository.findAllActiveWithMemberAndJob();
395+
396+
int start = page * size;
397+
int end = Math.min(start + size, allMentors.size());
398+
List<Mentor> pagedMentors = allMentors.subList(start, end);
399+
400+
Page<Mentor> mentorPage = new org.springframework.data.domain.PageImpl<>(
401+
pagedMentors,
402+
PageRequest.of(page, size),
403+
allMentors.size()
404+
);
405+
406+
Page<MentorListResponse> responsePage = mentorPage.map(MentorListResponse::from);
407+
return MentorPagingResponse.from(responsePage);
408+
}
409+
392410
}

back/src/main/java/com/back/domain/member/mentor/repository/MentorRepository.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
import org.springframework.data.jpa.repository.Query;
66
import org.springframework.data.repository.query.Param;
77

8+
import java.util.List;
89
import java.util.Optional;
910

1011
public interface MentorRepository extends JpaRepository<Mentor, Long> {
@@ -21,4 +22,8 @@ public interface MentorRepository extends JpaRepository<Mentor, Long> {
2122
// 삭제된 멘토 포함 조회 (관리자용)
2223
@Query("SELECT m FROM Mentor m LEFT JOIN FETCH m.job WHERE m.member.id = :memberId")
2324
Optional<Mentor> findByMemberIdIncludingDeleted(@Param("memberId") Long memberId);
25+
26+
// 모든 활성 멘토 조회 (member, job fetch join)
27+
@Query("SELECT m FROM Mentor m JOIN FETCH m.member LEFT JOIN FETCH m.job WHERE m.isDeleted = false ORDER BY m.id DESC")
28+
List<Mentor> findAllActiveWithMemberAndJob();
2429
}

back/src/test/java/com/back/domain/member/member/controller/MemberAuthControllerTest.java

Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -567,4 +567,78 @@ void t13() throws Exception {
567567

568568
// TODO: 마이페이지 관련 테스트들은 MemberMyPageControllerTest로 이동됨
569569

570+
@Test
571+
@DisplayName("모든 멘토 조회 - 페이징 처리")
572+
void t14() throws Exception {
573+
// 여러 멘토 생성
574+
memberService.joinMentor("[email protected]", "멘토1", "멘토닉네임1", "password123", "Backend", 5);
575+
memberService.joinMentor("[email protected]", "멘토2", "멘토닉네임2", "password123", "Frontend", 3);
576+
memberService.joinMentor("[email protected]", "멘토3", "멘토닉네임3", "password123", "DevOps", 7);
577+
578+
// 멘토 목록 조회
579+
ResultActions result = mvc
580+
.perform(
581+
get("/auth/mentors")
582+
.param("page", "0")
583+
.param("size", "10")
584+
)
585+
.andDo(print());
586+
587+
result
588+
.andExpect(status().is2xxSuccessful())
589+
.andExpect(jsonPath("$.resultCode").value("200-8"))
590+
.andExpect(jsonPath("$.msg").value("멘토 목록 조회 성공"))
591+
.andExpect(jsonPath("$.data.mentors").isArray())
592+
.andExpect(jsonPath("$.data.mentors.length()").value(4))
593+
.andExpect(jsonPath("$.data.currentPage").value(0))
594+
.andExpect(jsonPath("$.data.totalElements").value(4))
595+
.andExpect(jsonPath("$.data.hasNext").value(false));
596+
}
597+
598+
@Test
599+
@DisplayName("모든 멘토 조회 - 페이지 크기 조정")
600+
void t16() throws Exception {
601+
// 5명의 멘토 생성
602+
for (int i = 1; i <= 5; i++) {
603+
memberService.joinMentor("mentor" + i + "@example.com", "멘토" + i, "멘토닉네임" + i, "password123", "Backend", i);
604+
}
605+
606+
// 페이지 크기를 2로 설정하여 첫 페이지 조회
607+
ResultActions result = mvc
608+
.perform(
609+
get("/auth/mentors")
610+
.param("page", "0")
611+
.param("size", "2")
612+
)
613+
.andDo(print());
614+
615+
result
616+
.andExpect(status().is2xxSuccessful())
617+
.andExpect(jsonPath("$.data.mentors.length()").value(2))
618+
.andExpect(jsonPath("$.data.totalElements").value(6))
619+
.andExpect(jsonPath("$.data.totalPage").value(3))
620+
.andExpect(jsonPath("$.data.hasNext").value(true));
621+
}
622+
623+
@Test
624+
@DisplayName("모든 멘토 조회 - 멘토 정보 확인")
625+
void t17() throws Exception {
626+
// 멘토 생성
627+
memberService.joinMentor("[email protected]", "상세멘토", "상세닉네임", "password123", "Backend", 10);
628+
629+
// 멘토 목록 조회
630+
ResultActions result = mvc
631+
.perform(get("/auth/mentors"))
632+
.andDo(print());
633+
634+
result
635+
.andExpect(status().is2xxSuccessful())
636+
.andExpect(jsonPath("$.data.mentors[0].name").value("상세멘토"))
637+
.andExpect(jsonPath("$.data.mentors[0].nickname").value("상세닉네임"))
638+
.andExpect(jsonPath("$.data.mentors[0].job").value("Backend"))
639+
.andExpect(jsonPath("$.data.mentors[0].careerYears").value(10))
640+
.andExpect(jsonPath("$.data.mentors[0].mentorId").isNotEmpty())
641+
.andExpect(jsonPath("$.data.mentors[0].memberId").isNotEmpty());
642+
}
643+
570644
}

0 commit comments

Comments
 (0)