Skip to content

Conversation

@hyxklee
Copy link
Collaborator

@hyxklee hyxklee commented Nov 12, 2025

📌 PR 내용

  • 출석 코드가 출석 페이지에서도 볼수 있게 됨에 따라 유저 권한을 확인해서 dto에 담아줄 수 있게 했습니다

🔍 PR 세부사항

  • 코드 스타일은 정기모임에서 가져오는 부분과 통일했습니다.
  • mapper의 동작만 검증했습니다. 추후에 통합 테스트가 필요해보이네용

📸 관련 스크린샷

image

📝 주의사항


✅ 체크리스트

  • 리뷰어 설정
  • Assignee 설정
  • Label 설정
  • 제목 양식 맞췄나요? (ex. [WTH-01] PR 템플릿 수정)
  • 변경 사항에 대한 테스트

Summary by CodeRabbit

릴리스 노트

  • New Features

    • 관리자 사용자에게 출석 코드 노출 기능 추가
    • 사용자 역할에 따른 차별화된 출석 정보 조회 기능 구현
  • Tests

    • 일반 사용자의 출석 정보 조회 테스트 추가
    • 관리자의 출석 코드 포함 조회 테스트 추가
    • 관리자 사용자 생성 테스트 유틸리티 추가

@hyxklee hyxklee self-assigned this Nov 12, 2025
@coderabbitai
Copy link

coderabbitai bot commented Nov 12, 2025

🚀 분석 요약

Walkthrough

어드민 사용자에게만 출석 코드를 노출하기 위한 기능이 추가되었습니다. 새로운 toAdminResponse 매퍼 메서드를 추가하고, 사용 사례 계층에서 사용자 역할에 따라 다른 DTO 응답 경로를 분기하도록 수정했습니다. 테스트와 픽스처도 확장되었습니다.

Changes

Cohort / File(s) 변경 요약
DTO 및 매퍼 핵심 변경
src/main/java/leets/weeth/domain/attendance/application/dto/AttendanceDTO.java, src/main/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapper.java
AttendanceDTO.Main 레코드에 code 필드(Integer) 추가 및 Swagger 스키마 어노테이션 적용. AttendanceMappertoAdminResponse 메서드 추가 및 toMainDto의 code 필드 매핑 제외
사용 사례 로직 변경
src/main/java/leets/weeth/domain/attendance/application/usecase/AttendanceUseCaseImpl.java
find 메서드에서 사용자 역할 기반 분기 로직 추가: ADMIN 역할인 경우 toAdminResponse 호출, 그 외의 경우 toMainDto 호출
테스트 및 픽스처 확장
src/test/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapperTest.java, src/test/java/leets/weeth/domain/attendance/test/fixture/AttendanceTestFixture.java
테스트 설정에 Mockito 및 MapStruct 통합 추가. toMainDto_normalUser_codeIsNull, toAdminResponse_adminUser_includesCode 테스트 케이스 추가. 픽스처에 createAdminUser, createAdminUserWithAttendances 메서드 추가

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant AttendanceUseCaseImpl
    participant AttendanceMapper
    participant DTO
    
    Client->>AttendanceUseCaseImpl: find(User)
    
    alt User.role == ADMIN
        AttendanceUseCaseImpl->>AttendanceMapper: toAdminResponse(user, attendance)
        AttendanceMapper->>DTO: Main(code=meeting.code, ...)
        DTO-->>AttendanceUseCaseImpl: Main with code
    else User.role != ADMIN
        AttendanceUseCaseImpl->>AttendanceMapper: toMainDto(user, attendance)
        AttendanceMapper->>DTO: Main(code=null, ...)
        DTO-->>AttendanceUseCaseImpl: Main without code
    end
    
    AttendanceUseCaseImpl-->>Client: AttendanceDTO.Main
Loading

Estimated code review effort

🎯 2 (Simple) | ⏱️ ~12 minutes

  • 역할 기반 분기 로직이 간단하고 명확함
  • 매퍼 메서드 추가는 기존 패턴의 반복적 확장
  • 테스트 커버리지가 적절하게 추가됨
  • 주의 사항: AttendanceMapper의 두 매핑 메서드(toMainDto, toAdminResponse)간 일관성 검증, MapStruct 기반 테스트 설정이 정확히 구성되었는지 확인

Possibly related PRs

Suggested labels

test

Suggested reviewers

  • jj0526
  • JIN921
  • seokjun01

Poem

🐰 어드민만 보는 코드 숨겨두고,
역할에 따라 길을 갈라지네!
매퍼는 열심히 길을 만들고,
테스트가 모두 검증해주며,
한 줄의 분기로 보안 강화! ✨

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 16.67% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title check ✅ Passed 제목은 PR의 주요 변경 사항을 명확하게 요약하고 있으며, 출석 코드가 DTO에 추가된 변경사항을 직관적으로 전달합니다.
Description check ✅ Passed PR 설명은 필수 섹션들(내용, 세부사항, 스크린샷, 주의사항, 체크리스트)을 모두 포함하고 있으며 변경사항에 대한 충분한 설명을 제공합니다.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch WTH-68-Weeth-출석-dto에-출석코드-추가

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (2)
src/test/java/leets/weeth/domain/attendance/test/fixture/AttendanceTestFixture.java (1)

29-46: 코드 중복을 줄이기 위한 리팩터링을 권장합니다.

createAdminUserWithAttendancescreateActiveUserWithAttendances (lines 49-66) 메서드가 거의 동일한 로직을 포함하고 있습니다. 호출하는 사용자 생성 메서드만 다를 뿐, 나머지 reflection을 통한 초기화 및 출석 추가 로직이 중복됩니다.

다음과 같이 공통 로직을 추출하여 중복을 제거할 수 있습니다:

+	private static User createUserWithAttendances(User user, List<Meeting> meetings) {
+		if (user.getAttendances() == null) {
+			try {
+				java.lang.reflect.Field f = user.getClass().getDeclaredField("attendances");
+				f.setAccessible(true);
+				f.set(user, new java.util.ArrayList<>());
+			} catch (Exception ignore) {}
+		}
+		if (meetings != null) {
+			for (Meeting meeting : meetings) {
+				Attendance attendance = createAttendance(meeting, user);
+				user.add(attendance);
+			}
+		}
+		return user;
+	}
+
 	public static User createAdminUserWithAttendances(String name, List<Meeting> meetings) {
 		User user = createAdminUser(name);
-
-		if (user.getAttendances() == null) {
-			try {
-				java.lang.reflect.Field f = user.getClass().getDeclaredField("attendances");
-				f.setAccessible(true);
-				f.set(user, new java.util.ArrayList<>());
-			} catch (Exception ignore) {}
-		}
-		if (meetings != null) {
-			for (Meeting meeting : meetings) {
-				Attendance attendance = createAttendance(meeting, user);
-				user.add(attendance);
-			}
-		}
-		return user;
+		return createUserWithAttendances(user, meetings);
 	}

 	public static User createActiveUserWithAttendances(String name, List<Meeting> meetings) {
 		User user = createActiveUser(name);
-
-		if (user.getAttendances() == null) {
-			try {
-				java.lang.reflect.Field f = user.getClass().getDeclaredField("attendances");
-				f.setAccessible(true);
-				f.set(user, new java.util.ArrayList<>());
-			} catch (Exception ignore) {}
-		}
-		if (meetings != null) {
-			for (Meeting meeting : meetings) {
-				Attendance attendance = createAttendance(meeting, user);
-				user.add(attendance);
-			}
-		}
-		return user;
+		return createUserWithAttendances(user, meetings);
 	}
src/test/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapperTest.java (1)

24-25: 매퍼 초기화 패턴을 단순화할 수 있습니다.

@InjectMocks는 일반적으로 목(mock) 객체를 주입할 때 사용되지만, 여기서는 Mappers.getMapper()로 실제 구현체를 생성하고 있습니다. MapStruct 테스트에서는 보통 애노테이션 없이 필드 초기화만 사용합니다.

다음과 같이 단순화할 수 있습니다:

-	@InjectMocks
-	private final AttendanceMapper attendanceMapper = Mappers.getMapper(AttendanceMapper.class);
+	private final AttendanceMapper attendanceMapper = Mappers.getMapper(AttendanceMapper.class);

그리고 @ExtendWith(MockitoExtension.class)도 실제로 목을 사용하지 않는다면 제거할 수 있습니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 011f2f1 and 2f099f0.

📒 Files selected for processing (5)
  • src/main/java/leets/weeth/domain/attendance/application/dto/AttendanceDTO.java (2 hunks)
  • src/main/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapper.java (1 hunks)
  • src/main/java/leets/weeth/domain/attendance/application/usecase/AttendanceUseCaseImpl.java (2 hunks)
  • src/test/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapperTest.java (2 hunks)
  • src/test/java/leets/weeth/domain/attendance/test/fixture/AttendanceTestFixture.java (2 hunks)
🧰 Additional context used
🧬 Code graph analysis (1)
src/test/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapperTest.java (1)
src/test/java/leets/weeth/domain/attendance/test/fixture/AttendanceTestFixture.java (1)
  • AttendanceTestFixture (16-125)
🔇 Additional comments (7)
src/main/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapper.java (2)

17-17: 명시적인 ignore 설정이 좋습니다.

toMainDto에서 code 필드를 명시적으로 ignore하여 일반 사용자에게는 출석 코드가 노출되지 않도록 의도를 명확히 했습니다.


24-33: ADMIN 사용자를 위한 매핑 메서드가 올바르게 추가되었습니다.

toAdminResponse 메서드가 attendance.meeting.code를 매핑하여 관리자에게만 출석 코드를 노출하도록 구현되었습니다. toMainDto와 매핑 설정이 거의 동일하지만, MapStruct의 제약으로 인해 이러한 중복은 불가피합니다.

src/main/java/leets/weeth/domain/attendance/application/usecase/AttendanceUseCaseImpl.java (1)

70-74: 역할 기반 분기 로직이 올바르게 구현되었습니다.

ADMIN 역할을 가진 사용자에게는 toAdminResponse를 통해 출석 코드가 포함된 DTO를 반환하고, 일반 사용자에게는 toMainDto를 사용하는 분기 처리가 정확합니다. 상수를 먼저 비교하는 패턴(Role.ADMIN == user.getRole())도 NPE 방지를 위한 좋은 관행입니다.

src/main/java/leets/weeth/domain/attendance/application/dto/AttendanceDTO.java (1)

17-18: DTO에 출석 코드 필드가 올바르게 추가되었습니다.

code 필드가 Integer 타입으로 추가되었고, Swagger 문서화를 통해 어드민 전용 필드임을 명확히 표시했습니다.

src/test/java/leets/weeth/domain/attendance/test/fixture/AttendanceTestFixture.java (1)

25-27: 어드민 사용자 생성 헬퍼가 추가되었습니다.

테스트에서 ADMIN 역할을 가진 사용자를 생성할 수 있는 헬퍼 메서드가 추가되어 어드민 관련 테스트 시나리오를 지원합니다.

src/test/java/leets/weeth/domain/attendance/application/mapper/AttendanceMapperTest.java (2)

130-147: 일반 사용자의 코드 필드 null 처리가 올바르게 검증되었습니다.

toMainDto를 통해 일반 사용자의 DTO를 생성할 때 code 필드가 null로 매핑되는지 확인하는 테스트가 추가되어 권한에 따른 필드 노출 제어가 올바르게 동작하는지 검증합니다.


149-169: 어드민 사용자의 코드 포함 여부가 올바르게 검증되었습니다.

toAdminResponse를 통해 관리자의 DTO를 생성할 때 출석 코드가 정확히 포함되는지 확인하는 테스트가 추가되었습니다. 다만, 기존 null 안전성 테스트(lines 115-128)는 toMainDto만 검증하므로, toAdminResponse에 대한 null 안전성도 확인하는 것이 좋습니다.

toAdminResponse에 대한 null 안전성 테스트를 추가하는 것을 권장합니다:

@Test
@DisplayName("null 안전성 테스트: toAdminResponse에서 todayAttendance가 null이면 필드는 null로 매핑")
void nullSafety_toAdminResponse_whenTodayAttendanceNull() {
    // given
    User adminUser = createAdminUser("관리자");

    // when
    AttendanceDTO.Main main = attendanceMapper.toAdminResponse(adminUser, null);

    // then
    assertThat(main).isNotNull();
    assertThat(main.code()).isNull();
    assertThat(main.title()).isNull();
    assertThat(main.start()).isNull();
    assertThat(main.end()).isNull();
    assertThat(main.location()).isNull();
}

@Mapping(target = "location", source = "attendance.meeting.location"),
})
AttendanceDTO.Main toMainDto(User user, Attendance attendance);

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

ignore 옵션으로 , ROLE별로 매핑되는 필드를 조절할 수 있군요! 좋은 설계같습니다

assertThat(main.end()).isEqualTo(meeting.getEnd());
assertThat(main.location()).isEqualTo(meeting.getLocation());
}
}
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

테스트도 케이스별로 보기좋게 잘 작성해주신 것 같아요 !! 굳굳

Copy link
Collaborator

@seokjun01 seokjun01 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

작성된 코드 잘 보았습니다 고생하셨습니다~~

Copy link
Collaborator

@jj0526 jj0526 left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

어드민일 경우 출석 코드 추가 된부분 확인했습니다!

@hyxklee hyxklee merged commit f8e5c30 into develop Nov 17, 2025
3 checks passed
@hyxklee hyxklee deleted the WTH-68-Weeth-출석-dto에-출석코드-추가 branch November 17, 2025 11:52
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants