Skip to content

test: develop 기능 테스트#495

Merged
DDINGJOO merged 4 commits into
testfrom
develop
Jan 23, 2026
Merged

test: develop 기능 테스트#495
DDINGJOO merged 4 commits into
testfrom
develop

Conversation

@DDINGJOO

Copy link
Copy Markdown
Contributor

Summary

  • develop 브랜치 기능 테스트용 PR
  • speaking REST API 포함

Test plan

  • 기능 테스트 진행

hye-inA and others added 3 commits January 22, 2026 17:08
* feature : OPIc 세션관리 + 답변 처리 파이프라인 구현  (#413)

* feat : OPIc 질문 & 세션 관련 dto 생성

* refactor : @DynamoDbBean 주석 추가

* feat : 주제 + 소주제 + 레벨로 오픽 질문 조회 추가

* feat : OPIc 세션, 질문, 답변 종합 handler 구현

* feat : 오픽 주제, 소주제별 seed 데이터 추가

* refactor : Transcribe API KEY 환경변수명 수정

* refactor : Bedrock에 사용하는 클로드 모델 변경

* refactor : S3 Key 대신 Proxy에서 요청하는 Base64 값으로 변환

* feat: GAME_START, ROUND_END 메시지에 serverTime 추가

- broadcastGameStart(): serverTime, roundDuration 필드 추가
- broadcastRoundEnd(): serverTime, roundStartTime, roundDuration 필드 추가
- GameService.endRound(): data에 roundStartTime, roundDuration 포함
- 타이머 동기화 버그 수정을 위한 서버 시간 제공

* feat: WebSocketMessageHelper 유틸리티 클래스 추가

- domain 필드 포함 메시지 생성 헬퍼
- DOMAIN_CHAT, DOMAIN_GAME 상수 정의
- buildChatMessage(), buildGameMessage() 메서드

* feat: 모든 WebSocket 메시지에 domain 필드 추가

- ScoreUpdateMessage에 domain 필드 추가
- broadcastGameStart에 domain:"game" 추가
- broadcastRoundEnd에 domain:"game" 추가
- broadcastCorrectAnswerMessage에 domain:"game" 추가
- handleCommandResult 시스템 메시지에 domain:"game" 추가
- handleRegularMessage 채팅 메시지에 domain:"chat" 추가

Closes #426, #427

* feat: GameSession 모델 클래스 생성

- DynamoDB Enhanced Client 어노테이션 적용
- GSI1: roomId로 활성 게임 세션 조회 가능
- 게임 상태 관리용 헬퍼 메서드 포함

Closes #428

* feat: GameSessionRepository 구현

- 기본 CRUD (save, findById, delete)
- roomId로 활성/전체 게임 세션 조회
- 상태, 라운드, 점수 업데이트 메서드
- 정답자 추가, 힌트 사용, 게임 종료 처리

Closes #429

* refactor: ChatRoom에서 게임 필드 분리

- 게임 관련 필드 제거 (gameStatus, currentRound 등)
- activeGameSessionId 필드 추가
- 게임 상태는 GameSession으로 분리됨

Note: 의존 코드 수정은 #431에서 진행

Closes #430

* refactor: GameSession 기반으로 전체 게임 로직 리팩토링

- GameService: ChatRoom 대신 GameSession 사용
- GameStatsService: GameSession 매개변수로 변경
- CommandService: GameSession 기반 점수 조회
- GameHandler: GameSession 기반 REST API
- WebSocketMessageHandler: GameSession 기반 브로드캐스트
- GameStatusResponse, ScoreboardResponse: GameSession 매개변수

Closes #431

* feat: GameSessionHandler Lambda 및 게임 세션 API 구현

- POST /rooms/{roomId}/games - 게임 세션 생성
- GET /games/{gameSessionId} - 게임 상태 조회 (재접속용)
- POST /games/{gameSessionId}/start - 게임 시작
- POST /games/{gameSessionId}/stop - 게임 종료

모든 응답에 serverTime 포함 (타이머 동기화)
출제자에게만 currentWord 포함

Closes #432, #433

* feat: 게임 시작 7분 후 자동 종료 기능 구현

- GameConfig에 gameTimeLimit() 메서드 추가 (기본값: 420초)
- GameSchedulerClient 유틸리티 클래스 생성 (EventBridge Scheduler 연동)
- GameService에 스케줄 생성/취소 로직 추가
- GameAutoCloseHandler Lambda 함수 생성
- template.yaml에 Lambda, IAM Role, Schedule Group 추가

Closes #417

* fix : 메모리 증가 및 Lambda 응답 제한 시간 Cognito 트리거 제한시간과 동일하게 수정 (#439)

* feat: 캐치마인드 게임 방 분리 기능 구현 (#455)

- Room 타입 분리 (CHAT/GAME)
  - RoomType, RoomStatus enum 추가
  - ChatRoom 모델에 type, gameType, gameSettings, status, hostId 필드 추가
  - GameSettings 모델 추가

- 방 생성/조회 API 수정
  - CreateRoomRequest에 type, gameType, gameSettings 필드 추가
  - 방 목록 조회 시 type, gameType, status 필터 지원

- 게임 시작 조건 검증
  - GAME 타입 방에서만 게임 시작 가능 (GAME_007 에러)

- 게임 재시작 API 구현 (#452)
  - POST /rooms/{roomId}/game/restart 엔드포인트 추가
  - 방장만 재시작 가능 (GAME_009 에러)
  - 게임 진행 중 재시작 불가 (GAME_008 에러)

- 방장 변경 로직 구현 (#453)
  - 방장 퇴장 시 다음 멤버에게 자동 이전
  - 모든 멤버 퇴장 시 방 자동 삭제

- WebSocket 메시지 타입 추가 (#454)
  - ROOM_STATUS_CHANGE, HOST_CHANGE 메시지 타입 추가
  - WebSocketMessageHelper에 빌더 메서드 추가

- 테스트 추가
  - RoomType, RoomStatus enum 테스트
  - GameSettings 모델 테스트
  - ChattingErrorCode 테스트 업데이트

Related: #440, #441, #442, #443, #444, #445, #446
Closes: #447, #448, #449, #450, #451, #452, #453, #454

* feat: 참가자 닉네임 및 방장 변경 WebSocket 알림 구현 (#456)

- RoomParticipant DTO 추가 (userId, nickname, isHost)
- ChatRoomQueryService에 닉네임 조회 메서드 추가
  - getParticipantsWithNicknames(): 참가자 목록 + 닉네임
  - getHostNickname(): 방장 닉네임 조회
- ChatRoomHandler.getRoom() 응답에 participants, hostNickname 추가
- ChatRoomCommandService.leaveRoom()에서 방장 변경 시 WebSocket 브로드캐스트

Related: #440

* fix: ChatRoomFunction에 UserTable DynamoDB 권한 추가

- 참가자/방장 닉네임 조회를 위한 UserTable 읽기 권한 추가
- DynamoDBReadPolicy로 UserTable 접근 허용

Fixes #457

* fix: GameSettings에 @DynamoDbBean 어노테이션 추가

- DynamoDB Enhanced Client가 중첩 객체를 직렬화/역직렬화할 수 있도록 수정
- ChatRoom 저장/조회 시 GameSettings 변환 오류 해결

Fixes #457

* fix: ChatRoomFunction에 WEBSOCKET_ENDPOINT 환경변수 및 권한 추가

- leaveRoom에서 WebSocketBroadcaster 사용을 위한 환경변수 추가
- execute-api:ManageConnections 권한 추가

* fix: WebSocket Lambda 함수들에 WEBSOCKET_ENDPOINT 환경변수 추가

- WebSocketConnectFunction에 WEBSOCKET_ENDPOINT 추가
- WebSocketDisconnectFunction에 WEBSOCKET_ENDPOINT 추가
- execute-api:ManageConnections 권한 추가

* fix: Grammar WebSocket Lambda 환경 변수 및 권한 추가

- GrammarStreamingConnectFunction에 WEBSOCKET_ENDPOINT 환경 변수 추가
- GrammarStreamingDisconnectFunction에 WEBSOCKET_ENDPOINT 환경 변수 추가
- 두 함수에 execute-api:ManageConnections 권한 추가

* feat: GSI1SK 확장성 있는 재설계 및 DB 레벨 필터링

- 기존: {level}#{createdAt}
- 신규: {type}#{gameType}#{status}#{level}#{createdAt}

- 전체 방: GSI1PK = "ROOMS"
- 게임방만: begins_with(GSI1SK, "GAME#")
- 캐치마인드만: begins_with(GSI1SK, "GAME#CATCHMIND#")
- 대기중 캐치마인드: begins_with(GSI1SK, "GAME#CATCHMIND#WAITING#")

- ChatRoomCommandService.java: 방 생성 시 새 GSI1SK 포맷 적용
- ChatRoomRepository.java: findByFilters() 메서드 추가, updateStatus() 메서드 추가
- ChatRoomQueryService.java: 메모리 필터링 제거, DB 레벨 필터링으로 변경
- GameService.java: 게임 시작/종료 시 방 상태 업데이트 (GSI1SK 포함)

- scripts/migrate-gsi1sk.sh: 기존 데이터 마이그레이션 스크립트
- 37개 기존 방 마이그레이션 완료

* fix: increase stats query limit to 100 days

- Adjust maximum allowable limit for recent stats query from 30 to 100 days to support extended data range responses.

* feat: improve game round and connection management logic

- Added handling for game round timeout (`ROUND_TIMEOUT`) in WebSocketMessageHandler.
- Enhanced game start broadcast to include `currentWord` for the drawer only.
- Updated ConnectionRepository to remove duplicate user connections in the same room.
- Added `currentWordEnglish` to GameSession for better answer verification.
- Normalized ChatRoom levels to match database storage format.
- Updated template.yaml to include DynamoDBReadPolicy for VocabTable.

* refactor: 코드 정리 및 미사용 클래스 제거 (#459)

* refactor: remove unused WebSocketResponseUtil

* refactor: add AutoCloseable to WebSocketBroadcaster

* refactor: remove unused TestService

* refactor: remove unused WordService

* refactor: remove unused DailyStudyService

* refactor: remove unused UserWordService

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* style: remove p tag from javadoc

* fix: resolve N+1 query in StatsService

* refactor(all): DI 패턴 및 전략 패턴 적용 (#461)

- Repository, Service, Handler에 DI 생성자 추가 (테스트 용이성)
- BadgeService에 Strategy 패턴 적용 (뱃지 조건 검증 로직 분리)

* refactor: relocate and restructure seed data files

- Moved `question-homes.json` and `words.json` from subdirectories to `seed` folder.
- Updated file paths for better organization and clarity.

* chore: seed 데이터 폴더 구조 정리

* feat: add CI/CD pipeline configuration for CodePipeline

* fix: add SNS topic policy and DependsOn for notification rule

* fix: correct paths in buildspec.yml for CodeBuild

* fix: remove hardcoded JAVA_HOME, use runtime default

* fix: add gradle wrapper for CI/CD build

* fix: use single line sam package command with hardcoded bucket

* fix: use existing stack name group2-englishstudy-chatting

* fix: add missing WEBSOCKET_ENDPOINT env var to WebSocket connect functions

* docs: update FRONTEND-API-GUIDE with new RoomType/RoomStatus structure

* feat : WebSocket Connect, Disconnect 핸들러 & SpeakingConnecion 모델 구현

* feat : WebSocket 메시지 처리 handler, service 구현

* feat : WebSocket 연결 정보 Repository 구현

* fix: update WebSocketDisconnectHandler to use GameSession model

- Remove references to deleted ChatRoom game fields
- Use GameSessionRepository to finish active game sessions
- Use ChatRoomRepository.updateStatus() for room state management

* perf: optimize CI/CD build time

- Add pip cache for SAM CLI dependencies
- Enable Gradle parallel builds and build cache
- Add SAM build cache (.aws-sam)
- Use sam build --parallel --cached
- Skip SAM CLI install if already cached
- Remove unnecessary 'clean' to leverage cache

* feat: add custom CodeBuild Docker image with pre-installed tools

- Dockerfile with Java 21 + SAM CLI + Gradle pre-installed
- build-and-push.sh script for ECR deployment
- Updated buildspec.yml for custom image (removes SAM CLI install)
- Expected build time reduction: ~30-40 seconds

* feature : AI 영어 회화 연습 기능 (#468)

* feat : WebSocket Connect, Disconnect 핸들러 & SpeakingConnecion 모델 구현

* feat : WebSocket 메시지 처리 handler, service 구현

* feat : WebSocket 연결 정보 Repository 구현

* fix: remove typo in SpeakingConnectionRepository

* fix : 오타 수정

* chore: trigger build test with custom Docker image

* chore: remove unnecessary newlines and whitespace across WebSocket handlers and related classes

* chore: remove unnecessary newlines and whitespace across WebSocket handlers and related classes

* refactor : websocket -> rest api 전환

* feat : speaking handler REST로 교체

* feat : speaking 관련 dto 생성

* refacotor : 기존 service 코드 로직 재사용 및 repository 리펙토링

* fix: add CORS headers to API Gateway error responses (#479)

API Gateway의 인증 실패 등 에러 응답에 CORS 헤더가 누락되어
CloudFront를 통한 프론트엔드 요청이 차단되는 문제 수정

- UNAUTHORIZED (401) 응답에 CORS 헤더 추가
- ACCESS_DENIED (403) 응답에 CORS 헤더 추가
- DEFAULT_4XX/5XX 응답에 CORS 헤더 추가
- EXPIRED_TOKEN 응답에 CORS 헤더 추가

* feat : speaking rest API 람다 함수 추가

---------

Co-authored-by: ddingjoo <ddingsha9@teambind.co.kr>
- 14개 뉴스 관련 배지 추가 (읽기, 퀴즈, 단어수집, 연속학습, 마스터)
- UserStats에 뉴스 통계 필드 추가
- 6개 뉴스 배지 Strategy 클래스 생성
- 뉴스 읽기/퀴즈/단어수집 시 통계 업데이트 및 배지 체크 연동
…-badge-system

feat(news): 뉴스 학습 배지 시스템 구현 (#473)
@github-actions github-actions Bot added backend Backend code changes layer:entity Entity/Domain layer layer:repository Repository/DAO layer layer:service Service layer labels Jan 23, 2026
@DDINGJOO DDINGJOO merged commit 2cfa89b into test Jan 23, 2026
1 check passed
hye-inA pushed a commit that referenced this pull request Jan 23, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

backend Backend code changes layer:entity Entity/Domain layer layer:repository Repository/DAO layer layer:service Service layer

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants