[RELEASE] 1.4.10 - #632
Merged
Merged
[RELEASE] 1.4.10#632
Conversation
UserController에 남아 있던 POST /users/login 처리를 AuthController로 옮겨 인증 관련 엔드포인트를 인증 패키지에 모은다. 요청 경로와 요청·응답 형식은 그대로 유지해 기존 클라이언트 계약에는 변화가 없다.
사용자 ID만으로 Access Token을 발급하는 POST /users/login과 AuthApplication.login을 Deprecated로 표시하고 사유를 문서화한다. 신규 클라이언트는 소셜 로그인으로 인증하고 Access Token 만료 시 POST /reissue로 재발급받아야 하며, 기존 클라이언트의 미사용이 확인되면 별도 이슈에서 제거한다.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> (cherry picked from commit ed075b2)
[HOTFIX] 인기 피드 소설 정보 null 반환 방지
[REFACTOR] Refresh Token 저장소 접근 책임 정리
[REFACTOR] Deprecated 리소스 인가 구조 제거
[TEST] 인증 Controller 테스트에 Access Token 적용 기반 마련
[REFACTOR] Apple 외부 연동 책임 정리
[TEST] 소셜 로그인 및 로그아웃 인증 흐름 보완
[REFACTOR] GET /novels/taste 응답 지연 개선
동기 appender는 요청 스레드가 직접 인코딩·write·flush를 수행해 16스레드 부하 실측에서 요청당 평균 538us, p99 7,209us가 로깅에 소요됐다. 로그 전송이 정체되면 파이프 버퍼 포화로 요청 스레드가 최대 501ms까지 멈추기도 했다. AsyncAppender를 적용해 평균 37us, p99 8.8us로 낮추고, 큐가 가득 차면 로그를 버리되 요청 처리는 막지 않도록 neverBlock을 켠다. INFO 로그까지 임의로 버리지 않도록 discardingThreshold는 0으로 둔다. 컨테이너 stdout은 Docker awslogs 드라이버가 수집하므로 파일 appender는 중복이라 제거한다. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
[CHORE] 요청·응답 바디 로깅 및 민감정보 마스킹 적용
[CHORE] 멀티모듈 구조를 단일 모듈로 통합
[REFACTOR] 공통 API 오류 응답 코드 체계를 도입
[FIX] 피드 ETC 필터 조건 수정
[FIX] 노벨 전체 탐색 다중 키워드 조건을 OR로 변경
[FEAT] 서재 노벨 정보에 작가명 추가
[FIX] 노벨 통계 조회 시 통계 테이블 데이터 사용
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Related Issue
Key Changes
인증·인가와 공통 오류 응답 정비
COMMON-*코드로 응답하도록 정리했습니다.a33a881b,43be287e,6bffdb26컬렉션 기능 추가
collection_novel.display_order로 보존하며, 같은 작품과 같은 사용자의 중복 좋아요는 DB 제약조건으로 방지합니다.a7ced573,fe85ce0a완결·휴재 복귀 알림 기능 추가
is_sent로 관리합니다.novelId를 추가해 작품 알림의 이동 대상을 전달합니다.b899358d조회 정확성·성능과 클라이언트 계약 보완
novel_statistics에서 조회하고 회원 탈퇴 시 통계 기여분을 차감합니다.729192b3,0ba234ef,d81a0c03빌드·문서·로깅 구조 정비
wss-common과wss-service-support를 루트 source set으로 이동해 Gradle 단일 모듈로 통합하고 Java 17 toolchain을 명시했습니다.094b2843,bd7fb6c1,54b179fdTo Reviewers
머지·배포 순서
main과dev가 분기돼 있으며 현재 병합 시FeedCustomRepositoryImplTest.java에서 add/add 충돌이 발생합니다. 충돌을 해결해 최신main을dev에 반영한 뒤 최종 검증해야 합니다.mainpush 즉시 운영 CD가 시작되므로 아래 운영 DB 작업과 로그 수집 경로 확인을 PR 머지 전에 완료해야 합니다.ddl-auto: none이므로 아래 DDL은 자동 적용되지 않습니다.notification.novel_id는 구버전에서 참조하지 않으므로 스키마를 즉시 제거하지 않고 이전 이미지만 재배포합니다.1. 실행 전 운영 DB 상태 확인
아래 결과를 먼저 기록합니다.
unknown_user_count는 반드시1이어야 합니다. 값이 없으면collection.user_idFK 정책을 확정한 뒤 센티넬 사용자를 먼저 준비해야 합니다.missing_novel_statistics_count는0이어야 합니다.SHOW CREATE TABLE결과를 최종 정의와 비교합니다.2. 컬렉션 테이블 생성
운영에 세 테이블이 모두 없을 때 아래 순서로 실행합니다.
collection.is_public에는 DB 기본값을 두지 않습니다.collection.representative_novel_id와collection_like.user_id에는 FK를 두지 않습니다.collection_like의 감사 시각은 DBNOW(6)로 기록되므로 DB 세션과 애플리케이션 JVM의 시간대를Asia/Seoul로 맞춥니다.3. 작품 알림 구독 테이블 생성
저장소의 기존 DDL은 목록 조회 조건인
is_sent가 인덱스에서 빠져 있습니다. 아래처럼 엔티티와 실제 조회 조건에 맞춘 최종 정의를 적용합니다.4. 기존 notification 테이블 확장
테이블 크기와 실행 계획을 확인하고 컬럼·인덱스·FK를 분리해 적용합니다. FK 추가는 테이블 재구성과 쓰기 잠금 가능성이 있으므로 저트래픽 시간대에 실행합니다.
5. 작품 통계 누락·불일치 보정
1단계 조회의
missing_novel_statistics_count가 0이 아니거나 원천user_novel과 통계값이 다르면, 저트래픽 시간대에 아래 보정 쿼리를 한 번 실행합니다.6. 작품 알림 타입 시드
어드민이 실제 작품 알림 발송을 시작하기 전까지 적용합니다.
<...>는 확정된 S3 아이콘 경로로 치환한 뒤 실행하며, 기존 행이 있으면 INSERT하지 않습니다.novel_notification_subscription.is_sent = TRUE로 갱신하고, 앱 내 알림 생성 시notification.novel_id를 채워야 합니다.7. 적용 후 검증
운영·호환성 확인
logback-spring.xml은 파일 로그를 제거하고 JSON stdout만 출력합니다. 운영deploy.sh가 awslogs 또는 동등한 수집 경로를 사용하고, 기존 평문 기반 CloudWatch 필터가 JSON에 맞게 갱신됐는지 확인해야 합니다.websoso/websoso-image:latest태그를 사용하므로 운영 CD 동안 dev push를 중단하고 배포 전후 이미지 digest를 기록해 주세요.is_sent계약을 어드민 배포 일정과 맞춰야 합니다.NotificationItem.novelId, 서재 작품의author는 추가 필드입니다. 클라이언트는novelId = null을 허용해야 합니다.401 AUTH-001로 변환되지 않습니다. 클라이언트의 401 재로그인 분기가 상태 코드와COMMON-*오류 코드 변경을 수용하는지 확인해 주세요.dev에서./gradlew build -x test는 성공했습니다../gradlew test는 792개 중 13개가 실패했으며, 12개는 로컬 MySQL 부재로 인한 컨텍스트 실패이고 1개는main에도 동일한RecentSearchServiceTest기존 NPE입니다.main병합 충돌 해결 후 운영과 같은 설정에서 두 명령을 다시 실행해야 합니다.References