Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
37 commits
Select commit Hold shift + click to select a range
bc2e837
Merge pull request #126 from prgrms-web-devcourse-final-project/develop
sso0om Sep 30, 2025
7e7ab91
Merge pull request #134 from prgrms-web-devcourse-final-project/develop
luckhee Oct 1, 2025
cd988fd
Merge pull request #138 from prgrms-web-devcourse-final-project/develop
dooongdaeng Oct 2, 2025
dfde0a5
Merge pull request #156 from prgrms-web-devcourse-final-project/develop
sso0om Oct 3, 2025
8f1f2cb
๋ฉ”์ธ ๋จธ์ง€ (10/9) Merge pull request #169
sso0om Oct 9, 2025
a840e30
๋ฉ”์ธ ๋จธ์ง€(10/10) Merge pull request #183
sso0om Oct 10, 2025
bb9c696
Merge pull request #192 from prgrms-web-devcourse-final-project/develop
tlswltjq Oct 11, 2025
c9f1a92
๋ฉ”์ธ ๋จธ์ง€(10/12) Merge pull request #196
sso0om Oct 12, 2025
e92748f
Merge pull request #207 from prgrms-web-devcourse-final-project/develop
dooongdaeng Oct 12, 2025
d3ecc9e
Merge pull request #213 from prgrms-web-devcourse-final-project/develop
dbfgml2000 Oct 12, 2025
dcdd0d6
Merge pull request #216 from prgrms-web-devcourse-final-project/develop
tlswltjq Oct 13, 2025
61873a7
Merge pull request #225 from prgrms-web-devcourse-final-project/develop
dbfgml2000 Oct 13, 2025
c3d79a6
Merge pull request #228 from prgrms-web-devcourse-final-project/develop
dbfgml2000 Oct 13, 2025
f3084f9
Merge pull request #242 from prgrms-web-devcourse-final-project/develop
tlswltjq Oct 13, 2025
1d84377
Merge pull request #244 from prgrms-web-devcourse-final-project/develop
dooongdaeng Oct 13, 2025
84493ae
Merge pull request #248 from prgrms-web-devcourse-final-project/develop
dooongdaeng Oct 13, 2025
b61d5f5
Merge pull request #251 from prgrms-web-devcourse-final-project/develop
dooongdaeng Oct 13, 2025
400c803
Merge pull request #253 from prgrms-web-devcourse-final-project/develop
sso0om Oct 13, 2025
41b149b
Merge pull request #255 from prgrms-web-devcourse-final-project/develop
sso0om Oct 13, 2025
b73155d
Merge pull request #257 from prgrms-web-devcourse-final-project/develop
dooongdaeng Oct 13, 2025
90daaf5
Merge pull request #261 from prgrms-web-devcourse-final-project/develop
dooongdaeng Oct 13, 2025
627a551
Merge pull request #264 from prgrms-web-devcourse-final-project/develop
dbfgml2000 Oct 13, 2025
5bd7e5f
fix: DB ์™ธ๋ž˜ํ‚ค ๋ฌธ์ œ ๋ฐœ์ƒ ๋กœ์ง ์ฃผ์„ ์ฒ˜๋ฆฌ
dbfgml2000 Oct 13, 2025
30802b5
fix: ๊ธฐ์กด๊ณผ ๋™์ผํ•˜๊ฒŒ ํŠธ๋žœ์žญ์…˜ ์ฒ˜๋ฆฌํ•˜๋„๋ก ์ˆ˜์ •
dbfgml2000 Oct 13, 2025
108dd42
Merge pull request #266 from prgrms-web-devcourse-final-project/fix/265
dbfgml2000 Oct 13, 2025
09ce727
Revert "[Fix] ์šด์˜ DB ์™ธ๋ž˜ํ‚ค ๋ฌธ์ œ ์ œ"
dbfgml2000 Oct 13, 2025
7171f78
Merge pull request #267 from prgrms-web-devcourse-final-project/reverโ€ฆ
dbfgml2000 Oct 13, 2025
50854a1
Merge pull request #269 from prgrms-web-devcourse-final-project/develop
dbfgml2000 Oct 13, 2025
e4a0f7d
Merge pull request #272 from prgrms-web-devcourse-final-project/develop
dooongdaeng Oct 13, 2025
23467fb
Merge branch 'develop' of https://github.com/prgrms-web-devcourse-finโ€ฆ
dooongdaeng Oct 14, 2025
a991648
Merge branch 'develop' of https://github.com/prgrms-web-devcourse-finโ€ฆ
dooongdaeng Oct 14, 2025
6d8a312
Merge branch 'develop' of https://github.com/prgrms-web-devcourse-finโ€ฆ
dooongdaeng Oct 14, 2025
e0f7d1d
Merge branch 'develop' of https://github.com/prgrms-web-devcourse-finโ€ฆ
dooongdaeng Oct 14, 2025
f4a4110
Merge branch 'develop' of https://github.com/prgrms-web-devcourse-finโ€ฆ
dooongdaeng Oct 14, 2025
a0d3062
Merge branch 'develop' of https://github.com/prgrms-web-devcourse-finโ€ฆ
dooongdaeng Oct 14, 2025
9fe01ba
feat:๋ชจ๋“ ๋ฉ˜ํ†  ์กฐํšŒ
dooongdaeng Oct 14, 2025
aa1059a
Merge branch 'develop' of https://github.com/prgrms-web-devcourse-finโ€ฆ
dooongdaeng Oct 14, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,10 +1,6 @@
package com.back.domain.member.member.controller;

import com.back.domain.member.member.dto.MenteeSignupRequest;
import com.back.domain.member.member.dto.MentorSignupVerifyRequest;
import com.back.domain.member.member.dto.MentorVerificationRequest;
import com.back.domain.member.member.dto.LoginRequest;
import com.back.domain.member.member.dto.MemberMeResponse;
import com.back.domain.member.member.dto.*;
import com.back.domain.member.member.entity.Member;
import com.back.domain.member.member.service.MemberService;
import com.back.global.rq.Rq;
Expand Down Expand Up @@ -119,4 +115,14 @@ public RsData<Void> withdrawMember() {
return new RsData<>("200-7", "ํšŒ์› ํƒˆํ‡ด๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.");
}

@GetMapping("/mentors")
@Operation(summary = "๋ชจ๋“  ๋ฉ˜ํ†  ์กฐํšŒ")
public RsData<MentorPagingResponse> getAllMentors(
@RequestParam(defaultValue = "0") int page,
@RequestParam(defaultValue = "10") int size
) {
MentorPagingResponse response = memberService.getAllMentors(page, size);
return new RsData<>("200-8", "๋ฉ˜ํ†  ๋ชฉ๋ก ์กฐํšŒ ์„ฑ๊ณต", response);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.back.domain.member.member.dto;

import com.back.domain.member.mentor.entity.Mentor;

public record MentorListResponse(
Long mentorId,
Long memberId,
String name,
String nickname,
String job,
Integer careerYears,
Double rate
) {
public static MentorListResponse from(Mentor mentor) {
return new MentorListResponse(
mentor.getId(),
mentor.getMember().getId(),
mentor.getMember().getName(),
mentor.getMember().getNickname(),
mentor.getJob() != null ? mentor.getJob().getName() : null,
mentor.getCareerYears(),
mentor.getRate()
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
package com.back.domain.member.member.dto;

import io.swagger.v3.oas.annotations.media.Schema;
import org.springframework.data.domain.Page;

import java.util.List;

public record MentorPagingResponse(
@Schema(description = "๋ฉ˜ํ†  ๋ชฉ๋ก")
List<MentorListResponse> mentors,
@Schema(description = "ํ˜„์žฌ ํŽ˜์ด์ง€ (0๋ถ€ํ„ฐ ์‹œ์ž‘)")
int currentPage,
@Schema(description = "์ด ํŽ˜์ด์ง€")
int totalPage,
@Schema(description = "์ด ๊ฐœ์ˆ˜")
long totalElements,
@Schema(description = "๋‹ค์Œ ํŽ˜์ด์ง€ ์กด์žฌ ์—ฌ๋ถ€")
boolean hasNext
) {

public static MentorPagingResponse from(Page<MentorListResponse> page) {
return new MentorPagingResponse(
page.getContent(),
page.getNumber(),
page.getTotalPages(),
page.getTotalElements(),
page.hasNext()
);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;
import java.util.Map;
import java.util.Optional;

Expand Down Expand Up @@ -389,4 +390,21 @@ private void validateNicknameDuplicate(String nickname, Member currentMember) {
}
}

public MentorPagingResponse getAllMentors(int page, int size) {
List<Mentor> allMentors = mentorRepository.findAllActiveWithMemberAndJob();

int start = page * size;
int end = Math.min(start + size, allMentors.size());
List<Mentor> pagedMentors = allMentors.subList(start, end);

Page<Mentor> mentorPage = new org.springframework.data.domain.PageImpl<>(
pagedMentors,
PageRequest.of(page, size),
allMentors.size()
);

Page<MentorListResponse> responsePage = mentorPage.map(MentorListResponse::from);
return MentorPagingResponse.from(responsePage);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;
import java.util.Optional;

public interface MentorRepository extends JpaRepository<Mentor, Long> {
Expand All @@ -21,4 +22,8 @@ public interface MentorRepository extends JpaRepository<Mentor, Long> {
// ์‚ญ์ œ๋œ ๋ฉ˜ํ†  ํฌํ•จ ์กฐํšŒ (๊ด€๋ฆฌ์ž์šฉ)
@Query("SELECT m FROM Mentor m LEFT JOIN FETCH m.job WHERE m.member.id = :memberId")
Optional<Mentor> findByMemberIdIncludingDeleted(@Param("memberId") Long memberId);

// ๋ชจ๋“  ํ™œ์„ฑ ๋ฉ˜ํ†  ์กฐํšŒ (member, job fetch join)
@Query("SELECT m FROM Mentor m JOIN FETCH m.member LEFT JOIN FETCH m.job WHERE m.isDeleted = false ORDER BY m.id DESC")
List<Mentor> findAllActiveWithMemberAndJob();
}
Original file line number Diff line number Diff line change
Expand Up @@ -567,4 +567,78 @@ void t13() throws Exception {

// TODO: ๋งˆ์ดํŽ˜์ด์ง€ ๊ด€๋ จ ํ…Œ์ŠคํŠธ๋“ค์€ MemberMyPageControllerTest๋กœ ์ด๋™๋จ

@Test
@DisplayName("๋ชจ๋“  ๋ฉ˜ํ†  ์กฐํšŒ - ํŽ˜์ด์ง• ์ฒ˜๋ฆฌ")
void t14() throws Exception {
// ์—ฌ๋Ÿฌ ๋ฉ˜ํ†  ์ƒ์„ฑ
memberService.joinMentor("[email protected]", "๋ฉ˜ํ† 1", "๋ฉ˜ํ† ๋‹‰๋„ค์ž„1", "password123", "Backend", 5);
memberService.joinMentor("[email protected]", "๋ฉ˜ํ† 2", "๋ฉ˜ํ† ๋‹‰๋„ค์ž„2", "password123", "Frontend", 3);
memberService.joinMentor("[email protected]", "๋ฉ˜ํ† 3", "๋ฉ˜ํ† ๋‹‰๋„ค์ž„3", "password123", "DevOps", 7);

// ๋ฉ˜ํ†  ๋ชฉ๋ก ์กฐํšŒ
ResultActions result = mvc
.perform(
get("/auth/mentors")
.param("page", "0")
.param("size", "10")
)
.andDo(print());

result
.andExpect(status().is2xxSuccessful())
.andExpect(jsonPath("$.resultCode").value("200-8"))
.andExpect(jsonPath("$.msg").value("๋ฉ˜ํ†  ๋ชฉ๋ก ์กฐํšŒ ์„ฑ๊ณต"))
.andExpect(jsonPath("$.data.mentors").isArray())
.andExpect(jsonPath("$.data.mentors.length()").value(4))
.andExpect(jsonPath("$.data.currentPage").value(0))
.andExpect(jsonPath("$.data.totalElements").value(4))
.andExpect(jsonPath("$.data.hasNext").value(false));
}

@Test
@DisplayName("๋ชจ๋“  ๋ฉ˜ํ†  ์กฐํšŒ - ํŽ˜์ด์ง€ ํฌ๊ธฐ ์กฐ์ •")
void t16() throws Exception {
// 5๋ช…์˜ ๋ฉ˜ํ†  ์ƒ์„ฑ
for (int i = 1; i <= 5; i++) {
memberService.joinMentor("mentor" + i + "@example.com", "๋ฉ˜ํ† " + i, "๋ฉ˜ํ† ๋‹‰๋„ค์ž„" + i, "password123", "Backend", i);
}

// ํŽ˜์ด์ง€ ํฌ๊ธฐ๋ฅผ 2๋กœ ์„ค์ •ํ•˜์—ฌ ์ฒซ ํŽ˜์ด์ง€ ์กฐํšŒ
ResultActions result = mvc
.perform(
get("/auth/mentors")
.param("page", "0")
.param("size", "2")
)
.andDo(print());

result
.andExpect(status().is2xxSuccessful())
.andExpect(jsonPath("$.data.mentors.length()").value(2))
.andExpect(jsonPath("$.data.totalElements").value(6))
.andExpect(jsonPath("$.data.totalPage").value(3))
.andExpect(jsonPath("$.data.hasNext").value(true));
}

@Test
@DisplayName("๋ชจ๋“  ๋ฉ˜ํ†  ์กฐํšŒ - ๋ฉ˜ํ†  ์ •๋ณด ํ™•์ธ")
void t17() throws Exception {
// ๋ฉ˜ํ†  ์ƒ์„ฑ
memberService.joinMentor("[email protected]", "์ƒ์„ธ๋ฉ˜ํ† ", "์ƒ์„ธ๋‹‰๋„ค์ž„", "password123", "Backend", 10);

// ๋ฉ˜ํ†  ๋ชฉ๋ก ์กฐํšŒ
ResultActions result = mvc
.perform(get("/auth/mentors"))
.andDo(print());

result
.andExpect(status().is2xxSuccessful())
.andExpect(jsonPath("$.data.mentors[0].name").value("์ƒ์„ธ๋ฉ˜ํ† "))
.andExpect(jsonPath("$.data.mentors[0].nickname").value("์ƒ์„ธ๋‹‰๋„ค์ž„"))
.andExpect(jsonPath("$.data.mentors[0].job").value("Backend"))
.andExpect(jsonPath("$.data.mentors[0].careerYears").value(10))
.andExpect(jsonPath("$.data.mentors[0].mentorId").isNotEmpty())
.andExpect(jsonPath("$.data.mentors[0].memberId").isNotEmpty());
}

}