Skip to content

develop -> main#492

Merged
JanooGwan merged 60 commits intomainfrom
develop
Apr 1, 2026
Merged

develop -> main#492
JanooGwan merged 60 commits intomainfrom
develop

Conversation

@JanooGwan
Copy link
Copy Markdown
Contributor

🔍 개요


🚀 주요 변경 내용


💬 참고 사항


✅ Checklist (완료 조건)

  • 코드 스타일 가이드 준수
  • 테스트 코드 포함됨
  • Reviewers / Assignees / Labels 지정 완료
  • 보안 및 민감 정보 검증 (API 키, 환경 변수, 개인정보 등)

dh2906 and others added 30 commits March 18, 2026 21:36
…test

test: 업로드 관련 통합 테스트 작성
* test: 채팅 API 통합 테스트 작성

* test: 엣지 케이스 보강

* refactor: 채팅 통합 테스트의 fixture 범위를 시나리오별 의존성에 맞게 분리

* test: 일반 채팅방 생성이 사용자 쌍당 하나만 유지되도록 계약을 고정

* test: 채팅방 뮤트 해제 검증을 최종 상태 기반으로 수정
* feat: 광고 테이블 추가 마이그레이션

* feat: 광고 엔티티 추가

* feat: 어드민 광고 CRUD API 추가

* feat: 광고 조회 및 클릭 집계 API 추가

* feat: 광고 API 통합 테스트 추가

* chore: 코드 포맷팅

* refactor: 롬복의 게터 적용

* feat: 사이즈 검증 어노테이션 추가

* refactor: 클릭 집계 원자적으로 증가

* chore: 코드 포맷팅

* chore: 코드 포맷팅

* fix: 광고 클릭 수 동시성 및 비노출 광고 클릭 방지

* feat: 수정 요청 DTO에 사이즈 검증 어노테이션 추가

* refactor: FQN 제거

* fix: increaseClickCount() 메서드 제거

* fix: null-safe 검증

* chore: 코드 포맷팅
hotfix: 인터셉터가 인터페이스 Auth/PublicApi 어노테이션을 인식하지 못하는 문제 해결 (develop)
* fix: 광고 조회 API 통합

* test: 수정된 API에 대한 테스트 코드 작성

* refactor: 전체 광고 엔티티 로딩 제거

* test: 중복 없음 검증 추가

* chore: 코드 포맷팅
* test: 관리자 일정 API 통합 테스트 작성

* test: 권한 관련 검증 테스트 분리

* chore: 코드 포맷팅

* refactor: 에러 코드 문자열 enum 상수로 통일

* test: 유효하지 않은 배치 요청 이후 DB 값 검증

* chore: FQDN 제거

* fix: 음수 id 테스트에서 에러 코드 검증 추가

* fix: 값 검증 시 영속성 컨텍스트 캐시가 아닌 실제 DB 데이터를 조회

* chore: 코드 포맷팅

* fix: 값 검증 시 영속성 컨텍스트 캐시가 아닌 실제 DB 데이터를 조회
* test: 동아리 설정 통합 테스트 작성

* chore: 코드 포맷팅

* refactor: 불필요한 엔티티 조회 제거

* fix: 두 번째 요청 전 mockLoginUser 호출

* refactor: 불필요한 인터셉터 스텁 제거

* fix: RecruitmentSummary의 null 필드 직렬화 문제 해결

* test: 후속 GET 요청에 status 코드 검증 추가

* refactor: 존재하지 않는 ID 테스트에 상수 사용

* refactor: 동아리 설정 조회 권한 테스트 중복을 파라미터화로 정리
* test: 동아리 설정 통합 테스트 작성

* chore: 코드 포맷팅

* refactor: 불필요한 엔티티 조회 제거

* fix: 두 번째 요청 전 mockLoginUser 호출

* refactor: 불필요한 인터셉터 스텁 제거

* fix: RecruitmentSummary의 null 필드 직렬화 문제 해결

* test: 후속 GET 요청에 status 코드 검증 추가

* refactor: 존재하지 않는 ID 테스트에 상수 사용

* refactor: 동아리 설정 조회 권한 테스트 중복을 파라미터화로 정리

* hotfix: 채팅방 목록 조회 N+1 문제 해결

* chore: 코드 포맷팅
hotfix: 채팅방 목록 조회 응답 속도 개선 (develop)
* feat: 구글 스프레드시트 동아리 인명부 동기화 API 구현

* feat: 구글 스프레드시트 동아리 인명부 동기화 API 구현

* fix: 전화번호 앞 0 누락 방지 및 동기화 실패 로그 추가

* feat: 동아리별 스프레드시트 ID 저장 및 sync API 개선

* fix: Checkstyle 120자 초과 라인 수정

* fix: Checkstyle 120자 초과 해결 - Swagger description 영어 변환

* feat: 가입 승인/탈퇴 시 구글 시트 자동 동기화 트리거

* feat: 회비 납부 장부 자동화 - Async/Debounce 시트 동기화 및 정렬 기능 구현

* fix: Checkstyle - MagicNumber 상수 치환 및 NoWhitespaceAfter 수정

* feat: Claude API 기반 시트 헤더 자동 분석 및 커스텀 매핑 동기화 구현

* fix: Checkstyle MagicNumber 상수 치환

* fix: sheetSyncExecutor Bean 이름 충돌 해결 - sheetSyncTaskExecutor로 변경

* fix: SheetHeaderMapper RestClient.Builder로 교체 (Bean 미등록 오류 해결)

* fix: @TransactionalEventListener + @transactional 충돌 해결 - 클래스 레벨 트랜잭션 제거

* feat: 시트 헤더 위치 자동 감지 - 상위 10행 스캔 및 dataStartRow 기반 동기화 개선

* fix: Checkstyle NoWhitespaceAfter 수정

* docs: ClubMemberSheetApi Swagger 설명 한글화

* docs: ClubFeePaymentApi Swagger 설명 한글화

* feat: 회비 장부 별도 탭 자동 감지 및 동기화 구현 - AI가 인명부/회비 장부 탭 자동 구분

* fix: Checkstyle - UnusedImports, LineLength, EqualsAvoidNull 수정

* fix: Checkstyle LineLength 수정 - memberList fields 줄바꿈

* feat: Drive 폴더 관리 + 역방향 동기화 + 기존 시트 팀 양식 이관 구현

* fix: Google Drive API 버전 수정 - v3-rev20250723-2.0.0

* fix: Checkstyle UnusedImports 수정

* revert: 회비 납부(FeePayment) 기능 전체 제거 - 팀 논의 후 재도입 예정

* fix: FeePayment 파일 삭제 누락 수정 (git rm)

* fix: ClubSheetSortKey에서 FEE_PAID 제거

* fix: 동기화 시 탈퇴 멤버 행이 스프레드시트에 잔존하는 버그 수정

* feat: 시트 마이그레이션 시 요청자에게 스프레드시트 소유권 이전

* chore: ClubFeePayment 기능 롤백 마이그레이션 추가

* refactor: AI 리뷰어 피드백 반영

* fix: @transactional self-invocation 버그 및 동기화 비동기 처리 수정

* fix: NOT_FOUND_ADVERTISEMENT 누락 복구 - develop 브랜치 충돌 해결

* fix: Flyway 버전 충돌 해결 - V50~V55를 V51~V56으로 재번호 (develop의 V50__add_advertisement_table과 충돌)

* refactor: coderabbitai 재리뷰 피드백 반영
* fix: 해상도 크기 검증 로직 제거

* feat: 파일 업로드 크기 초과 예외 처리

* fix: 파일 크기 초과 에러 코드 수정

* fix: 파일 크기 검증 로직 제거

* chore: 코드 포맷팅
* chore: gitignore 항목 추가

* fix: JPEG 업로드 시 ImageReader 입력 바인딩 누락으로 인한 변환 실패를 방지

* test: 업로드 테스트 추가

* test: 다른 확장자에 대한 이미지 업로드 테스트

* feat: 이미지 리사이징 로직 추가

* test: 리사이징 검증 테스트 추가

* test: 리사이징 단위 테스트 추가

* chore: 인증 인터셉터 단위 테스트 패키지 이동

* chore: 코드 포맷팅

* chore: gitignore 하위 디렉토리도 적용

* fix: webp 이미지도 리사이징 거치도록 수정

* fix: 리사이징에서 가로 최대 크기를 1800px로 수정

* fix: 이미지 리사이징 시 투명 픽셀이 검은 색으로 변하는 문제 해결

* chore: 코드 포맷팅

* fix: 이미지 리사이징 시 품질, 크기 보수적으로 수정
* fix: 이미지 리사이징 로직 제거

* chore: 코드 포맷팅
* refactor: 관리자 1:1 채팅방 조회 성능 최적화

* refactor: 서브쿼리 제거

* feat: 인덱스 추가

* chore: 코드 포맷팅
* feat: 트레이싱 로깅 설정

* feat: 애플리케이션 이름 추가

* feat: 트레이싱을 위한 자바 에이전트 추가

* feat: 환경변수 예시 추가
hotfix: CI 빌드에서 런타임 전용 OTel agent 설정을 제외 (develop)
* refactor: CAM-233 Google Sheets API 리팩토링

* refactor: CAM-233 coderabbitai/copilot 리뷰 반영

* fix: GoogleDriveOAuthService - @transactional self-invocation 문제 수정

* fix: ClubSheetIdUpdateRequest, SheetImportRequest - @pattern 강화

* fix: SheetMigrationService - copyTemplate RuntimeException을 CustomException으로 변경

* fix: GoogleDriveOAuthService - code/state 선검증 추가 및 persistGoogleRefreshToken private 변경

* fix: SheetMigrationService - extractSpreadsheetId를 SpreadsheetUrlParser.extractId로 교체
hotfix: 이미 가입된 계정으로 연동하면 발생하는 DB 에러 핸들링 (develop)
* fix: migrate 시 서비스 계정에 새 파일 편집 권한 자동 부여

* fix: getClientEmail() 메서드명 수정

* fix: coderabbit 리뷰 반영 - 서비스 계정 권한 부여 실패 시 예외 처리 강화

* fix: 권한 부여 실패 시 고아 파일 삭제 보상 처리 추가

* fix: 트랜잭션 롤백 시 Drive 고아 파일 자동 삭제 보상 처리 추가

* fix: readAllData/writeToTemplate IO 실패 시 예외 전파하여 트랜잭션 롤백 보장

* fix: 고아 파일 이중 삭제 방지 - 롤백 훅에 일원화
* fix: sheet migrate 폴더 지정 버그 수정 및 import 중복 방어 강화

* refactor: SheetImportService N+1 쿼리 제거

* refactor: PreMemberKey projection 도입 및 루프 내 중복 방어 강화

* fix: checkstyle EmptyLineSeparator 수정
* fix: Google Sheet Import/Migration 버그 수정 및 데이터 품질 개선 (CAM-239)

* refactor: coderabbit 리뷰 반영 (CAM-239)

* fix: coderabbit 2라운드 리뷰 반영 (CAM-239)

* refactor: coderabbit 3라운드 리뷰 반영 (CAM-239)

* fix: coderabbit 4라운드 리뷰 반영 (CAM-239)
* add phone number format() method for 010-xxxx-xxxx formatting

* fix migration: apply phone format(), recover parent folder on copy()

* fix sync: replace tick-prefix phone with PhoneNumberNormalizer.format()

* 전화번호 복구 조건 좁히기, 불필요 분기 제거, 상수 중복 해소 및 Javadoc 수정

* 마이그레이션 parents 재조회 실패 시 예외 처리로 롤백 보장

* copyTemplate 예외 경로에서 고아 파일 정리 보장
* feat: 인앱 알림 기능 추가

* style: Checkstyle 120자 위반 수정

* test: NotificationInboxApiTest 통합 테스트 추가

* fix: save() REQUIRES_NEW 트랜잭션 격리 및 정렬 타이브레이커 추가

* feat: 동아리 지원 알림 수신자를 운영진 전체로 확장

* feat: SSE 기반 실시간 인앱 알림 구독 API 추가

* fix: SSE 재구독 시 기존 emitter 명시적 종료 및 콜백 오제거 방지

* fix: SSE 전송 실패 시 emitters.remove 레이스 컨디션 방지
* feat: 채팅 메시지에 대한 인앱 알림도 추가

* test: 테스트 실패하는 문제 해결

* fix: SSE 요청 로깅에서 제외

* feat: 읽지 않은 쪽지에 대한 알림 타입 추가
dh2906 and others added 27 commits March 27, 2026 23:51
* refactor: 트랜잭션 전파 옵션 제거

* fix: 비동기 알림 메서드에 트랜잭션을 명시해 readOnly 영향 제거

* fix: 승인·거절 알림 메서드에 트랜잭션을 추가
* fix: 광고 랜덤 조회의 반복 단건 조회를 제거해 쿼리 횟수를 줄임

* chore: 코드 포맷팅
* fix: SSE 구독 인증 실패 시 ErrorResponse 직렬화 충돌

* fix: SSE 인증 실패를 상태 코드와 전용 경고 로그로 분리
* fix: 캐시 버전 업그레이드 및 캐시 키 통일

* feat: 오픈 텔레메트리 에이전트 캐싱 추가

* refactor: 오픈 텔레메트리 에이전트 다운로드를 COPY로 대체

* chore: 캐싱 버전 업데이트

* chore: Gradle 빌드 명령을 bootJar로 변경

* chore: OTEL 에이전트 버전을 변수로 추출 및 참조

* chore: GitHub Actions 의존성 해시로 고정 및 체크섬 검증 추가

* chore: OTEL 캐시 키에 OS 및 해시 정보 추가
* feat: 채팅방 멤버에 커스텀 방 이름 필드 추가

* feat: 사용자별 채팅방 이름 수정 기능 추가

* test: 채팅방 이름 수정 관련 통합 테스트 추가

* chore: 코드 포맷팅

* chore: 채팅방 API 문서 불필요한 오류 코드 제거
* feat: 채팅방 타입 및 탈퇴 컬럼 추가

* feat: 1:1 채팅방 탈퇴 및 메시지 가시성 로직 추가

* test: 1:1 및 그룹 채팅방 탈퇴 테스트 케이스 추가

* chore: 코드 포맷팅

* chore: 불필요한 인덱스 생성 쿼리 제거

* refactor: LocalDateTime import로 코드 가독성 개선

* chore: 채팅방 복구 로직에 주석 추가

* refactor: 나간 채팅방 복구 로직 분리 및 구조 개선

* chore: 채팅방 복구 주석 표현 개선
* fix: HikariCP 커넥션 풀 설정 추가

* feat: 알림 전용 스레드풀 설정 추가

* refactor: NotificationService 알림 전용 스레드풀 적용

* refactor: ChatRoomMembershipService 멤버 초기화 및 읽음 처리 로직 분리

* refactor: ChatService 채팅 조회 메서드 읽기 전용 트랜잭션 분리

* fix: ChatRoomMembershipService 캐스팅 후 공백 제거

* refactor: AsyncConfig 기본 executor 지정 및 알림 스레드풀 포화 시 드롭 정책 적용

* fix: ChatRoomMembershipService 채팅방 및 멤버 동시 생성 시 중복 방지 처리

* refactor: ChatService 조회 메서드 비트랜잭션 오케스트레이터로 전환 및 presence 기록 순서 변경

* fix: updateLastReadAtIfOlder 쿼리에 NULL 값 갱신 조건 추가

* fix: ChatRoomMembershipService 클럽 방 null 방어 및 isSystemAdminRoom 중복 호출 제거

* fix: AsyncConfig 기본 executor CallerRunsPolicy 적용 및 알림 거절 시 예외 전파

* fix: ChatRoomMembershipService 클럽 방 생성 race condition 및 ADMIN 멤버 readAt 시각 정합성 수정

* feat: Slack 전용 스레드풀 추가 및 미지정 @async에 명시적 executor 지정

* fix: DataIntegrityViolationException 처리 시 중복 키 예외만 선별하여 처리

* fix: ChatService Redis presence 기록 실패 시 메시지 조회 중단 방지

* fix: isDuplicateKeyException DB 비종속적 중복 키 감지 패턴 추가

* fix: slackTaskExecutor CallerRunsPolicy를 로깅 후 RejectedExecutionException으로 변경

* fix: ChatService recordPresenceSafely 메서드 구문 오류 수정

* fix: ChatRoomMembershipService deadlock 방지 정렬 및 DuplicateKeyException 선별 처리

* fix: ChatService getDirectChatRoomMessages readAt 재선언 및 resolveMessageReceiver 누락 수정

* fix: ChatService recordPresenceSafely 무한 재귀 수정 및 중복 호출 제거
* feat: 새 채팅방 초대 가능 사용자 목록 조회 API 추가

* feat: 초대 가능 사용자 목록 정렬 및 그룹화 로직 추가

* test: 초대 가능 사용자 조회 테스트 케이스 추가

* refactor: 초대 가능 사용자 조회 로직 QueryDSL로 개선

* feat: 초대 가능 사용자 목록 페이징 처리 추가

* test: 초대 가능 사용자 목록 페이징 테스트 추가

* refactor: 초대 가능 사용자 조회 설명 주석 추가

* refactor: 초대 가능 사용자 조회 로직 구조 개선

* test: 초대 가능 사용자 목록 클럽 페이징 테스트 추가

* refactor: 초대 가능 사용자 조회 쿼리 distinct 제거

* chore: 코드 포맷팅

* refactor: 초대 가능 사용자 조회 쿼리에 groupBy 추가

* refactor: 대표 동아리 필터링 불필요 로직 제거

* refactor: 미사용 초대 가능 사용자 조회 메서드 삭제
* feat: 구글 시트 통합 import api 추가

* fix: 시트 통합 import 트랜잭션 경계 조정

* refactor: 시트 통합 import 분석 결과 재사용
* feat: 채팅방 검색 기능 추가

* feat: 채팅 검색 limit 상한 검증 추가

* refactor: 채팅 검색 조회 트랜잭션 정리

* fix: Google Sheets credentials 경로 검증 추가

* fix: 채팅 검색 트랜잭션 경계 보정

* fix: 채팅 검색 가시성 및 이름 매칭 보정

* test: 채팅 검색 회귀 테스트 보강

* refactor: 채팅 검색 조회 트랜잭션 정리

* refactor: 채팅 검색 direct room 조회 범위 축소
* feat: 채팅방 멤버에 방장 여부 필드 추가

* feat: 그룹 채팅방 생성 API 추가

* feat: 그룹 채팅방 생성 기능 구현

* feat: 그룹 채팅방 유형 분리 및 관련 로직 확장

* feat: 채팅방 생성 시간 노출 및 정렬 로직 반영

* chore: 코드 포맷팅

* feat: `getById` 메서드 추가 및 기존 로직 리팩토링

* chore: `@PostMapping` 어노테이션 제거

* feat: `saveAll` 메서드 추가 및 채팅방 멤버 저장 로직 최적화

* chore: `DEFAULT_GROUP_ROOM_NAME` 상수 추가 및 관련 코드 정리

* feat: `updateLastReadAt` 로직 개선 및 예외 처리 추가

* chore: 코드 포맷팅

* feat: 그룹 채팅방 멤버 강퇴 기능 추가 (#474)

* fix: getGroupChatRooms 중복 커스텀 방 이름 조회 제거

* chore: 채팅방 중복 생성 관련 문서화 주석 제거

* fix: group 메시지 전송 시 강퇴된 멤버 row 재생성 방지, lastReadAt 업데이트 fallback을 club 전용으로 분리

* fix: 나간 그룹 채팅방이 목록에 표시되는 문제 방지를 위해 leftAt 필터 추가

* fix: 일반 GROUP 방에서 getAccessibleRoomMember가 퇴장 여부 확인하도록 수정

* fix: 충돌 해결하면서 발생한 문제 해결

* chore: 코드 포맷팅
* fix: 채팅 관련 인앱 알림 제외

* test: 채팅 인앱 알림 제외 검증 보강

* style: NotificationInboxService 줄바꿈 정리
* fix: 구글 시트 403 응답 처리 및 권한 부여 보강

* chore: 구글 시트 체크스타일 보정

* fix: 구글 시트 권한 예외 후속 처리 보완

* fix: 구글 시트 자격 검증 및 실패 감지 보완

* fix: 구글 시트 권한 부여 멱등성 및 Drive 인증 오류 처리 보완

* fix: 구글 시트 권한 정리 기준 및 예외 분류 보완

* fix: 구글 시트 reader 권한 중복 호출 제거
* test: 타이머 동기화 및 중지 테스트 케이스 추가

* refactor: remove duplicate test stopWithoutTimerFails
* test: 회원가입 API 통합 테스트 추가

* chore: 코드 포맷팅
* test: 회원 탈퇴 API 통합 테스트 추가

* chore: 코드 포맷팅
* test: 동아리 승인 멤버 지원서 API 통합 테스트 추가

* chore: 코드 포맷팅

* fix: 미사용 변수 제거

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

* fix: 미사용 변수 제거

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>

---------

Co-authored-by: Copilot Autofix powered by AI <223894421+github-code-quality[bot]@users.noreply.github.com>
* fix: 구글 시트 403 응답 처리 및 권한 부여 보강

* chore: 구글 시트 체크스타일 보정

* fix: 구글 시트 권한 예외 후속 처리 보완

* fix: 구글 시트 자격 검증 및 실패 감지 보완

* fix: 구글 시트 권한 부여 멱등성 및 Drive 인증 오류 처리 보완

* fix: 구글 시트 권한 정리 기준 및 예외 분류 보완

* fix: 구글 시트 reader 권한 중복 호출 제거

* fix: 시트 invalid_grant 응답 바디 노출

* fix: 시트 권한 처리 리뷰 반영

* chore: 슬랙 리스너 checkstyle 정리

* refactor: 구글 시트 권한 helper 공통화

* fix: 시트 권한 복구 상태 판별 보완
* fix: 시트 동기화에 사전 회원 포함

* chore: 시트 동기화 로그 포맷 정리

* fix: 시트 동기화 수 응답 오버플로우 감지 추가

* test: 시트 동기화 테스트 필드 탐색 안정화

* docs: Sheet 관련 Swagger 설명 정정
@coderabbitai
Copy link
Copy Markdown

coderabbitai bot commented Apr 1, 2026

Important

Review skipped

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

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: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro

Run ID: a01fbf1b-9f9b-41b0-8c83-dd3863d61a6f

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 develop

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.

@JanooGwan JanooGwan merged commit 51382a6 into main Apr 1, 2026
6 checks passed
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.

2 participants