Skip to content

[release] 4기 프로젝트 관련 장애조치 후 배포#603

Merged
kangkings merged 82 commits into
mainfrom
merge/resolve-conflict
Jul 21, 2026
Merged

[release] 4기 프로젝트 관련 장애조치 후 배포#603
kangkings merged 82 commits into
mainfrom
merge/resolve-conflict

Conversation

@kangkings

Copy link
Copy Markdown
Contributor

📝 작업 내용

  • 프로젝트 페이징 조회 문제 해결
  • 구성원 조회 로직 개선
  • 팀별 구성원 조회 조건 보강

fivedragon5 and others added 30 commits January 4, 2026 20:44
…dlerfilter

feat: JWT 인증 필터에서 검증 토큰 처리 로직 개선 및 쿠키 삭제 기능 추가
…dlerfilter

feat: JWT 인증 필터에서 검증 토큰 처리 로직 개선
…dlerfilter

feat: JWT 인증 필터에서 액세스 토큰 및 검증 토큰 처리 로직 개선
* feat: MiniStudy 엔티티에 tag 필드 추가

* feat: MiniStudyResponse에 tag 필드 추가

* feat: MiniStudyQueryRepository에 tag 필드 추가

* test: MiniStudyQueryRepositoryTest에 tag 필드 관련 테스트 추가

* feat: mini_study 테이블에 tag 컬럼 추가
* feat: 임시 지원서 목록 조회 API에 semesterId 필터 추가

* feat: 제출된 지원서 조회 API에 semesterId 필터 추가

* feat: 제출된 지원서 조회 API에 semesterId 파라미터 추가

* feat: 임시 지원서 조회 API에 semesterId 파라미터 추가

* feat: 지원서 조회 쿼리에 semesterId 파라미터 추가 및 필터링 로직 구현

* test: 지원서 조회 테스트에 semesterId 필터링 테스트 추가
* feat: ContentType enum 추가하여 콘텐츠 유형 정의

* feat: Jectalk 엔티티 및 DTO 구조 변경

* feat: JectalkQueryRepository 반환 필드 수정

* test: JectalkQueryRepositoryTest 수정으로 반환 필드 검증 업데이트

* feat: Jectalk 테이블 구조 변경 및 데이터 마이그레이션으로 인한 Flyway migration 추

* feat: Jectalk 테이블 content_type 컬럼 기본값 추가

* feat: Category 필드 및 필터링 추가
…tion-profile-add

feat: 제출된 지원서 응답에 지역, 경력 사항, 경험 기간 및 관심 분야 추가
* refactor: deprecated 처리된 temporary apply 관련 코드 삭제

* refactor: deprecated 처리된 temporary apply 관련 코드 삭제
* chore: 마이그레이션 스크립트로 review 스키마 제거

* refactor: review 도메인 및 관련 코드 삭제
* feat: Redis 캐시 설정 및 연결 구성 추가

* refactor: 레디스 설정 파일 분리 파일 삭제
* feat: 인증번호 재설정 이메일 발송 시 rate limiter 로직 추가

* test: 인증번호 재설정 이메일 발송 시 rate limiter 로직 테스트 케이스 추가

* refactor: EmailAuthService import문 정리
* test: main 메소드에 CI/CD 테스트 주석 추가

* chore: Dockerfile 빌드 설정 업데이트

* ci: Docker 환경 체크 스텝 추가 및 커버리지 임계값 조정

* fix: 빌드 테스트

* fix: 빌드 테스트, 로그 추가

* fix: docker api version up 1.44

* fix: Redis Testcontainers 이미지를 안정 버전(7.4-alpine)으로 변경

* fix: docker api fix 1.44

* fix: Diagnose Testcontainers Runtime 스텝 추가, Test with Gradle에 아래 강제 옵션 추가

* fix:  CI 러너를 고정

* fix:  Set up Docker Engine

* fix: docker.api.version=1.44 강제

* fix: Testcontainers CI 연동 수정 및 JaCoCo 임계값 조정

* fix: CI 테스트

* fix: 1.43 다운그레이드

* fix: TestContainers 의존성 관리 및 Redis TestContainer 시작 로직을 안정화했습니다.

* fix: Redis 시작 로그 추가 및 Gradle test 환경변수 설정

* fix: Redis WaitStrategy 변경(포트->로그) 및 타임아웃 120초로 증가

* fix: Redis WaitStrategy 롤백 및 타임아웃 180초로 연장

* chore: 테스트 로그 레벨 조정 (Testcontainers, Docker 관련 로그 WARN으로 변경)

* fix: CI 로그 옵션 제거 및 Testcontainers 설정 수정 (Ryuk 비활성화)

* CI Gradle 테스트에서 Testcontainers를 위한 Docker API 버전과 소켓 전략을 구성하고 디버그 정보를 추가했습니다.

* build: Redis 테스트 컨테이너 이미지를 7.4-alpine에서 8.0-M03-alpine으로 업데이트합니다.

* fix: CI 설정 파일 정리 (dev 브랜치 기준으로 불필요한 설정 제거)

* refactor: Testcontainers 설정 리팩토링 (어노테이션 제거, Redis 7.4 변경, 중복 start 제거)

* style: Unused import 및 어노테이션 정리

* style: MysqlTestContainersConfig Unused import 정리

* style: RedisTestContainersConfig 잔여 Unused import 정리

* feat: MySQL 및 Redis 테스트 컨테이너에 `@Testcontainers` 어노테이션과 `DisposableBean`을 구현하여 컨테이너 생명주기를 관리하도록 개선했습니다.

* fix: CI Docker 환경 인식 오류 수정 (DOCKER_HOST 명시)

* fix: ubuntu-22.04 고정, DOCKER_HOST 고정 테스트

* fix: ubuntu-22.04 고정, DOCKER_HOST 고정 테스트

* fix: 디버깅용 로그 제거, 테스트 로그 레벨 축소 info -> stacktrace

---------

Co-authored-by: fad <ojy9406@naver.com>
* chore: CI 테스트 커버리지 최소 기준 복구

min-coverage-overall 및 min-coverage-changed-files 설정을 10에서 70으로 변경

* chore: SupportApplication 테스트 주석 제거

- CI/CD 파이프라인 동작 확인용 주석 삭제

* feat: TeamMember에 jobFamily 필드 추가

- TeamMember 엔티티에 jobFamily 필드 추가 (@Enumerated, @column)
- 클래스 레벨에 @Getter 어노테이션 추가

* feat: team_member job_family 데이터 마이그레이션

- 기존 member.job_family 데이터를 team_member.job_family로 마이그레이션하는 SQL 스크립트 추가

* fix: 팀원 조회 시 TeamMember jobFamily 우선 적용 및 Fallback 로직 추가

- MemberQueryRepositoryImpl: 팀원 이름 조회 쿼리 수정
  - TeamMember의 jobFamily가 존재하면 해당 값을 우선 사용하도록 변경
  - null인 경우 Member의 jobFamily를 사용 (기존 데이터 호환성 유지)
- MemberQueryRepositoryTest: 기수별 다른 직군 활동 및 Fallback 로직 검증 테스트 추가

* fix: 회원 정보 수정 시 TeamMember 직군(jobFamily) 동기화

- MemberManagementService: 회원 정보 수정 시 변경된 직군을 해당 회원의 모든 TeamMember 데이터에 동기화하는 로직 추가
- TeamMember: 직군 변경을 위한 updateJobFamily 메서드 추가
- TeamMemberRepository: findByMemberId 메서드 추가
- MemberManagementServiceTest: 직군 동기화 검증 테스트 추가

* chore: JaCoCo 라인 커버리지 최소 기준 상향 (0.1 → 0.7)

- build.gradle: 테스트 커버리지(LINE) 최소 만족 비율을 10%에서 70%로 변경

* fix: MemberQueryRepositoryTest PM 조회 검증 값 수정

- 2기 팀 PM 조회 결과 검증 시 기대값을 "ject"에서 "김젝트"로 변경

* fix: MemberQueryRepositoryTest 테스트 검증 값 수정
* feat: apply github templates to ai assistant workflows and skills (#450)

* fix: resolve CodeRabbit review comments on AI templates (#450)

* fix: resolve second-round CodeRabbit review comments on manage-skills and PR workflows (#450)

* fix: resolve third-round CodeRabbit review comments on manage-skills (#450)

* fix: resolve fourth-round CodeRabbit review comments on manage-skills (#450)

* fix: resolve fifth-round CodeRabbit review comments (#450)
023-dev and others added 19 commits May 10, 2026 21:21
Admin applicant search needs to distinguish applications from multiple recruitment postings that can share semester and job family. This introduces a search condition object and adds exact recruitment id plus recruitment detail predicates while preserving the existing filters.

Constraint: Existing admin apply endpoint and filters must remain backward compatible
Rejected: Add positional service and repository parameters | adding two more filters would make the method contract harder to review and extend
Confidence: high
Scope-risk: narrow
Directive: Keep future admin apply filters on AdminApplySearchCondition instead of widening method signatures
Tested: ./gradlew test --tests org.ject.support.admin.apply.controller.AdminApplyControllerTest --tests org.ject.support.admin.apply.service.AdminApplyServiceTest --tests org.ject.support.admin.apply.repository.AdminApplyQueryRepositoryTest -x jacocoTestCoverageVerification --rerun-tasks
Not-tested: Full test suite
* Filter admin members by member type

Admin member management needs to distinguish membership type from authorization role as recruitment paths expand. The existing role, jobFamily, and semester filters remain intact while memberType is added as an optional query condition.

Constraint: Keep existing /admin/members API shape and required role parameter stable

Rejected: Replace role filtering with memberType | broader API behavior change than this PR needs

Confidence: high

Scope-risk: narrow

Tested: ./gradlew test --tests org.ject.support.admin.member.controller.AdminMemberControllerTest --tests org.ject.support.admin.member.service.AdminMemberServiceTest --tests org.ject.support.admin.member.repository.AdminMemberQueryRepositoryTest -x jacocoTestCoverageVerification --rerun-tasks

Not-tested: Full application test suite

* Populate member type after application pass

Admin member filtering relies on persisted member_type, so accepted applicants must carry the member type derived from their recruit type before the filter can be trusted.

Constraint: Keep role as permission and memberType as member classification

Rejected: Update memberType during profile save | applicants are not members until pass approval

Confidence: high

Scope-risk: narrow

Directive: Do not change pass approval role semantics without checking backoffice authorization

Tested: ./gradlew test --tests org.ject.support.admin.apply.service.ApplyPassServiceTest --tests org.ject.support.domain.recruit.domain.RecruitTypeTest --tests org.ject.support.admin.member.controller.AdminMemberControllerTest --tests org.ject.support.admin.member.service.AdminMemberServiceTest --tests org.ject.support.admin.member.repository.AdminMemberQueryRepositoryTest -x jacocoTestCoverageVerification --rerun-tasks

Not-tested: Full application test suite

* Harden member type promotion review fixes

Review feedback exposed two follow-up risks in the member type filter PR: pass approval could lazily load recruit per application, and Member.updateMemberType accepted null until database flush. Fetching recruit with the existing batch load keeps pass approval bounded, while failing fast on null keeps the entity invariant local.

Constraint: Keep the current ApplyPassService flow and member role promotion semantics unchanged

Rejected: Move member type assignment back to profile save | applicants are not confirmed members until pass approval

Confidence: high

Scope-risk: narrow

Directive: Keep memberType updates tied to pass approval unless the membership lifecycle changes

Tested: ./gradlew test --tests org.ject.support.admin.apply.service.ApplyPassServiceTest --tests org.ject.support.domain.member.MemberTest --tests org.ject.support.domain.apply.repository.ApplyRepositoryTest --tests org.ject.support.domain.recruit.domain.RecruitTypeTest --tests org.ject.support.admin.member.controller.AdminMemberControllerTest --tests org.ject.support.admin.member.service.AdminMemberServiceTest --tests org.ject.support.admin.member.repository.AdminMemberQueryRepositoryTest -x jacocoTestCoverageVerification --rerun-tasks

Not-tested: Full application test suite
* Validate application period by recruit identity

The expanded recruitment flow can have multiple active postings for the same job family, so apply APIs must not pass period validation just because another posting in the same job family is active. This changes period access to read the recruitId argument for apply flows while keeping the existing job-family flag as a compatibility path for endpoints that do not carry a recruitId.

Constraint: Existing /apply URLs are retained and carry recruitId as a request parameter.

Constraint: Existing job-family Redis flags must continue to support non-recruitId paths such as portfolio upload.

Rejected: Infer recruitId from the first Long argument | memberId is also a Long and appears before recruitId in apply service signatures.

Rejected: Replace all flags with recruitId-only keys | existing non-recruitId endpoints still rely on job-family period checks.

Confidence: high

Scope-risk: moderate

Directive: Keep RECRUIT_ID_PARAMETER_INDEX aligned with ApplyService method signatures when adding period-protected apply methods.

Tested: ./gradlew test --tests org.ject.support.domain.recruit.service.AccessPeriodVerifierTest --tests org.ject.support.domain.recruit.service.RecruitFlagServiceTest --tests org.ject.support.domain.recruit.service.AccessPeriodInitializerTest --tests org.ject.support.domain.apply.controller.ApplyControllerTest --tests org.ject.support.domain.apply.service.ApplyServiceTest -x jacocoTestCoverageVerification --rerun-tasks

Not-tested: FileControllerTest in this local environment because Redis Testcontainers cannot start without Docker access.

* Keep recruit-period flags consistent across schedule changes

Recruit-id checks exposed two stale-flag paths: postponed recruits could remain open by id, and shared job-family flags could disappear while another active posting still existed. The flag service now recalculates compatibility keys from remaining active postings, and update handling clears stale id flags before rescheduling.

Constraint: Existing recruitId-less flows still rely on job-family flags.

Rejected: Drop job-family flags entirely | legacy portfolio upload flow still depends on them.

Rejected: Leave update handling unchanged | postponed active recruits would stay authorized until the old TTL expired.

Confidence: high

Scope-risk: moderate

Directive: When changing recruit scheduling, update both recruit-id and compatibility job-family flag paths together.

Tested: ./gradlew test --tests org.ject.support.domain.recruit.service.AccessPeriodVerifierTest --tests org.ject.support.domain.recruit.service.RecruitFlagServiceTest --tests org.ject.support.domain.recruit.service.RecruitUpdatedEventHandlerTest --tests org.ject.support.domain.recruit.service.AccessPeriodInitializerTest -x jacocoTestCoverageVerification --rerun-tasks

Not-tested: FileControllerTest could not run locally because Redis Testcontainers require Docker, but the CI-specific SUPPORTER stub gap was patched.

* Keep recruit-family state coherent after updates

Recruit updates can move a posting across job families, so the update event now carries both the previous and current family. The update handler uses that transition to evict both legacy active-recruit cache keys and recalculate the previous family flag before refreshing the current recruit state.

Constraint: Legacy job-family based access paths still coexist with recruitId-based validation during migration.

Rejected: Refresh only the current family | leaves stale legacy BE/FE flags after family changes.

Confidence: high

Scope-risk: narrow

Directive: Any future recruit update event must preserve both sides of a job-family transition while legacy family keys remain in use.

Tested: ./gradlew test --tests org.ject.support.domain.recruit.service.RecruitServiceTest --tests org.ject.support.domain.recruit.service.RecruitUpdatedEventHandlerTest --tests org.ject.support.domain.recruit.service.RecruitFlagServiceTest --tests org.ject.support.domain.recruit.service.AccessPeriodVerifierTest --tests org.ject.support.domain.recruit.service.AccessPeriodInitializerTest -x jacocoTestCoverageVerification --rerun-tasks

Not-tested: FileControllerTest in this environment because Docker/Testcontainers initialization failed before test execution.
* Guard recruit-scoped application flow against legacy lookup

The expanded recruitment flow relies on recruitId to identify one application among multiple active notices, so the old member/jobFamily-only lookup path is removed and missing recruitId calls are logged at the apply API boundary.

Constraint: Existing public apply URLs remain unchanged while recruitId is required as a query parameter
Rejected: Keep unused member-only active recruit repository methods | they allow ambiguous single-application lookup when multiple notices are active
Rejected: Put apply-specific logging in GlobalExceptionHandler | common exception handling should not know apply API paths
Confidence: high
Scope-risk: narrow
Tested: ./gradlew test --tests org.ject.support.domain.apply.controller.LegacyApplyApiExceptionHandlerTest --tests org.ject.support.domain.apply.controller.ApplyControllerTest --tests org.ject.support.domain.apply.service.ApplyServiceTest -x jacocoTestCoverageVerification --rerun-tasks
Tested: ./gradlew test --tests org.ject.support.domain.recruit.service.RecruitUpdatedEventHandlerTest --tests org.ject.support.domain.recruit.service.RecruitFlagServiceTest --tests org.ject.support.domain.recruit.service.AccessPeriodVerifierTest -x jacocoTestCoverageVerification --rerun-tasks
Not-tested: QuestionControllerTest requires Redis Testcontainers/Docker and fails locally during DockerClientProviderStrategy initialization
Related: #565

* Drop unsupported legacy apply logging

Frontend and server will release together, and there are no app clients that need a compatibility window. Missing recruitId requests should remain ordinary required-parameter failures instead of getting a dedicated legacy observation path.

Constraint: No separate legacy client rollout is required
Rejected: Keep deprecation logging for missing recruitId | adds code for a compatibility scenario the product does not need
Confidence: high
Scope-risk: narrow
Tested: ./gradlew test --tests org.ject.support.domain.apply.controller.ApplyControllerTest --tests org.ject.support.domain.apply.service.ApplyServiceTest --tests org.ject.support.domain.recruit.service.RecruitUpdatedEventHandlerTest --tests org.ject.support.domain.recruit.service.RecruitFlagServiceTest --tests org.ject.support.domain.recruit.service.AccessPeriodVerifierTest -x jacocoTestCoverageVerification --rerun-tasks
Related: #565
* [chore] ai, mac os 관련 ignore 항목 추가

* [feat] applicant 테이블 생성 및 member 데이터 이관

* [feat] member_activity 및 구성원 타입별 관리 테이블 생성

* [feat] 활동 관리 테이블로 데이터 복사

* [feat] 지원자 및 관리자 데이터 삭제

* [feat] 추가된 테이블 entity 생성

* ActivityStatus 엔티티 컬럼 정의 누락 수정

* [refactor] member_activity와 member 사이 연관관계 제거
* Applicant 도메인 기반 구조 추가 (#571)

* [feat] Applicant 도메인 준비

* [ci] tmp/dev 브랜치에서 ci 활성화 (임시)

* [chore] 주석 추가 및 수정

* refactor: 인증 흐름을 Member -> Applicant 기준으로 전환 (#572)

* [refactor] 인증 대상 테이블을 applicant로 전환

* [Refactor] JWT claim 이름을 applicantId로 변경

* [Refactor] 일반 인증 흐름의 Member 의존을 Applicant로 변경

* [Refactor] 관리자 인증 흐름의 Member 의존을 Applicant로 변경

* [refactor] Member에서 이관 완료된 인증 엔드포인트, 로직 제거

* [chore] 함수 제거 및 주석 추가

* [refactor] 지원서 도메인 소유권을 applicant로 전환 (#573)

* [refactor]: 지원서 소유자를 applicant로 전환

* [db]: 지원서 외래키를 applicant로 전환

* [test]: 지원서 테스트를 applicant 기준으로 수정

* [test]: applicant 계정 조회 쿼리 테스트 이관

* [test]: applicant repository 테스트 네이밍 정리

* [chore] 임시 dev 브랜치 ci룰 제거
* [DB] 구성원 관련 테이블 수정 및 신규 엔티티 추가

- V33 마이그레이션: member 컬럼 9개 삭제, member_activity FK 제거
  recruit_type_detail 컬럼 추가, semester_event/event_participation 테이블 생성
- Member: 불필요 필드 제거 (role, pin, status, semesterId 등 9개)
- MemberActivity: recruitTypeDetail 필드 추가
- SemesterEvent, SemesterEventType, EventParticipation 엔티티 신규 생성

* [refactor] 구 구성원 관리 로직 삭제 (admin/member)

admin/member 컨트롤러, DTO, 리포지토리, 서비스 및 관련 테스트 삭제.
MemberEditor, MemberProjection, MemberQueryRepository/Impl 삭제.
새 구성원 관리 로직은 처음부터 재개발 예정.

* [refactor] TeamMember 제거, Member 도메인 로직 제거

* [db] fk 및 team_member 테이블 삭제, member 컬럼 수정

* [refactor] 변경에 따른 테스트 수정

* [refactor] 모집단위 not null 규칙 추가
* [refactor] MemberActivity 일반 구성원 aggregate 구성

* [feat] 기수 단건 조회 기능 추가

* [feat] 일반 구성원 활동 추가 기능 구현

* [test] Member 생성 팩토리 사용으로 테스트 수정

* [test] Member 도메인계층 테스트 생성, 일부 코드 가독성 개선

* [test] 구성원 추가 기능 테스트 보강

* [fix] 일반 구성원 추가 시 teamId 검증 및 저장 누락 수정

* [feat] 일반 구성원 추가 dto 검증 조건 추가

* [feat] 삭제된 구성원 존재시 복구하는 로직 추가
* [feat] 일반 구성원 목록 조회 응답 구조 추가

* [feat] 일반 구성원 목록 조회 QueryDSL 추가

* [feat] 일반 구성원 목록 조회 API 추가

* [test] 일반 구성원 목록 조회 Controller, Service, Repository 테스트 추가

* [fix] 이메일 길이로 실패하던 Question 통합테스트 수정

* [fix] Controller 테스트 실패 케이스에서 cursor 검증 수정, unique email 생성 로직 수정

* [fix] redis 컨테이너 종료로 인한 테스트 실패 조치

* [feat] 활동 상태 필터 추가

* [comment] 주석 통합 및 정리
* [refactor] 일반 구성원 목록조회 단일 필터로 변경

* [refactor] 일반 구성원 추가 시 재사용 로직을 덮어쓰기 방식으로 변경

* [fix] 프로젝트 페이징 조회 시 카운트 쿼리에 필터가 적용되지 않던 문제 해결

* [test] 프로젝트 조회 테스트에 페이징 관련 검증 보강
* [fix] 팀원 이름 조회 시 활동 상태 필터 추가

* [test] 팀원 이름 조회 활동 상태 필터 검증 추가
@kangkings
kangkings requested a review from 023-dev July 21, 2026 07:31
@kangkings kangkings self-assigned this Jul 21, 2026
@kangkings kangkings added the 👨🏻‍💻backend 백엔드 작업 label Jul 21, 2026
@kangkings kangkings added the 🛠️fix 버그 수정 label Jul 21, 2026
@coderabbitai

coderabbitai Bot commented Jul 21, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

🗂️ Base branches to auto review (1)
  • dev

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro

Run ID: 8607e5b2-0956-4d17-9687-2a0f811c6257

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • 🔍 Trigger review
✨ Finishing Touches
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch merge/resolve-conflict

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.

@github-actions

Copy link
Copy Markdown

Test Results

418 tests   418 ✅  13s ⏱️
 77 suites    0 💤
 77 files      0 ❌

Results for commit 0c4667b.

@github-actions

Copy link
Copy Markdown

📊테스트 커버리지

Overall Project 85.36% 🍏
Files changed 100% 🍏

File Coverage
AdminMemberService.java 100% 🍏
AdminMemberUseCase.java 100% 🍏
Member.java 100% 🍏
ProjectQueryRepositoryImpl.java 100% 🍏
MemberActivityQueryRepositoryImpl.java 99.56% 🍏

@kangkings
kangkings merged commit dea6e4b into main Jul 21, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

👨🏻‍💻backend 백엔드 작업 🛠️fix 버그 수정

Projects

Status: Done

Development

Successfully merging this pull request may close these issues.

3 participants