Skip to content

Commit f077231

Browse files
authored
fix : 파티 도메인 리팩토링 및 테스트 오류 해결 (#70)
* refactor : 사용하지 않는 메서드 제거 * fix : 테스트 오류 해결
1 parent def6c72 commit f077231

File tree

4 files changed

+129
-32
lines changed

4 files changed

+129
-32
lines changed

backend/src/main/java/com/back/domain/party/party/dto/PartyRequestDto.java

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,4 @@ public class PartyRequestDto {
1919
@NotNull(message = "공개 여부는 필수 입력 항목입니다.")
2020
private Boolean isPublicStatus;
2121

22-
// 미션 도메인 완성 시 사용
23-
// private Integer missionId;
2422
}

backend/src/main/java/com/back/domain/party/party/repository/PartyMemberRepository.java

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,24 +15,13 @@ public interface PartyMemberRepository extends JpaRepository<PartyMember, PartyM
1515
// 특정 파티의 모든 파티원 관계를 찾는 메서드
1616
List<PartyMember> findByParty_Id(Integer partyId);
1717

18-
// 특정 회원이 속한 모든 파티원 관계를 찾는 메서드
19-
List<PartyMember> findByMember_Id(Integer memberId);
20-
2118
// 특정 파티의 특정 멤버 관계를 찾는 메서드
2219
Optional<PartyMember> findByParty_IdAndMember_Id(Integer partyId, Integer memberId);
2320

2421
// 특정 파티에 속한 특정 상태의 파티원들을 찾는 메서드
2522
List<PartyMember> findByParty_IdAndStatus(Integer partyId, PartyMemberStatus status);
2623

27-
// 특정 파티에서 가장 오래된 가입자를 찾는 메서드
28-
Optional<PartyMember> findFirstByParty_IdOrderByJoinedAtAsc(Integer partyId);
29-
3024
// 파티원 수 조회용 메서드 추가
3125
long countByParty_IdAndStatus(Integer partyId, PartyMemberStatus status);
3226

33-
// 파티원인지 확인
34-
boolean existsByMemberIdAndPartyId(Integer memberId, Integer partyId);
35-
36-
boolean existsByPartyIdAndMemberIdAndStatus(Integer partyId, Integer memberId, PartyMemberStatus status);
37-
3827
}

backend/src/main/java/com/back/domain/party/party/repository/PartyRepository.java

Lines changed: 2 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -8,29 +8,19 @@
88
import org.springframework.data.jpa.repository.Query;
99
import org.springframework.stereotype.Repository;
1010

11-
import java.util.List;
1211
import java.util.Optional;
1312

1413
@Repository
1514
public interface PartyRepository extends JpaRepository<Party, Integer> {
1615

17-
// 파티 이름으로 파티를 찾는 메서드
18-
Optional<Party> findByName(String name);
19-
20-
// 파티장이 특정 멤버인 파티를 찾는 메서드
21-
Optional<Party> findByLeader_Id(Integer leaderId);
22-
23-
// 공개 파티를 조회하는 메서드
24-
@EntityGraph(attributePaths = "leader")
25-
List<Party> findByIsPublic(boolean isPublic);
26-
2716
@Override
2817
@EntityGraph(attributePaths = {"leader", "partyMembers.member"})
2918
Optional<Party> findById(Integer partyId);
3019

3120
@Query(value = "SELECT DISTINCT p FROM Party p " +
3221
"LEFT JOIN FETCH p.leader l " +
33-
"LEFT JOIN p.partyMembers pm " +
22+
"LEFT JOIN FETCH p.partyMembers pm " +
23+
"LEFT JOIN FETCH pm.member mbm " +
3424
"LEFT JOIN Mission m ON m.party = p " +
3525
"WHERE p.isPublic = true",
3626
countQuery = "SELECT COUNT(p) FROM Party p WHERE p.isPublic = true")

backend/src/test/java/com/back/domain/party/party/controller/ApiV1PartyControllerTest.java

Lines changed: 127 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
import com.back.domain.member.entity.Member;
44
import com.back.domain.member.entity.MemberGender;
55
import com.back.domain.member.repository.MemberRepository;
6+
import com.back.domain.mission.entity.Mission;
7+
import com.back.domain.mission.enums.MissionCategory;
8+
import com.back.domain.mission.enums.MissionType;
9+
import com.back.domain.mission.repository.MissionRepository;
610
import com.back.domain.party.party.dto.InvitationDto;
711
import com.back.domain.party.party.dto.PartyRequestDto;
812
import com.back.domain.party.party.dto.PartyUpdateRequestDto;
@@ -25,6 +29,7 @@
2529
import org.springframework.test.context.ActiveProfiles;
2630
import org.springframework.test.web.servlet.MockMvc;
2731

32+
import java.lang.reflect.Field;
2833
import java.time.LocalDate;
2934
import java.time.LocalDateTime;
3035
import java.util.UUID;
@@ -51,6 +56,9 @@ class ApiV1PartyControllerTest {
5156
@Autowired
5257
private PartyMemberRepository partyMemberRepository;
5358

59+
@Autowired
60+
private MissionRepository missionRepository;
61+
5462
@Autowired
5563
private ObjectMapper objectMapper;
5664

@@ -63,6 +71,7 @@ class ApiV1PartyControllerTest {
6371
@BeforeEach
6472
void setUp() {
6573
partyMemberRepository.deleteAllInBatch();
74+
missionRepository.deleteAllInBatch();
6675
partyRepository.deleteAllInBatch();
6776
memberRepository.deleteAllInBatch();
6877

@@ -100,6 +109,7 @@ void setUp() {
100109
@AfterEach
101110
void tearDown() {
102111
partyMemberRepository.deleteAllInBatch();
112+
missionRepository.deleteAllInBatch();
103113
partyRepository.deleteAllInBatch();
104114
memberRepository.deleteAllInBatch();
105115
}
@@ -154,6 +164,13 @@ void leaveParty_success_integration() throws Exception {
154164
party.setPublic(true);
155165
partyRepository.save(party);
156166

167+
PartyMember leaderMember = new PartyMember();
168+
leaderMember.setParty(party);
169+
leaderMember.setMember(leader);
170+
leaderMember.setStatus(PartyMemberStatus.ACCEPTED);
171+
leaderMember.setJoinedAt(LocalDateTime.now().minusHours(1));
172+
partyMemberRepository.save(leaderMember);
173+
157174
PartyMember partyMember = new PartyMember();
158175
partyMember.setParty(party);
159176
partyMember.setMember(member1);
@@ -210,27 +227,99 @@ void deleteParty_success_integration() throws Exception {
210227
}
211228

212229
@Test
213-
@DisplayName("파티 목록 조회 통합 테스트 성공")
230+
@DisplayName("파티 목록 조회 통합 테스트 성공 (공개 파티 목록 조회)")
214231
void getPartyList_success_integration() throws Exception {
232+
Mission mission = Mission.builder()
233+
.title("테스트 미션")
234+
.category(MissionCategory.EXERCISE)
235+
.type(MissionType.CUSTOM)
236+
.startDate(LocalDate.of(2025, 10, 1))
237+
.endDate(LocalDate.of(2025, 10, 31))
238+
.member(leader)
239+
.build();
240+
missionRepository.save(mission);
241+
215242
Party party1 = new Party();
216-
party1.setName("파티1");
243+
party1.setName("공개 파티1");
217244
party1.setLeader(leader);
218245
party1.setMaxMembers(5);
219246
party1.setPublic(true);
247+
LocalDateTime date1 = LocalDateTime.now().minusDays(1);
248+
setBaseEntityCreateDate(party1, date1);
220249
partyRepository.save(party1);
221250

251+
PartyMember leaderMember1 = new PartyMember();
252+
leaderMember1.setParty(party1);
253+
leaderMember1.setMember(leader);
254+
leaderMember1.setStatus(PartyMemberStatus.ACCEPTED);
255+
leaderMember1.setJoinedAt(date1);
256+
partyMemberRepository.save(leaderMember1);
257+
258+
259+
mission.setParty(party1);
260+
missionRepository.save(mission);
261+
222262
Party party2 = new Party();
223-
party2.setName("파티2");
224-
party2.setLeader(leader);
225-
party2.setMaxMembers(5);
263+
party2.setName("공개 파티2");
264+
party2.setLeader(member1);
265+
party2.setMaxMembers(3);
226266
party2.setPublic(true);
267+
LocalDateTime date2 = LocalDateTime.now().minusDays(2);
268+
setBaseEntityCreateDate(party2, date2);
227269
partyRepository.save(party2);
228270

271+
PartyMember leaderMember2 = new PartyMember();
272+
leaderMember2.setParty(party2);
273+
leaderMember2.setMember(member1);
274+
leaderMember2.setStatus(PartyMemberStatus.ACCEPTED);
275+
leaderMember2.setJoinedAt(date2);
276+
partyMemberRepository.save(leaderMember2);
277+
278+
Party privateParty = new Party();
279+
privateParty.setName("비공개 파티");
280+
privateParty.setLeader(leader);
281+
privateParty.setMaxMembers(2);
282+
privateParty.setPublic(false);
283+
LocalDateTime date3 = LocalDateTime.now().minusDays(3);
284+
setBaseEntityCreateDate(privateParty, date3);
285+
partyRepository.save(privateParty);
286+
287+
PartyMember leaderPrivate = new PartyMember();
288+
leaderPrivate.setParty(privateParty);
289+
leaderPrivate.setMember(leader);
290+
leaderPrivate.setStatus(PartyMemberStatus.ACCEPTED);
291+
leaderPrivate.setJoinedAt(date3);
292+
partyMemberRepository.save(leaderPrivate);
293+
294+
229295
mockMvc.perform(get("/api/v1/parties"))
230296
.andExpect(status().isOk())
231-
.andExpect(jsonPath("$.content.size()").value(2))
232297
.andExpect(jsonPath("$.code").value("200"))
233-
.andExpect(jsonPath("$.message").value("파티 목록 조회 성공"));
298+
.andExpect(jsonPath("$.message").value("파티 목록 조회 성공"))
299+
300+
.andExpect(jsonPath("$.content.content[0].name").value("공개 파티1"))
301+
.andExpect(jsonPath("$.content.content[0].leaderId").value(leader.getId()))
302+
.andExpect(jsonPath("$.content.content[0].isPublic").value(true))
303+
.andExpect(jsonPath("$.content.content[0].currentMembers").value(1))
304+
.andExpect(jsonPath("$.content.content[0].category").value(MissionCategory.EXERCISE.name()))
305+
.andExpect(jsonPath("$.content.content[0].startDate").value("2025-10-01"))
306+
.andExpect(jsonPath("$.content.content[0].endDate").value("2025-10-31"))
307+
.andExpect(jsonPath("$.content.content[0].missionId").value(mission.getId()))
308+
.andExpect(jsonPath("$.content.content[0].createDate").value(
309+
LocalDate.now().toString()
310+
))
311+
312+
.andExpect(jsonPath("$.content.content[1].name").value("공개 파티2"))
313+
.andExpect(jsonPath("$.content.content[1].leaderId").value(member1.getId()))
314+
.andExpect(jsonPath("$.content.content[1].isPublic").value(true))
315+
.andExpect(jsonPath("$.content.content[1].currentMembers").value(1))
316+
.andExpect(jsonPath("$.content.content[1].category").isEmpty())
317+
.andExpect(jsonPath("$.content.content[1].startDate").isEmpty())
318+
.andExpect(jsonPath("$.content.content[1].endDate").isEmpty())
319+
.andExpect(jsonPath("$.content.content[1].missionId").isEmpty())
320+
.andExpect(jsonPath("$.content.content[1].createDate").value(
321+
LocalDate.now().toString()
322+
));
234323
}
235324

236325
@Test
@@ -330,6 +419,14 @@ void kickMember_success_integration() throws Exception {
330419
party.setPublic(true);
331420
partyRepository.save(party);
332421

422+
PartyMember leaderMember = new PartyMember();
423+
leaderMember.setParty(party);
424+
leaderMember.setMember(leader);
425+
leaderMember.setStatus(PartyMemberStatus.ACCEPTED);
426+
leaderMember.setJoinedAt(LocalDateTime.now().minusHours(1));
427+
partyMemberRepository.save(leaderMember);
428+
429+
// 추방될 멤버 추가
333430
PartyMember partyMember = new PartyMember();
334431
partyMember.setParty(party);
335432
partyMember.setMember(member1);
@@ -354,6 +451,13 @@ void getPendingJoinRequests_success_integration() throws Exception {
354451
party.setPublic(true);
355452
partyRepository.save(party);
356453

454+
PartyMember leaderMember = new PartyMember();
455+
leaderMember.setParty(party);
456+
leaderMember.setMember(leader);
457+
leaderMember.setStatus(PartyMemberStatus.ACCEPTED);
458+
leaderMember.setJoinedAt(LocalDateTime.now().minusHours(1));
459+
partyMemberRepository.save(leaderMember);
460+
357461
PartyMember partyMember = new PartyMember();
358462
partyMember.setParty(party);
359463
partyMember.setMember(member1);
@@ -369,4 +473,20 @@ void getPendingJoinRequests_success_integration() throws Exception {
369473
.andExpect(jsonPath("$.code").value("200"))
370474
.andExpect(jsonPath("$.message").value("가입 신청/초대 목록 조회 성공"));
371475
}
476+
477+
/**
478+
* private/protected 필드를 Reflection을 사용하여 설정하는 헬퍼 메서드 (테스트용)
479+
* BaseEntity의 createDate 필드에 접근하여 강제로 값을 설정합니다.
480+
*/
481+
private void setBaseEntityCreateDate(Object entity, LocalDateTime dateTime) {
482+
try {
483+
// Party가 BaseEntity를 상속받으므로 getSuperclass() 사용
484+
Field field = entity.getClass().getSuperclass().getDeclaredField("createDate");
485+
field.setAccessible(true);
486+
field.set(entity, dateTime);
487+
} catch (NoSuchFieldException | IllegalAccessException e) {
488+
// 테스트 실패로 처리
489+
throw new RuntimeException("Reflection 오류: createDate 필드 접근 실패", e);
490+
}
491+
}
372492
}

0 commit comments

Comments
 (0)