Skip to content

Conversation

@HwangMinSeon
Copy link
Contributor

@HwangMinSeon HwangMinSeon commented Nov 29, 2025

요약

StudyMember TestCode


작업 내용

엔티티, 메퍼, 레포지토리, 서비스 테스트 코드


참고 사항

build.gradle 파일 수정


관련 이슈

BACKEND-186



Summary by CodeRabbit

  • Chores

    • QueryDSL을 5.1.0으로 업그레이드하고 보안/유틸 Apache Commons(commons-compress, commons-lang3) 및 테스트용 Testcontainers 의존성 추가
  • Bug Fixes

    • 매핑 시 누락된 사용자 입력을 조기 검증하도록 개선하여 잘못된 변환을 방지
  • Tests

    • StudyMember 관련 단위·통합 테스트 대폭 확장 — 상태 전환, 매퍼, 서비스, 리포지토리 시나리오 포괄적 추가 및 재구성

✏️ Tip: You can customize this high-level summary in your review settings.

@HwangMinSeon HwangMinSeon self-assigned this Nov 29, 2025
@coderabbitai
Copy link

coderabbitai bot commented Nov 29, 2025

Walkthrough

빌드 의존성(QueryDSL 업그레이드 및 Testcontainers/commons 추가)과 함께 StudyMember 관련 매퍼에 null 검증이 추가되었고, 엔티티/매퍼/저장소/서비스에 대한 단위 및 통합 테스트가 새로 추가·리팩터링되었습니다.

Changes

Cohort / File(s) 변경 요약
빌드 의존성 변경
techeerzip/build.gradle
QueryDSL 버전 5.0.0 → 5.1.0(코어/JPA/annotationProcessor) 업그레이드; 테스트용 org.testcontainers:testcontainers, org.testcontainers:junit-jupiter, org.testcontainers:postgresqlorg.apache.commons:commons-compress, org.apache.commons:commons-lang3 의존성 추가 및 testImplementation 블록 반영
StudyMember 엔티티 테스트 수정/확장
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/entity/StudyMemberTest.java
기존 테스트 리팩터링: 빌더 기반 실제 엔티티 생성으로 초기화 변경 및 상태 전이, 리더 토글, 접근자 검증 등을 독립 @Test로 확장
StudyMember 매퍼 테스트 신규 추가
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapperTest.java
toEntity/toEntities 정상 경로와 null/누락 입력(팀/유저/리스트) 예외 경로 검증 테스트 추가
StudyMember 매퍼 논리 변경
techeerzip/src/main/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapper.java
toEntities에서 users.get(userId) 결과가 null이면 StudyMemberBadRequestException을 던지도록 null 체크 추가
StudyMember 저장소 통합 테스트 신규 추가
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/repository/StudyMemberDslRepositoryImplTest.java
Testcontainers 기반 PostgreSQL 환경에서 QueryDSL 저장소 동작 검증(지원자 조회, 소프트 삭제 제외, 팀/상태 필터링 등) 테스트 추가
StudyMember 서비스 테스트 신규 추가
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/service/StudyMemberServiceTest.java
Mockito 기반 서비스 유닛테스트 추가(신청/수락/거절 흐름, 활성 멤버 확인, 지원자 조회, 멤버 조회 등)

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~25 minutes

  • 추가로 주의할 파일:
    • techeerzip/build.gradle (QueryDSL 버전/annotationProcessor 표기 및 테스트 의존성 중복)
    • StudyMemberDslRepositoryImplTest.java (Testcontainers 설정, 엔티티 초기화, QueryDSL 쿼리 검증)
    • StudyMemberMapper.java (새로운 null 체크로 인한 호출부 영향 검토)

Possibly related PRs

Suggested reviewers

  • printSANO
  • dlwhsk0
  • dongwooooooo
  • yuripbong

Poem

🐰 깡충, 깡충 새 테스트 와르르,
의존성 올리고 컨테이너 춤추르르,
매퍼는 조심해, 널 체크했지롱,
저장소는 질의도 꼼꼼히 보리롱,
당근 한 입 축하해요 🥕

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% 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
Description Check ✅ Passed Check skipped - CodeRabbit’s high-level summary is enabled.
Title check ✅ Passed 제목이 PR의 핵심 변경사항인 StudyMember 테스트 코드 추가를 명확하게 요약하고 있으며, 간결하고 구체적입니다.
✨ 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 BACKEND-186

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: 5

🧹 Nitpick comments (2)
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/repository/StudyMemberDslRepositoryImplTest.java (1)

54-60: 불필요한 @SuppressWarnings("unused") 어노테이션 제거를 권장합니다.

entityManagerqueryFactory 필드는 실제로 코드에서 사용되고 있으므로 @SuppressWarnings("unused") 어노테이션이 필요하지 않습니다.

-    @SuppressWarnings("unused")
     @Autowired
     private EntityManager entityManager;

-    @SuppressWarnings("unused")
     @Autowired
     private JPAQueryFactory queryFactory;
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/entity/StudyMemberTest.java (1)

79-82: updatedAt 검증 로직이 테스트 의도를 약하게 표현합니다.

현재 조건 isAfter(beforeUpdate) || equals(beforeUpdate)는 사실상 모든 경우를 통과합니다. 단위 테스트 환경에서 beforeUpdatenull일 가능성이 높으므로, 더 명확한 검증 방식을 고려해보세요.

-        if (beforeUpdate != null) {
-            assertTrue(studyMember.getUpdatedAt().isAfter(beforeUpdate) || 
-                       studyMember.getUpdatedAt().equals(beforeUpdate));
-        }
+        // JPA 컨텍스트 없이는 updatedAt이 null일 수 있으므로
+        // update 호출 후 updatedAt이 설정되었는지만 확인
+        assertNotNull(studyMember.getUpdatedAt());

동일한 패턴이 여러 테스트 메서드에서 반복되므로, 필요시 헬퍼 메서드로 추출하는 것도 좋습니다.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 98dd1fd and e6434c9.

📒 Files selected for processing (5)
  • techeerzip/build.gradle (2 hunks)
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/entity/StudyMemberTest.java (1 hunks)
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapperTest.java (1 hunks)
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/repository/StudyMemberDslRepositoryImplTest.java (1 hunks)
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/service/StudyMemberServiceTest.java (1 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-05-24T09:14:59.080Z
Learnt from: dongwooooooo
Repo: Techeer-Hogwarts/backend PR: 7
File: techeerzip/src/main/java/backend/techeerzip/domain/projectTeam/service/ProjectTeamService.java:680-680
Timestamp: 2025-05-24T09:14:59.080Z
Learning: 이 프로젝트에서는 이메일 필드가 데이터베이스 레벨에서 NOT NULL 제약조건을 가지며, 멤버 서비스에서 존재하지 않는 멤버에 대해서는 예외를 발생시키는 패턴을 사용한다. 따라서 이메일 관련 서비스 메서드들은 null을 반환하지 않으며, 별도의 null 체크가 불필요하다.

Applied to files:

  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/service/StudyMemberServiceTest.java
🧬 Code graph analysis (1)
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapperTest.java (2)
techeerzip/src/main/java/backend/techeerzip/domain/studyMember/exception/StudyMemberBadRequestException.java (1)
  • StudyMemberBadRequestException (6-10)
techeerzip/src/main/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapper.java (1)
  • StudyMemberMapper (15-49)
🔇 Additional comments (18)
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapperTest.java (5)

1-28: 테스트 클래스 구조가 잘 구성되어 있습니다.

테스트에 필요한 임포트와 필드 선언이 적절하며, DisplayName을 활용한 한글 설명이 가독성을 높여줍니다.


29-79: 테스트 데이터 설정이 적절합니다.

ReflectionTestUtils를 사용하여 ID를 설정하는 것은 단위 테스트에서 일반적인 패턴이며, 모든 필수 필드가 올바르게 초기화되어 있습니다.


81-121: toEntity 메서드 테스트가 충분합니다.

isLeader의 true/false 케이스를 모두 커버하고 있으며, 생성된 엔티티의 모든 필드를 검증하고 있습니다.


181-226: null 파라미터 검증 테스트가 완벽합니다.

세 가지 파라미터에 대한 null 검증을 각각 테스트하여 매퍼의 방어 로직을 충분히 검증하고 있습니다.


123-179: Java 21 is confirmed—the getFirst() usage is appropriate and no changes are needed.

The project is configured with languageVersion = JavaLanguageVersion.of(21) in build.gradle, making the getFirst() method (a SequencedCollection API) a valid and idiomatic choice for this codebase.

The test is well-structured, comprehensively validating multiple member conversion and empty list scenarios with proper assertions.

techeerzip/src/test/java/backend/techeerzip/domain/studyMember/repository/StudyMemberDslRepositoryImplTest.java (6)

31-52: LGTM!

Testcontainers 설정과 @DataJpaTest 구성이 적절합니다. @AutoConfigureTestDatabase(replace = NONE)을 사용하여 실제 PostgreSQL 컨테이너를 활용하고, DynamicPropertySource로 데이터소스 속성을 올바르게 구성했습니다.


140-141: detached 엔티티 사용 패턴에 주의가 필요합니다.

entityManager.clear() 호출 후 studyTeam, user1, user2, user3는 detached 상태가 됩니다. 테스트 메서드에서 이 detached 엔티티들을 새로운 StudyMember 생성 시 참조로 사용하고 있습니다.

현재는 ID가 이미 설정되어 있고 cascade 설정이 없다면 동작하지만, 엔티티 매핑이 변경되면 테스트가 깨질 수 있는 잠재적 취약점입니다. 대안으로 @BeforeEach에서 clear()를 제거하거나, 각 테스트 메서드에서 필요 시 엔티티를 다시 조회하는 방식을 고려해 보세요.


144-212: LGTM!

테스트 로직이 명확하고 잘 구성되어 있습니다. 결과 순서가 보장되지 않을 수 있으므로 stream().filter()를 사용하여 특정 지원자를 찾는 방식이 적절합니다.


214-312: LGTM!

엣지 케이스에 대한 테스트 커버리지가 잘 구성되어 있습니다. soft delete 제외, 팀 필터링, 빈 결과 처리 등 다양한 시나리오를 명확하게 테스트하고 있습니다.


314-347: LGTM!

REJECT 상태 지원자 제외 테스트가 잘 작성되어 있습니다. findManyApplicants 메서드의 필터링 동작을 종합적으로 검증하고 있습니다.


246-246: getFirst() usage is compatible with the project's Java version.

The project is configured to use Java 21 (languageVersion = JavaLanguageVersion.of(21) in techeerzip/build.gradle), which includes the List.getFirst() method introduced in JDK 21. No changes are needed.

techeerzip/src/test/java/backend/techeerzip/domain/studyMember/service/StudyMemberServiceTest.java (1)

91-127: 나머지 테스트 케이스들은 잘 작성되었습니다.

  • checkActiveMemberByTeamAndUser 테스트: true/false 케이스를 명확히 검증
  • applyApplicant 테스트: 신규 생성, 기존 멤버 상태 변경, 이미 PENDING인 경우를 적절히 분리
  • getApplicants 테스트: 리스트 반환 및 빈 리스트 케이스 커버
  • getMember 테스트: Optional 존재/부재 케이스 커버

given/when/then 구조와 @DisplayName 활용이 적절합니다.

Also applies to: 129-204, 318-370, 372-403

techeerzip/src/test/java/backend/techeerzip/domain/studyMember/entity/StudyMemberTest.java (4)

22-62: 설정 메서드 구현이 잘 되어있습니다.

@BeforeEach에서 테스트에 필요한 StudyTeam, User, StudyMember 객체들을 명확하게 초기화하고 있습니다. 각 엔티티의 필수 필드들이 적절히 설정되어 있어 테스트 격리가 잘 유지됩니다.


150-172: 상태 전이 테스트가 잘 구성되어 있습니다.

toActive(Boolean) 메서드 테스트에서 toReject()softDelete() 이후 toActive(true) 호출 시 isLeader, status, isDeleted 필드가 모두 올바르게 복원되는지 검증하고 있습니다. 복합적인 상태 전이 시나리오를 잘 다루고 있습니다.


275-298: isActive 메서드의 복합 조건 테스트가 적절합니다.

isActiveisDeleted == false && status == APPROVED 조건을 충족해야 true를 반환하는지 여러 시나리오(PENDING 상태, 삭제 후, 재활성화)로 검증하고 있습니다.


370-419: 빌더 패턴 테스트가 포괄적입니다.

새로운 StudyTeam, User, StudyMember 객체를 빌더로 생성하고 모든 필드 값이 정확히 설정되었는지 검증합니다. isDeleted 기본값이 false인 것도 확인하여 엔티티 초기 상태를 잘 테스트하고 있습니다.

techeerzip/build.gradle (2)

89-92: 전이 의존성 보안 취약점 대응이 잘 되어있습니다.

commons-compresscommons-lang3의 버전을 명시적으로 지정하여 보안 취약점을 해결하는 접근 방식이 적절합니다. 다만, 이러한 의존성은 주기적으로 업데이트 여부를 확인해야 합니다.


54-60: QueryDSL 6.10.1 correctly addresses CVE-2024-49203 — no changes needed.

The upgrade to QueryDSL 6.10.1 is appropriate. CVE-2024-49203 is a confirmed critical SQL/HQL injection vulnerability (CVSS 9.8) in Querydsl's JPAQuery orderBy handling, and version 6.10.1 is the correct patched release for the OpenFeign Querydsl line. The dependency upgrade addresses a real security concern.

Comment on lines +82 to +85
// Testcontainers
testImplementation 'org.testcontainers:testcontainers:1.19.3'
testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
testImplementation 'org.testcontainers:postgresql:1.19.3'
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

🧩 Analysis chain

🌐 Web query:

Testcontainers latest version 2025 release

💡 Result:

The latest Testcontainers (Java) release as of Nov 29, 2025 is 2.0.2 (released Nov 13, 2025). [1]
The previous stable 1.x release was 1.21.3 (released Jun 28–29, 2025). [2]

Sources:
[1] GitHub releases — testcontainers/testcontainers-java (2.0.2).
[2] Maven / mvnrepository entries for 1.21.3.


🌐 Web query:

Testcontainers 1.19.3 release date security vulnerabilities

💡 Result:

  • Release date: November 21, 2023. [1][2]

  • Known security issues (from dependencies):

    • CVE-2024-26308 (Apache Commons Compress — allocation of resources / DoS). Recommended fix: upgrade Commons Compress to ≥1.26. [3]
    • CVE-2024-25710 (Apache Commons Compress — infinite loop / DoS). Recommended fix: upgrade Commons Compress to ≥1.26. [4]

References:
[1] Maven Central / mvnrepository entry for org.testcontainers:testcontainers:1.19.3 (date & reported vulnerabilities).
[2] Repository index for testcontainers 1.19.3 (timestamp).
[3] NVD / advisories for CVE-2024-26308.
[4] NVD / advisories for CVE-2024-25710.


Update Testcontainers to a newer version; 1.19.3 has known security vulnerabilities.

Version 1.19.3 (released November 21, 2023) is now significantly outdated. As of November 2025, the latest stable version is 2.0.2 (released November 13, 2025), with 1.21.3 being the last 1.x release (June 28, 2025).

More critically, 1.19.3 has transitive dependency vulnerabilities:

Upgrade to at least 1.21.3 (minimal 1.x update) or preferably 2.0.2 (latest).

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: 1

♻️ Duplicate comments (1)
techeerzip/build.gradle (1)

85-95: Testcontainers 버전 업그레이드를 여전히 권장합니다.

Commons Compress 1.28.0을 명시적으로 추가하여 CVE-2024-26308 및 CVE-2024-25710을 해결한 것은 좋습니다. 그러나 Testcontainers 1.19.3 자체는 여전히 구 버전입니다:

  • 현재 버전: 1.19.3 (2023년 11월 21일)
  • 권장 버전: 최소 1.21.3 (2025년 6월) 또는 최신 2.0.2 (2025년 11월)

Commons Compress 전이 의존성 문제는 해결되었지만, Testcontainers를 최신 버전으로 업그레이드하면 다음 이점이 있습니다:

  • 추가 버그 수정 및 성능 개선
  • 더 나은 장기 유지보수성
  • 최신 컨테이너 이미지 지원
🔎 권장 업그레이드
     // Testcontainers
-    testImplementation 'org.testcontainers:testcontainers:1.19.3'
-    testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
-    testImplementation 'org.testcontainers:postgresql:1.19.3'
+    testImplementation 'org.testcontainers:testcontainers:1.21.3'
+    testImplementation 'org.testcontainers:junit-jupiter:1.21.3'
+    testImplementation 'org.testcontainers:postgresql:1.21.3'

또는 최신 2.x 버전으로 업그레이드 (breaking changes 검토 필요):

     // Testcontainers
-    testImplementation 'org.testcontainers:testcontainers:1.19.3'
-    testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
-    testImplementation 'org.testcontainers:postgresql:1.19.3'
+    testImplementation 'org.testcontainers:testcontainers:2.0.2'
+    testImplementation 'org.testcontainers:junit-jupiter:2.0.2'
+    testImplementation 'org.testcontainers:postgresql:2.0.2'
🧹 Nitpick comments (1)
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/entity/StudyMemberTest.java (1)

300-315: getId 테스트가 개선되었지만 더 명확한 검증을 권장합니다.

이전 리뷰 피드백에 따라 getId() 메서드를 실제로 호출하도록 개선되었습니다. 그러나 현재 assertion assertTrue(id == null || id >= 0)은 너무 관대합니다.

JPA 컨텍스트 외부에서는 ID가 null이 예상되므로, 더 명확한 검증을 제안합니다:

🔎 더 명확한 검증 제안
     @Test
     @DisplayName("getId 메서드 - id 반환 확인")
     void getId() {
-        // given & when
-        // id는 JPA가 생성하므로 null일 수 있음
-        // 실제로는 DB에 저장된 후에 id가 할당됨
+        // given & when & then
+        // JPA 컨텍스트 외부에서는 id가 null
         Long id = studyMember.getId();
-
-        // then
-        // JPA 컨텍스트 없이 생성된 엔티티는 id가 null일 수 있음
-        // getId() 메서드가 정상적으로 호출되고 null을 반환할 수 있음을 확인
-        assertNotNull(studyMember);
-        // id는 null일 수 있지만, getId() 메서드는 예외 없이 호출되어야 함
-        // JPA 컨텍스트 없이 생성된 엔티티는 id가 null일 수 있으므로 null 체크는 하지 않음
-        assertTrue(id == null || id >= 0);
+        assertNull(id, "JPA 컨텍스트 없이 생성된 엔티티의 ID는 null이어야 함");
     }
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e6434c9 and fe15445.

📒 Files selected for processing (5)
  • techeerzip/build.gradle (2 hunks)
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/entity/StudyMemberTest.java (1 hunks)
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapperTest.java (1 hunks)
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/repository/StudyMemberDslRepositoryImplTest.java (1 hunks)
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/service/StudyMemberServiceTest.java (1 hunks)
🚧 Files skipped from review as they are similar to previous changes (2)
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/service/StudyMemberServiceTest.java
  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/repository/StudyMemberDslRepositoryImplTest.java
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-05-24T09:14:59.080Z
Learnt from: dongwooooooo
Repo: Techeer-Hogwarts/backend PR: 7
File: techeerzip/src/main/java/backend/techeerzip/domain/projectTeam/service/ProjectTeamService.java:680-680
Timestamp: 2025-05-24T09:14:59.080Z
Learning: 이 프로젝트에서는 이메일 필드가 데이터베이스 레벨에서 NOT NULL 제약조건을 가지며, 멤버 서비스에서 존재하지 않는 멤버에 대해서는 예외를 발생시키는 패턴을 사용한다. 따라서 이메일 관련 서비스 메서드들은 null을 반환하지 않으며, 별도의 null 체크가 불필요하다.

Applied to files:

  • techeerzip/src/test/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapperTest.java
🧬 Code graph analysis (1)
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapperTest.java (2)
techeerzip/src/main/java/backend/techeerzip/domain/studyMember/exception/StudyMemberBadRequestException.java (1)
  • StudyMemberBadRequestException (6-10)
techeerzip/src/main/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapper.java (1)
  • StudyMemberMapper (15-49)
🔇 Additional comments (10)
techeerzip/src/test/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapperTest.java (4)

29-79: 테스트 픽스처 설정이 잘 구성되어 있습니다.

ReflectionTestUtils를 사용하여 ID를 설정하고, 실제 엔티티 빌더를 통해 테스트 데이터를 구성한 것은 좋은 접근 방식입니다. 단위 테스트에서 JPA 컨텍스트 없이 엔티티 간 관계를 테스트하기에 적합합니다.


81-121: toEntity 메서드 테스트가 잘 작성되었습니다.

리더 여부에 따른 두 가지 시나리오를 모두 커버하고 있으며, 각 테스트에서 엔티티의 모든 주요 필드(isLeader, summary, status, studyTeam, user)를 검증하고 있습니다.


123-179: toEntities 메서드의 정상 경로와 엣지 케이스 테스트가 포괄적입니다.

여러 멤버 변환, 빈 리스트 처리를 모두 테스트하고 있으며, 각 생성된 멤버의 속성을 상세히 검증하고 있습니다.


181-226: Null 입력 검증 테스트가 완벽합니다.

incomingMembersInfo, team, users 각각이 null일 때 StudyMemberBadRequestException이 발생하는지 확인하는 세 가지 테스트를 모두 포함하고 있습니다. 방어적 프로그래밍을 위한 필수 검증입니다.

techeerzip/src/test/java/backend/techeerzip/domain/studyMember/entity/StudyMemberTest.java (5)

3-62: 실제 엔티티를 사용한 테스트 셋업으로 개선되었습니다.

Mock 객체 대신 실제 빌더를 통해 StudyTeam, User, StudyMember를 생성하는 방식으로 변경된 것은 좋은 개선입니다. 이는 엔티티의 실제 동작을 더 정확하게 테스트할 수 있게 합니다.


64-235: 상태 전환 및 업데이트 메서드 테스트가 매우 포괄적입니다.

update, changeLeaderStatus, softDelete, toActive, toApplicant, toReject 등 모든 상태 변경 메서드에 대해 다음을 검증하고 있습니다:

  • 상태 변경 전후 비교
  • updatedAt 필드의 변경 확인
  • 멱등성 (예: softDelete 두 번 호출)
  • 복합 상태 전환 (예: toActive가 isDeleted도 false로 변경)

237-298: 상태 확인 메서드 테스트가 잘 구성되어 있습니다.

isRejected, isPending, isActive 메서드에 대해 다양한 상태 전환 시나리오를 테스트하고 있으며, 복합 조건(예: isActive는 isDeleted=false AND status=APPROVED)도 검증하고 있습니다.


317-376: Getter 메서드 테스트가 적절합니다.

isLeader, getSummary, getStatus, getStudyTeam, getUser 메서드에 대해 초기값 확인 및 상태 변경 후 값 확인을 모두 수행하고 있습니다.


378-428: 빌더 패턴 테스트가 종합적입니다.

새로운 엔티티들을 생성하고 StudyMember 빌더를 통해 모든 필드가 올바르게 설정되는지 검증하는 end-to-end 스타일의 테스트입니다. 잘 작성되었습니다.

techeerzip/build.gradle (1)

51-55: QueryDSL 업그레이드가 적절하게 수행되었습니다.

CVE-2024-49203 수정을 위한 버전 6.10.1로의 업그레이드가 명확히 문서화되어 있으며, core, jpa, annotationProcessor 모두 일관되게 업데이트되었습니다.

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: 1

♻️ Duplicate comments (1)
techeerzip/build.gradle (1)

85-88: 중복된 Testcontainers 의존성 제거 필요.

81-82번 라인에 이미 org.testcontainers:junit-jupiterorg.testcontainers:postgresql 의존성이 존재합니다. 85-88번 라인의 명시적 버전을 가진 의존성들은 중복입니다.

추가로, Testcontainers 1.19.3 버전의 보안 취약점 이슈는 이전 리뷰에서 이미 지적되었습니다.

🔎 중복 제거 제안

81-82번 라인의 의존성을 유지하되, Spring Boot의 BOM이 관리하는 버전을 사용하거나, 최신 버전으로 명시적으로 지정하세요:

 testImplementation 'org.springframework.boot:spring-boot-testcontainers' // Spring Boot 3.1+ 부터 제공하는 편리한 기능
-testImplementation 'org.testcontainers:junit-jupiter'
-testImplementation 'org.testcontainers:postgresql'
+testImplementation 'org.testcontainers:junit-jupiter:2.0.2'
+testImplementation 'org.testcontainers:postgresql:2.0.2'
 testRuntimeOnly 'org.junit.platform:junit-platform-launcher'
-    
-// Testcontainers
-testImplementation 'org.testcontainers:testcontainers:1.19.3'
-testImplementation 'org.testcontainers:junit-jupiter:1.19.3'
-testImplementation 'org.testcontainers:postgresql:1.19.3'
🧹 Nitpick comments (1)
techeerzip/build.gradle (1)

94-95: Apache Commons 의존성 버전 검증 필요

현재 사용 중인 commons-compress 1.28.0은 최신 버전입니다. 다만 commons-lang3의 경우 더 최신 버전이 존재하므로 확인이 필요합니다:

  • commons-compress 1.28.0: 현재 최신 버전 (2025년 7월 26일 배포)
  • commons-lang3 3.18.0: 2개 마이너 버전 뒤쳐져 있음 (최신: 3.20.0)

commons-lang3 3.18.0은 CVE-2025-48924 보안 취약점(Uncontrolled Recursion)을 수정한 최소 버전이므로 정당하나, 3.20.0으로 업그레이드 가능 여부를 검토하십시오. 또한 이러한 의존성이 테스트용 전이 의존성이라면 implementation 대신 testImplementation 스코프 사용을 권장합니다.

📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between fe15445 and 7094c5f.

📒 Files selected for processing (1)
  • techeerzip/build.gradle (2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build

Comment on lines +51 to +55
// QueryDSL (CVE-2024-49203 수정 버전)
implementation 'com.querydsl:querydsl-core:5.1.0'
implementation 'com.querydsl:querydsl-jpa:5.1.0:jakarta'

annotationProcessor 'com.querydsl:querydsl-apt:5.0.0:jakarta'
annotationProcessor 'com.querydsl:querydsl-apt:5.1.0:jakarta'
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🔴 Critical

QueryDSL 5.1.0은 CVE-2024-49203의 해결 버전이 아니라 취약한 버전입니다.

QueryDSL 5.1.0은 JPAQuery의 orderBy 기능에서 SQL/HQL 인젝션 취약점이 존재하며, querydsl-jpa 5.1.0과 querydsl-apt 5.1.0이 영향을 받습니다. 문제는 QueryDSL 5.6.1과 6.10.1 버전에서 수정되었습니다. 현재 버전 5.1.0으로의 업그레이드는 CVE를 해결하지 못합니다. 최소한 5.6.1 이상으로 업그레이드하거나, 더 나아가 OpenFeign의 유지보수 중인 포크에서 6.10.1 이상으로 업그레이드를 고려해야 합니다.

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 (1)
techeerzip/src/main/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapper.java (1)

39-51: 코드 중복을 줄이기 위해 기존 메서드를 재사용하는 것을 고려해보세요.

현재 빌더 로직(라인 44-50)은 위의 toEntity 메서드(라인 21-27)와 동일한 작업을 수행합니다. 기존 메서드를 재사용하면 코드 중복을 줄이고 유지보수성을 향상시킬 수 있습니다.

🔎 제안하는 리팩터링
         return incomingMembersInfo.stream()
                 .map(
                         info -> {
                             User user = users.get(info.getUserId());
                             if (user == null) {
                                 throw new StudyMemberBadRequestException();
                             }
-                            return StudyMember.builder()
-                                    .user(user)
-                                    .studyTeam(team)
-                                    .isLeader(info.getIsLeader())
-                                    .status(StatusCategory.APPROVED)
-                                    .summary(DEFAULT_MEMBER_SUMMARY)
-                                    .build();
+                            return toEntity(info, team, user);
                         })
                 .toList();
📜 Review details

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 7094c5f and 0589123.

📒 Files selected for processing (1)
  • techeerzip/src/main/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapper.java (1 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: build
🔇 Additional comments (1)
techeerzip/src/main/java/backend/techeerzip/domain/studyMember/mapper/StudyMemberMapper.java (1)

41-43: null 체크 추가가 적절합니다.

맵에서 조회한 User가 null인 경우를 검증하여 NPE를 방지하고 데이터 무결성을 보장합니다. 방어적 프로그래밍의 좋은 사례입니다.

@sonarqubecloud
Copy link

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants