Skip to content

Conversation

@chat26666
Copy link
Collaborator

@chat26666 chat26666 commented Jun 13, 2025


작업 내용

  • 게임 캐릭터 생성 기능, 아이템 생성 기능, 아이템 뽑기, 스테이터스 확인, 아이템 장착 등 게임의 기본요소 기능이 몇 추가되었습니다.

변경 사항

Honeycam 2025-06-14 02-07-27

Honeycam 2025-06-14 02-08-12

Honeycam 2025-06-14 02-08-49

Honeycam 2025-06-14 02-09-43

Honeycam 2025-06-14 02-10-05

Honeycam 2025-06-14 02-10-19


트러블 슈팅

  • mongoDB 를 쓰면서 이번에 느꼈지만.. 비정형 데이터를 저장하다보니.. DTO 의 데이터 구조도 비정형이 되어버려서 이 부분이 조금 껄끄러웠던 것 같습니다. 일단은 다형성을 통해서 추상 클래스로 DTO 를 받게끔 처리하여 쓸데없는 컨트롤러 메서드가 반복적으로 늘어나는 현상을 방지했으나 이렇게 해결하는 것이 적절한 방법인지는 추후 피드백을 받아서 다시 리팩토링하도록하겠습니다.

해결해야 할 문제

  • 기능 중 이제 거의 20~30% 정도만 구현된 상태라 나머지도 빠르게 구현해보고 성능개선 리팩토링을 진행하겠습니다.

참고 사항


코드 리뷰 전 확인 체크리스트

  • 불필요한 콘솔 로그, 주석 제거
  • 커밋 메시지 컨벤션 준수 (type : )
  • 기능 정상 동작 확인

Summary by CodeRabbit

  • 신규 기능

    • 게임 도메인에 캐릭터 생성, 상태 조회, 아이템 뽑기(가챠), 인벤토리 조회, 아이템 장착 등 다양한 게임 플레이 기능이 추가되었습니다.
    • 게임 아이템(무기, 방어구, 액세서리) 및 스킬, 전투, 인벤토리, 랜덤 인카운터 등 관련 엔터티와 관리 기능이 도입되었습니다.
    • 게임 아이템 관리 및 생성/저장/조회/삭제를 위한 관리자 및 사용자용 API가 추가되었습니다.
    • MongoDB 기반 아이템 저장소 및 커스텀 컨버터, Spring Data 연동이 적용되었습니다.
    • 게임 캐릭터 상태 및 인벤토리 관리, 아이템 장착, 아이템 뽑기 로직이 서비스 및 유스케이스 계층에 구현되었습니다.
    • 채팅 API에 Swagger(OpenAPI) 문서화 주석이 추가되었습니다.
  • 버그 수정

    • 없음
  • 문서화

    • 채팅방 API 및 DTO에 Swagger(OpenAPI) 문서화 주석이 추가되었습니다.
    • application.properties에 MongoDB 설정 및 시각적 구분이 추가되었습니다.
  • 리팩터

    • 채팅 관련 이벤트 및 DTO, 리스너, 퍼블리셔 클래스의 명칭이 더 명확하게 변경되었습니다.
    • 일부 컨트롤러 메서드 명칭이 실제 동작을 더 잘 반영하도록 변경되었습니다.
  • 환경설정

    • MongoDB 및 MapStruct 의존성이 추가되었습니다.
    • 시큐리티 허용 경로가 "/auth/"에서 "/api/auth/"로 변경되었습니다.

@coderabbitai
Copy link

coderabbitai bot commented Jun 13, 2025

Caution

Review failed

The pull request is closed.

"""

Walkthrough

이번 변경에서는 게임 도메인에 RPG 시스템(아이템, 캐릭터, 인벤토리, 스킬, 전투 등)과 관련된 엔티티, 서비스, 컨트롤러, 리포지토리, DTO, 예외 처리, 맵퍼, MongoDB 연동 및 변환기, 그리고 Swagger 문서화 어노테이션이 대규모로 추가되었습니다. 기존 채팅 이벤트 DTO 및 핸들러 클래스의 명칭도 일관성 있게 정비되었습니다.

Changes

파일/경로 그룹 변경 요약
build.gradle, application.properties MongoDB, MapStruct 등 신규 의존성 및 MongoDB 설정 추가
.../chatting/dto/request/ChatRoomDeleteRequest.java, ChatRoomSaveRequest.java, ChatSaveRequest.java
.../chatting/dto/response/ChatResponse.java, RoomChangedResponse.java
.../chattingmanagement/chatting/controller/ChatRoomController.java
Swagger(OpenAPI) 어노테이션 추가로 API 문서화 메타데이터 보강
.../event/dto/*.java, .../event/listener/ChatEventListener.java, .../event/service/ChatEventPublisher.java 채팅 이벤트 DTO 및 핸들러/퍼블리셔 클래스명 일괄 변경 및 적용
.../event/dto/ EnterEvent, RoomEnterEvent, BroadCastChatEvent, RoomEnterAndLeftEvent, RoomChangeEvent → 각각 ChatRoomListLoadEvent, ChatRoomHistoryLoadEvent, ChatMessageBroadcastEvent, ChatRoomEntryExitMessageEvent, ChatRoomParticipantCountChangeEvent로 클래스명 변경
.../game/dto/request/, .../game/dto/response/ 아이템/캐릭터/인벤토리 관련 DTO, 맵퍼, 응답 객체 신규 추가
.../game/dto/mapper/GameMapper.java MapStruct 기반 도메인 엔티티→DTO 변환 맵퍼 인터페이스 추가
.../game/management/GameAdminUseCase.java, .../game/play/GamePlayUseCase.java 게임 아이템 관리 및 플레이 유스케이스 서비스 클래스 추가
.../game/model/entity/, .../game/model/enums/ 게임 도메인 엔티티(캐릭터, 아이템, 인벤토리, 배틀 등) 및 Enum(무기, 방어구, 액세서리, 스탯 등) 대량 추가
.../game/repository/, .../game/service/ 도메인 서비스 및 리포지토리 인터페이스/구현체 신규 추가
.../infrastructure/mongodb/config/, .../mongodb/repository/ MongoDB 연동 설정, 커스텀 컨버터, Spring Data Mongo 리포지토리, 래퍼 구현체 추가
.../infrastructure/persistence/repository/game/ JPA 기반 캐릭터/인벤토리 리포지토리 및 구현체 추가
.../presentation/game/management/ItemManagementController.java, .../presentation/game/play/GamePlayController.java 게임 아이템 관리 및 플레이 REST 컨트롤러 추가
.../domain/game/Util/StatUpdateUtil.java 문제 카테고리별 스탯 증가율 관리 유틸 클래스 추가
.../domain/game/exception/ 게임 도메인 전용 예외 및 에러코드 Enum 추가
.../common/security/config/SecurityConfig.java 인증 예외 URL 패턴 "/auth/" → "/api/auth/"로 수정
.../infrastructure/cache/config/RedisCacheConfig.java 클래스명 CacheRedisConfig → RedisCacheConfig로 변경
.../presentation/chattingmanagement/event/EventHandleController.java 메서드명 의미에 맞게 변경 (handleEnter → handleGetChatRoomList 등)
.../infrastructure/persistence/repository/chat/ChatRepositoryImpl.java, ChatRoomRepositoryImpl.java 메서드에 @Override 어노테이션 추가

Sequence Diagram(s)

sequenceDiagram
    participant Client
    participant GamePlayController
    participant GamePlayUseCase
    participant CharacterStatusDomainService
    participant ItemShoppingDomainService
    participant GameMapper

    Client->>GamePlayController: POST /games/gamblings (아이템 뽑기)
    GamePlayController->>GamePlayUseCase: gamblingForItem(userId, itemCategory)
    GamePlayUseCase->>CharacterStatusDomainService: getGameCharacter(userId)
    GamePlayUseCase->>ItemShoppingDomainService: gamblingNewWeapon/Defence/Accessory(character)
    ItemShoppingDomainService->>CharacterStatusDomainService: getNewItemToInventory(character, item)
    ItemShoppingDomainService-->>GamePlayUseCase: Item
    GamePlayUseCase->>GameMapper: toItemResponse(item)
    GamePlayUseCase-->>GamePlayController: ItemGamblingResponse
    GamePlayController-->>Client: HTTP 201 + ItemGamblingResponse
Loading

Possibly related PRs

Suggested reviewers

  • chat26666

Poem

🐰
새싹처럼 자라난 RPG,
무기와 방어구, 액세서리까지 쏙쏙!
캐릭터와 인벤토리, 전투의 꿈,
몽고DB와 JPA가 손을 잡고
토끼는 오늘도 코드를 탐험해요.
“게임의 세계, 이제 시작!”
🗡️🛡️✨
"""


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between cd3a906 and 123d3ff.

📒 Files selected for processing (1)
  • .github/workflows/ci.yml (1 hunks)

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
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

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

🧹 Nitpick comments (53)
src/main/java/org/ezcode/codetest/domain/game/model/enums/EncounterHandlerKey.java (2)

3-4: Javadoc 누락됨
enum 역할과 사용처를 설명하는 Javadoc을 추가해 도메인 모델 문서를 보완해주세요.


5-7: 들여쓰기 스타일 일관성 확인 필요
현재 enum 상수 앞에 탭이 사용되었습니다. 프로젝트의 인덴트 규칙(스페이스 4칸)과 일치하도록 스페이스로 변경해주세요.

src/main/java/org/ezcode/codetest/domain/game/model/entity/RandomEncounter.java (1)

13-16: @column 어노테이션 및 제약조건 추가 고려
데이터베이스 컬럼 매핑을 명시적으로 지정하고, null 허용 여부나 길이 제한을 위해 @Column(name = "encounter_text", nullable = false, length = 500) 등을 추가하는 것을 권장합니다.

src/main/java/org/ezcode/codetest/domain/game/model/entity/EncounterChoice.java (2)

27-28: cascade 설정 검토 필요
관계 엔티티에서 CascadeType이 지정되지 않아 EncounterChoice 생성/삭제 시 RandomEncounter가 의도치 않게 영속화되지 않을 수 있습니다. 비즈니스 요구사항에 맞춰 cascade = CascadeType.PERSIST 등 적절한 옵션을 고려해주세요.


31-34: @column 어노테이션 추가 권장
resultTexthandlerKey 필드에 대해 길이, nullable 속성 등을 명시하는 @Column 어노테이션을 추가하여 DB 스키마 안정성을 높일 수 있습니다.

src/main/java/org/ezcode/codetest/domain/game/model/enums/ItemType.java (1)

1-4: 마커 인터페이스에 JavaDoc 추가 고려
현재 ItemType는 폴리모핑을 위한 마커 인터페이스로 사용됩니다. 해당 역할과 사용 방식을 문서화하기 위해 JavaDoc을 추가하면 가독성과 유지보수성이 향상됩니다.

src/main/java/org/ezcode/codetest/common/security/config/SecurityConfig.java (1)

63-64: 인증 경로 패턴 관리 및 일관성 확인 요청
인증 URL 패턴을 상수로 추출해 중복을 줄이고, 컨트롤러와 Swagger 설정 등에서 /api/auth/**가 일관되게 사용되는지 검증해주세요.

src/main/java/org/ezcode/codetest/application/game/dto/response/ItemResponse.java (1)

3-4: ItemResponse 마커 인터페이스 정의 적절
공통 상위 타입으로 활용 목적에 부합합니다. JavaDoc으로 인터페이스 용도를 명시하는 것을 고려해 보세요.

src/main/java/org/ezcode/codetest/domain/game/model/enums/DefenceType.java (1)

3-6: DefenceType enum 구현 적절
ItemType 인터페이스 구현으로 방어구 카테고리 분류를 명확히 하고 있으며, 상수 정의도 간결합니다. JavaDoc 주석으로 각 상수의 의미를 보강하면 가독성이 향상됩니다.

src/main/java/org/ezcode/codetest/domain/game/model/enums/AccessoryType.java (1)

3-6: AccessoryType enum 구현 적절
ItemType 구현을 통해 악세서리 아이템 유형 분리를 잘 수행하고 있습니다. JavaDoc 추가를 고려해 보세요.

build.gradle (1)

92-98: MongoDB 및 MapStruct 의존성 추가 적절
Spring Boot 3.5.0에 맞춰 spring-boot-starter-data-mongodb와 MapStruct(1.6.3)를 의존성 관리에 추가했습니다.

추가로, 통합 테스트에서 MongoDB 환경 시뮬레이션을 위해 de.flapdoodle.embed:de.flapdoodle.embed.mongo 같은 Embedded MongoDB 의존성 도입을 검토해 보시는 것을 추천드립니다.

src/main/resources/application.properties (2)

74-78: 구분선 주석이 중복되어 가독성이 떨어집니다
# ======================== 주석이 두 번 연속 등장합니다. 한 줄만 남기는 편이 섹션 구분 의도가 더 명확합니다.

-# ========================
-# OAuth GOOGLE
-# ========================
+# ========================
+# OAuth GOOGLE

85-91: MongoDB 설정값 보강 및 운영 성능 고려

  1. 데이터베이스명을 별도 프로퍼티로 노출하지 않아 다중 DB 상황에서 혼동될 수 있습니다.
  2. auto-index-creation=true 는 개발-로컬에선 편리하지만, 운영에서는 애플리케이션 기동 시 인덱스 생성/변경으로 인해 심각한 성능 저하가 발생할 수 있습니다.
+# (예시) 명시적 DB 선택
+spring.data.mongodb.database=${SPRING_MONGODB_DATABASE}
+
 # 운영 환경 분리 예시
-spring.data.mongodb.auto-index-creation=true
+spring.data.mongodb.auto-index-creation=${MONGODB_AUTO_INDEX:true}

MONGODB_AUTO_INDEX 를 프로파일 별로 false 로 둔 뒤, 운영 배포 시 수동으로 인덱스를 관리하는 방안을 검토해 주세요.

src/main/java/org/ezcode/codetest/domain/game/model/enums/WeaponType.java (1)

3-7: Enum 확장성을 위한 메타데이터 보강 제안
현재 값만 나열되어 있어 클라이언트 표시명이나 공격력 계수 등 부가 정보가 필요할 때 매번 switch 로 매핑해야 합니다. Enum 필드에 displayName, defaultAttack 등을 함께 보관하면 코드 중복을 줄일 수 있습니다.

public enum WeaponType implements ItemType {
    SHOT_GUN("샷건", 80),
    RIFLE("라이플", 70),
    ...
    ;

    private final String displayName;
    private final int baseDamage;

    WeaponType(String displayName, int baseDamage) {
        this.displayName = displayName;
        this.baseDamage = baseDamage;
    }

    // getter …
}
src/main/java/org/ezcode/codetest/domain/game/repository/GameCharacterRepository.java (1)

7-12: 중복 캐릭터 생성 방지를 위한 메서드 보강
save() 이전에 사용자별 캐릭터 존재 여부를 빠르게 확인할 메서드가 없습니다. 빈 Optional 체크 대신 existsByUserId(Long) 제공 시 의도가 명확해지고 성능도 향상될 수 있습니다.

src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/InventoryJpaRepository.java (1)

8-11: N+1 쿼리 예방을 위한 연관 로딩 전략 지정
인벤토리 조회 시 아이템(또는 장비) 컬렉션을 즉시 사용한다면 @EntityGraph 로 fetch 전략을 명시해 주세요. 그렇지 않으면 서비스 계층에서 연속적인 lazy 로딩으로 N+1 문제가 발생할 수 있습니다.

@EntityGraph(attributePaths = "items")
Optional<Inventory> findByGameCharacterId(Long gameCharacterId);
src/main/java/org/ezcode/codetest/application/game/dto/request/CharacterSaveRequest.java (1)

5-10: 입력 검증 범위 강화
@NotBlank 만으로는 과도하게 긴 이름을 막지 못합니다. 길이 제한을 함께 두면 DB 컬럼 길이 초과 예외를 사전에 차단할 수 있습니다.

-@NotBlank(message = "이름은 공백일 수 없습니다.")
+@NotBlank(message = "이름은 공백일 수 없습니다.")
+@Size(max = 30, message = "이름은 30자를 넘을 수 없습니다.")
src/main/java/org/ezcode/codetest/application/game/dto/request/ItemEquipRequest.java (1)

5-9: Swagger 문서화를 위한 어노테이션 추가 제안

API 스펙을 명확히 하려면 @Schema(or @ApiModelProperty) 등의 Swagger 어노테이션을 필드에 추가해 주세요.
이렇게 하면 프런트엔드/QA에서 요청 본문 형식을 더 쉽게 확인할 수 있습니다.

src/main/java/org/ezcode/codetest/application/game/dto/response/ItemGamblingResponse.java (1)

10-12: 메시지 하드코딩 대신 상수·i18n 자원으로 분리하세요
UI/다국어 대응이나 테스트 시 재사용성을 위해 성공 메시지를 코드에 직접 문자열로 넣기보다는 static final 상수 또는 메시지 소스(MessageSource)로 분리해두는 편이 유지보수에 유리합니다.

- return new ItemGamblingResponse(itemResponse, "축하합니다! 뽑기에 성공하셨습니다.(중복아이템은 자동으로 골드로 환전됩니다)");
+ return new ItemGamblingResponse(
+     itemResponse,
+     GameMessage.ITEM_GAMBLE_SUCCESS   // 예: messages.properties 키 또는 상수
+ );
src/main/java/org/ezcode/codetest/infrastructure/mongodb/repository/ItemMongoRepository.java (1)

17-18: 메서드 파라미터 명칭 혼동
findByIdIn(Collection<String> id)에서 매개변수명이 단수형이라 IDE 자동완성 시 가독성이 떨어집니다. 복수형(ids)으로 수정하는 편이 좋습니다.

- List<Item> findByIdIn(Collection<String> id);
+ List<Item> findByIdIn(Collection<String> ids);
src/main/java/org/ezcode/codetest/application/game/dto/response/DefenceResponse.java (1)

6-15: 필드 명과 타입에 대한 사소한 개선 제안

  1. def 필드는 의미가 모호하고 Python 예약어와도 겹칩니다. defence 또는 defencePoint 등 더 명확한 이름을 고려해 보세요.
  2. 모든 스탯이 Integer(객체형)인데, null 값이 절대 허용되지 않는다면 int(기본형)으로 선언해 Boxing 오버헤드를 없애는 것도 선택지입니다.

큰 문제는 아니지만 향후 리팩터링 시 참고하시면 좋겠습니다.

src/main/java/org/ezcode/codetest/application/game/dto/response/WeaponResponse.java (1)

6-17: 속성 타입 통일성 검토 필요

crit, stun, accuracy 등도 Integer로 선언돼 있습니다. API 응답에서 null 허용 여부가 명확하지 않다면 기본형 int 사용으로 의도를 명확히 하고 JSON 직렬화 시 불필요한 null 출력을 방지할 수 있습니다.

src/main/java/org/ezcode/codetest/domain/game/repository/ItemRepository.java (1)

15-17: 대량 조회 시 페이징 지원 고려

findAll()findAllByItemCategory()가 모두 컬렉션 전체를 반환합니다. 아이템 수가 많아질 경우 메모리 사용이 급격히 증가할 수 있으니 Pageable 또는 커서 기반 페이징 메서드를 추가하는 것을 권장합니다.

src/main/java/org/ezcode/codetest/domain/game/model/entity/Accessory.java (1)

15-20: 속성 타입 선택에 대한 재검토 권장

Integer 래퍼를 사용하면 null 허용으로 인한 NPE 위험이 있고, 오토박싱 비용이 추가됩니다.
스탯이 필수 값이라면 int 원시형으로 선언하거나, null 허용이 목적이라면 생성자에서 기본값을 명확히 지정해 두는 편이 안전합니다.

src/main/java/org/ezcode/codetest/domain/game/model/enums/Defence.java (1)

43-54: 중복 정보 및 확장성 이슈

category, grade가 모두 문자열로 들어가 있어 ItemCategory, Grade(가정) enum과 중복됩니다.
타이포나 다국어 처리 문제를 줄이려면 enum 참조로 변경하거나, i18n 분리 전략을 고려해 주세요.

src/main/java/org/ezcode/codetest/application/game/dto/request/ItemSaveRequest.java (1)

11-20: 다형성 역직렬화 실패 대비 설정 부족

@JsonTypeInfo만 설정돼 있고 @JsonIgnoreProperties(ignoreUnknown = true)가 없어 예기치 않은 필드 전송 시 400 오류가 날 수 있습니다.
API 유연성을 높이려면 다음 어노테이션을 추가하는 것을 권장합니다.

+@JsonIgnoreProperties(ignoreUnknown = true)
src/main/java/org/ezcode/codetest/domain/game/service/ItemManagementDomainService.java (1)

28-31: 메서드 명료성 개선 제안

getAllItemList()getAllItems() 정도로 복수형을 활용하면 표현이 더 자연스럽습니다.

src/main/java/org/ezcode/codetest/domain/game/model/enums/Skill.java (2)

10-15: “임시 파일” 주석 제거 및 불필요 코드 관리
//임시 파일 곧 지워질 예정 주석은 PR 병합 시점에 혼란을 줍니다. 실제로 제거 예정이라면 파일 자체를 git-ignore 범위에 두거나, 그렇지 않다면 주석을 삭제하고 정식 자원으로 취급해 주세요.


38-40: 문자열 등급은 Enum으로 승격하는 것이 유지보수에 유리합니다
grade"전설", "고급"처럼 문자열로 흩어져 있습니다. 추후 필터링/정렬 시 오탈자 위험이 크므로 Grade enum을 별도로 두고 필드를 Enum으로 변경하는 것을 제안드립니다.

src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/InventoryRepositoryImpl.java (1)

17-25: 인터페이스 구현 메서드에 @Override 누락
save, findByGameCharacterId 모두 @Override를 붙여 컴파일러 수준에서 시그니처 변경을 감지하도록 해주세요.

- public Inventory save(Inventory inventory) {
+ @Override
+ public Inventory save(Inventory inventory) {
   return inventoryRepository.save(inventory);
 }
 
- public Optional<Inventory> findByGameCharacterId(Long gameCharacterId) {
+ @Override
+ public Optional<Inventory> findByGameCharacterId(Long gameCharacterId) {
   return inventoryRepository.findByGameCharacterId(gameCharacterId);
 }
src/main/java/org/ezcode/codetest/infrastructure/mongodb/repository/ItemRepositoryImpl.java (1)

17-52: @Override 및 트랜잭션 경계 명시 고려
모든 메서드에 @Override가 빠져 있습니다. 또한 MongoTemplate을 직접 사용하지 않더라도 @Transactional(readOnly = true)/@Transactional 어노테이션으로 의도를 명확히 하면 다른 계층에서의 롤백 제어가 용이합니다.

src/main/java/org/ezcode/codetest/domain/game/model/enums/Weapon.java (1)

44-55: 필드 순서 및 명명 규칙 통일 제안
atk, def, speed 등 스탯 필드가 있지만 DefenceAccessory에도 유사 스키마가 있습니다. Stat VO를 만들어 공통화하면 가독성과 코드 재사용성이 높아집니다.

src/main/java/org/ezcode/codetest/domain/game/model/entity/Defence.java (1)

15-17: 원시 타입 사용 및 의미 있는 필드명 권장

Integer 대신 int를 사용하면 null-safe 하며 boxing 오버헤드를 제거할 수 있습니다.
또한 def 보다는 defense 처럼 의미가 분명한 이름이 가독성에 좋습니다.

src/main/java/org/ezcode/codetest/domain/game/model/entity/Item.java (1)

14-33: equals / hashCode 누락

Item 을 Set·Map 등에 넣거나 테스트에서 객체 동등성을 비교할 경우 문제가 발생할 수 있습니다.
id 기반으로 Lombok @EqualsAndHashCode(onlyExplicitlyIncluded = true) 등을 추가해 두는 편이 안전합니다.

src/main/java/org/ezcode/codetest/application/game/dto/mapper/GameMapper.java (1)

20-28: 메서드 오버로드로 인한 가독성·유지보수 부담

toItemResponse 가 네 번 오버로드되어 IDE 자동 완성 시 혼란을 줄 수 있습니다.
toWeaponResponse, toDefenceResponse 등 명시적인 메서드명을 사용하는 편이 명확합니다.
(변경 시 컨트롤러·서비스 레이어 호출부도 함께 수정 필요)

src/main/java/org/ezcode/codetest/domain/game/model/enums/Accessory.java (1)

10-11: 임시 주석·상수는 병합 전 정리해주세요

//임시 파일 곧 지워질 예정 주석과 관련 상수는 PR 병합 전에 제거하거나 TODO 이슈로 분리하는 것이 좋습니다.

src/main/java/org/ezcode/codetest/domain/game/model/entity/Weapon.java (1)

15-20: 원시형(int) 사용으로 NPE·불필요한 오토박싱 방지

Integer 대신 int를 사용하면

  1. 필드 값이 절대 null 이 될 수 없어 NPE 가능성을 제거하고
  2. 오토박싱/언박싱 비용을 없앨 수 있습니다.
    무의미한 null 허용이 필요 없다면 원시형으로 교체해 주세요.
-private Integer atk;
-private Integer speed;
-private Integer crit;
-private Integer stun;
-private Integer accuracy;
+private int atk;
+private int speed;
+private int crit;
+private int stun;
+private int accuracy;
src/main/java/org/ezcode/codetest/domain/game/model/entity/CharacterRealStat.java (1)

16-24: Double 대신 원시형(double) 사용 검토

실수형 스탯이 null 이 될 시나리오는 거의 없습니다.
모두 Double 을 쓰면 매 연산에서 오토박싱 비용이 발생하므로 double 로 치환을 고려해 주세요.

src/main/java/org/ezcode/codetest/domain/game/exception/GameExceptionCode.java (1)

13-16: 국문 메시지 오탈자 수정 제안

"조회되지 없습니다.""조회되지 않습니다." 등 어색한 표현이 반복됩니다.
API 응답 품질을 위해 메시지 문구를 확인해 주세요.

src/main/java/org/ezcode/codetest/domain/game/model/entity/Inventory.java (2)

37-45: 중복 방지를 위해 List 대신 Set 사용 고려

아이템 ID 는 고유해야 합니다. List 는 동일 ID 가 여러 번 들어갈 수 있으므로 Set<String> 으로 교체하면 중복 검사 로직 없이도 무결성을 확보할 수 있습니다.


71-92: stream().filter().findFirst() 대신 contains 로 단순화

동일 ID 존재 여부만 확인한다면 스트림보다 Collection#contains 가 읽기·성능 모두 간단합니다.

-    foundItem = weapons.stream()
-        .filter(w -> w.equals(itemId))
-        .findFirst()
-        .orElse(null);
+    foundItem = weapons.contains(itemId) ? itemId : null;
src/main/java/org/ezcode/codetest/domain/game/model/entity/Battle.java (1)

36-37: 원시형 boolean 사용 및 네이밍 개선

isWinAttackerboolean attackerWin 정도로 단순화하면 NPE 위험이 사라지고 가독성이 높아집니다.

-private Boolean isWinAttacker;
+private boolean attackerWin;
src/main/java/org/ezcode/codetest/application/game/dto/request/AccessorySaveRequest.java (1)

58-71: AccessoryType 변환 실패 시 예외 유형 명확화 필요
valueOf()는 잘못된 문자열에 대해 IllegalArgumentException을 던집니다. 게임 도메인 전용 GameException으로 래핑해 클라이언트에게 일관된 오류 코드를 반환하도록 개선하는 것이 좋습니다.

src/main/java/org/ezcode/codetest/domain/game/service/ItemShoppingDomainService.java (1)

32-34: Random 인스턴스 반복 생성 & 중복 로직
각 메서드마다 new Random()과 동일한 코드가 반복됩니다. ThreadLocalRandom.current()를 사용하고, 카테고리만 인자로 받는 공통 메서드로 추출하면 GC 압력과 중복을 줄일 수 있습니다.

Also applies to: 57-59, 82-84

src/main/java/org/ezcode/codetest/presentation/game/play/GamePlayController.java (2)

31-45: 메서드 명명 규칙 일관성 부족
CreateCharacter, CharacterStatusOpen처럼 대문자로 시작하는 메서드는 자바 관례(소문자 시작)와 어긋납니다. 컨트롤러 전반을 camelCase로 통일해 주세요.


56-62: 메서드명이 중복되어 의도 파악 어려움
gamblingForItem 이름이 GET /inventories에서도 재사용되어 혼란을 줍니다. 인벤토리 조회용 별도 명칭(e.g. openInventory)으로 변경하면 가독성이 향상됩니다.

src/main/java/org/ezcode/codetest/domain/game/Util/StatUpdateUtil.java (1)

1-2: 패키지 이름 대소문자 혼용 – 표준 위반
domain.game.Util 패키지의 대문자 Util은 자바 패키지 네이밍 규칙에 맞지 않습니다. …util로 소문자 변경을 권장합니다.

src/main/java/org/ezcode/codetest/application/game/play/GamePlayUseCase.java (1)

38-52: 읽기 전용 트랜잭션 지정 고려
CharacterStatusOpen 는 조회만 수행하므로 @Transactional(readOnly = true) 로 지정하면 플러시를 생략해 성능을 개선할 수 있습니다. 또한 메서드명 역시 characterStatusOpen 로 맞춰주세요.

src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java (3)

73-84: 매직 넘버 및 초기값 하드코딩 제거
gold = 10000LNOTHING 문자열 직접 할당은 상수화하거나 설정값으로 분리하는 편이 좋습니다.


86-90: 파라미터 이름이 필드와 겹쳐 가독성 저하
applyIncreaseStats(Map<Stat, Double> stats) 에서 파라미터와 필드 stats 가 동일한 이름입니다. incrementStats 처럼 변경해 혼동을 줄이세요.


92-98: 이중 세미콜론 제거 및 상수 사용 권장
gold -= 50L;; → 세미콜론 하나 삭제하고, 50LGAMBLE_COST 와 같은 상수로 선언해 주세요.

src/main/java/org/ezcode/codetest/domain/game/service/CharacterStatusDomainService.java (2)

3-8: 사용하지 않는 Comparator import 제거
컴파일 경고를 예방하고 가독성을 높이기 위해 불필요한 import 는 삭제하세요.


30-36: 트랜잭션 어노테이션 누락
쓰기 연산을 수행하는 도메인 서비스 메서드들이 @Transactional 이 빠져 있습니다. 상위 UseCase 레이어에서 감싸더라도, 서비스 단에 명시하면 독립 사용 시 안전성이 높아집니다.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between debafb9 and 92304f7.

📒 Files selected for processing (75)
  • build.gradle (1 hunks)
  • src/main/java/org/ezcode/codetest/application/chatting/dto/request/ChatRoomDeleteRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/chatting/dto/request/ChatRoomSaveRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/chatting/dto/request/ChatSaveRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/chatting/dto/response/ChatResponse.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/chatting/dto/response/RoomChangedResponse.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/mapper/GameMapper.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/request/AccessorySaveRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/request/CharacterSaveRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/request/DefenceSaveRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/request/ItemEquipRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/request/ItemGamblingRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/request/ItemSaveRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/request/WeaponSaveRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/response/AccessoryResponse.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/response/CharacterStatusResponse.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/response/DefenceResponse.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/response/ItemGamblingResponse.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/response/ItemResponse.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/response/WeaponResponse.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/management/GameAdminUseCase.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/play/GamePlayUseCase.java (1 hunks)
  • src/main/java/org/ezcode/codetest/common/security/config/SecurityConfig.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/Util/StatUpdateUtil.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/exception/GameException.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/exception/GameExceptionCode.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Accessory.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Battle.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/CharacterRealStat.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Defence.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/EncounterChoice.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Inventory.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Item.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/RandomEncounter.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Skill.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Weapon.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/Accessory.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/AccessoryType.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/Defence.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/DefenceType.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/EncounterHandlerKey.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/ItemCategory.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/ItemType.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/Skill.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/Stat.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/Weapon.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/WeaponType.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/repository/GameCharacterRepository.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/repository/InventoryRepository.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/repository/ItemRepository.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/service/CharacterStatusDomainService.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/service/ItemManagementDomainService.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/service/ItemShoppingDomainService.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/cache/config/RedisCacheConfig.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatMessageBroadcastEvent.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatRoomEntryExitMessageEvent.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatRoomHistoryLoadEvent.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatRoomListLoadEvent.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatRoomParticipantCountChangeEvent.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/event/listener/ChatEventListener.java (6 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/event/service/ChatEventPublisher.java (2 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/mongodb/config/ItemTypeReadConverter.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/mongodb/config/MongoConverterConfig.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/mongodb/repository/ItemMongoRepository.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/mongodb/repository/ItemRepositoryImpl.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/GameCharacterJpaRepository.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/GameCharacterRepositoryImpl.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/InventoryJpaRepository.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/InventoryRepositoryImpl.java (1 hunks)
  • src/main/java/org/ezcode/codetest/presentation/chattingmanagement/chatting/controller/ChatRoomController.java (3 hunks)
  • src/main/java/org/ezcode/codetest/presentation/chattingmanagement/event/EventHandleController.java (2 hunks)
  • src/main/java/org/ezcode/codetest/presentation/game/management/ItemManagementController.java (1 hunks)
  • src/main/java/org/ezcode/codetest/presentation/game/play/GamePlayController.java (1 hunks)
  • src/main/resources/application.properties (1 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (14)
src/main/java/org/ezcode/codetest/domain/game/exception/GameException.java (2)
src/main/java/org/ezcode/codetest/common/base/exception/BaseException.java (1)
  • BaseException (5-12)
src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java (1)
  • Getter (37-120)
src/main/java/org/ezcode/codetest/presentation/game/management/ItemManagementController.java (1)
src/main/java/org/ezcode/codetest/presentation/game/play/GamePlayController.java (1)
  • RestController (24-73)
src/main/java/org/ezcode/codetest/application/game/dto/request/ItemSaveRequest.java (4)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Defence.java (1)
  • Getter (11-35)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Accessory.java (1)
  • Getter (11-41)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Item.java (1)
  • Getter (14-33)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Weapon.java (1)
  • Getter (11-41)
src/main/java/org/ezcode/codetest/domain/game/model/entity/EncounterChoice.java (1)
src/main/java/org/ezcode/codetest/domain/game/model/entity/RandomEncounter.java (1)
  • Entity (9-18)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Inventory.java (5)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Defence.java (1)
  • Getter (11-35)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Accessory.java (1)
  • Getter (11-41)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Item.java (1)
  • Getter (14-33)
src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java (1)
  • Getter (37-120)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Weapon.java (1)
  • Getter (11-41)
src/main/java/org/ezcode/codetest/domain/game/model/enums/Defence.java (3)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Defence.java (1)
  • Getter (11-35)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Item.java (1)
  • Getter (14-33)
src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java (1)
  • Getter (37-120)
src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/GameCharacterRepositoryImpl.java (1)
src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/InventoryRepositoryImpl.java (1)
  • Repository (11-26)
src/main/java/org/ezcode/codetest/domain/game/exception/GameExceptionCode.java (2)
src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java (1)
  • Getter (37-120)
src/main/java/org/ezcode/codetest/domain/game/exception/GameException.java (1)
  • Getter (9-21)
src/main/java/org/ezcode/codetest/infrastructure/mongodb/repository/ItemRepositoryImpl.java (1)
src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/InventoryRepositoryImpl.java (1)
  • Repository (11-26)
src/main/java/org/ezcode/codetest/application/game/dto/request/DefenceSaveRequest.java (3)
src/main/java/org/ezcode/codetest/application/game/dto/request/AccessorySaveRequest.java (1)
  • JsonTypeName (14-73)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Defence.java (1)
  • Getter (11-35)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Item.java (1)
  • Getter (14-33)
src/main/java/org/ezcode/codetest/domain/game/model/entity/CharacterRealStat.java (1)
src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java (1)
  • Getter (37-120)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Weapon.java (4)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Defence.java (1)
  • Getter (11-35)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Accessory.java (1)
  • Getter (11-41)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Item.java (1)
  • Getter (14-33)
src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java (1)
  • Getter (37-120)
src/main/java/org/ezcode/codetest/application/game/dto/request/AccessorySaveRequest.java (3)
src/main/java/org/ezcode/codetest/application/game/dto/request/DefenceSaveRequest.java (1)
  • JsonTypeName (14-63)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Accessory.java (1)
  • Getter (11-41)
src/main/java/org/ezcode/codetest/domain/game/model/entity/Item.java (1)
  • Getter (14-33)
src/main/java/org/ezcode/codetest/domain/game/Util/StatUpdateUtil.java (1)
src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java (1)
  • Getter (37-120)
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build
🔇 Additional comments (42)
src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatRoomHistoryLoadEvent.java (1)

3-10:

Details

✅ Verification successful

ChatRoomHistoryLoadEvent 명칭 변경 승인

RoomEnterEventChatRoomHistoryLoadEvent 변경이 적절해 보입니다. 아래 스크립트로 이전 클래스 참조가 남아 있지 않은지 확인해주세요.


🏁 Script executed:

#!/bin/bash
rg -n "RoomEnterEvent" -C2 src/main/java/org/ezcode/codetest/infrastructure/event

Length of output: 81


코드베이스 전체에서 RoomEnterEvent 참조가 남아있는지 추가 검증이 필요합니다. 아래 스크립트를 실행해주세요.


🏁 Script executed:

#!/bin/bash
rg -n "RoomEnterEvent" -C2 src

Length of output: 30


ChatRoomHistoryLoadEvent 명칭 변경 승인 및 레거시 참조 제거 확인 완료

src 디렉터리 전체에서 RoomEnterEvent 참조가 발견되지 않아 이전 클래스는 모두 제거되었습니다. 더 이상 남아있는 레거시 참조는 없습니다.

src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatMessageBroadcastEvent.java (1)

3-8:

Details

✅ Verification successful

ChatMessageBroadcastEvent 명칭 변경 승인

BroadCastChatEventChatMessageBroadcastEvent 변경이 적절합니다. 아래 스크립트로 이전 클래스 참조를 검증해주세요.


🏁 Script executed:

#!/bin/bash
rg -n "BroadCastChatEvent" -C2 src/main/java/org/ezcode/codetest/infrastructure/event

Length of output: 85


프로젝트 전체에서 이전 클래스 명칭 참조 여부를 다시 한번 확인해주세요.


🏁 Script executed:

#!/bin/bash
rg -n "BroadCastChatEvent" -C2 src

Length of output: 34


BroadCastChatEvent 참조 제거 확인 및 이름 변경 승인

프로젝트 전체(src)에서 BroadCastChatEvent 검색 결과 남은 참조가 없는 것을 확인했습니다. 변경 내용이 적절히 적용되었으므로 리뷰를 승인합니다.

src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatRoomEntryExitMessageEvent.java (1)

3-8:

Details

✅ Verification successful

ChatRoomEntryExitMessageEvent 명칭 변경 승인

RoomEnterAndLeftEventChatRoomEntryExitMessageEvent 변경이 적절해 보입니다. 아래 스크립트로 이전 클래스 참조가 남아 있지 않은지 확인하세요.


🏁 Script executed:

#!/bin/bash
rg -n "RoomEnterAndLeftEvent" -C2 src/main/java/org/ezcode/codetest/infrastructure/event

Length of output: 88


RoomEnterAndLeftEvent 참조 제거 확인 – ChatRoomEntryExitMessageEvent로 변경 승인

  • rg -n RoomEnterAndLeftEvent -C2 src/main/java/org/ezcode/codetest/infrastructure/event 실행 결과, 이전 클래스명에 대한 참조가 모두 제거된 것으로 확인됨
  • 파일명 및 레코드 정의(ChatRoomEntryExitMessageEvent)가 의도한 대로 적용되어 문제 없음
src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatRoomListLoadEvent.java (1)

3-10:

Details

✅ Verification successful

ChatRoomListLoadEvent 명칭 변경 승인

EnterEventChatRoomListLoadEvent 변경이 적절합니다. 아래 스크립트로 이전 클래스 참조가 모두 교체되었는지 검증해주세요.


🏁 Script executed:

#!/bin/bash
rg -n "EnterEvent" -C2 src/main/java/org/ezcode/codetest/infrastructure/event

Length of output: 77


코드베이스 전역에서 EnterEvent 참조 여부 재검증하기 위해 아래 스크립트를 실행해 주세요.


🏁 Script executed:

#!/bin/bash
# 전체 레포지토리에서 EnterEvent 키워드 검색
rg -n "EnterEvent" .

Length of output: 20


EnterEvent 명칭 변경 검증 완료

전체 레포지토리에서 EnterEvent 키워드를 검색한 결과 남아 있는 참조가 없습니다.
따라서 ChatRoomListLoadEvent로의 변경을 승인합니다.

src/main/java/org/ezcode/codetest/infrastructure/event/dto/ChatRoomParticipantCountChangeEvent.java (1)

3-7:

Details

✅ Verification successful

ChatRoomParticipantCountChangeEvent 명칭 변경 승인

RoomChangeEventChatRoomParticipantCountChangeEvent 변경이 적절합니다. 아래 스크립트로 이전 클래스 참조가 남아 있지 않은지 확인하세요.


🏁 Script executed:

#!/bin/bash
rg -n "RoomChangeEvent" -C2 src/main/java/org/ezcode/codetest/infrastructure/event

Length of output: 82


전체 프로젝트에서 RoomChangeEvent 참조가 남아있는지 확인하기 위해 아래 스크립트를 실행해주세요.


🏁 Script executed:

#!/bin/bash
rg -n "RoomChangeEvent" -C2 .

Length of output: 29


ChatRoomParticipantCountChangeEvent 명칭 변경 승인
전체 프로젝트에서 RoomChangeEvent를 검색한 결과 더 이상 참조가 없음을 확인했습니다. 변경사항을 머지하세요.

src/main/java/org/ezcode/codetest/application/chatting/dto/request/ChatRoomDeleteRequest.java (1)

3-3: Swagger 어노테이션 적용: ChatRoomDeleteRequest 레코드와 roomId 필드에 @Schema 설명이 일관되게 추가되어 API 문서화가 강화되었습니다.

Also applies to: 6-6, 9-11

src/main/java/org/ezcode/codetest/application/chatting/dto/request/ChatRoomSaveRequest.java (1)

6-6: Swagger 어노테이션 완비: ChatRoomSaveRequest 레코드 클래스와 title 필드에 @Schema 설명이 적절히 추가되어 API 스펙이 명확해졌습니다.

Also applies to: 10-10, 13-13

src/main/java/org/ezcode/codetest/application/chatting/dto/response/RoomChangedResponse.java (1)

6-6: Swagger 어노테이션 적용: RoomChangedResponse 레코드 및 모든 필드에 @Schema 주석이 일관되게 추가되어 문서화 일관성이 향상되었습니다.

Also applies to: 10-10, 13-13, 16-16, 19-19, 22-22

src/main/java/org/ezcode/codetest/application/chatting/dto/response/ChatResponse.java (1)

7-7: Swagger 어노테이션 적용: ChatResponse 레코드와 각 필드에 @Schema 설명이 일관되게 추가되어 API 문서화 품질이 개선되었습니다.

Also applies to: 9-9, 12-12, 15-15, 18-18, 21-21

src/main/java/org/ezcode/codetest/application/chatting/dto/request/ChatSaveRequest.java (1)

7-7: Swagger 어노테이션 적용: ChatSaveRequest 레코드와 message 필드에 @Schema 설명이 일관되게 추가되어 API 소비자가 이해하기 쉬워졌습니다.

Also applies to: 9-9, 12-12

src/main/java/org/ezcode/codetest/infrastructure/event/service/ChatEventPublisher.java (6)

4-8: 이벤트 DTO 클래스명 변경 반영 확인
새롭게 변경된 ChatRoomListLoadEvent, ChatRoomHistoryLoadEvent, ChatMessageBroadcastEvent, ChatRoomEntryExitMessageEvent, ChatRoomParticipantCountChangeEvent import가 일관되게 업데이트 되었습니다.


22-22: ChatRoomListLoadEvent 발행 로직 검증
제네릭 타입 T와 함께 ChatRoomListLoadEvent가 정상적으로 인스턴스화 및 발행되고 있습니다.


27-27: ChatRoomHistoryLoadEvent 발행 로직 검증
publishChatRoomHistoryLoadEvent 메서드에서 새로운 이벤트 타입 사용이 적절합니다.


32-32: ChatMessageBroadcastEvent 발행 로직 검증
ChatMessageBroadcastEvent로의 전환이 일관되게 이루어졌습니다.


37-37: ChatRoomEntryExitMessageEvent 발행 로직 검증
ChatRoomEntryExitMessageEvent 사용이 올바르며, 의도한 데이터 흐름에 맞습니다.


42-42: ChatRoomParticipantCountChangeEvent 발행 로직 검증
ChatRoomParticipantCountChangeEvent 이벤트 발행이 정확히 반영되어 있습니다.

src/main/java/org/ezcode/codetest/presentation/chattingmanagement/chatting/controller/ChatRoomController.java (3)

18-20: Swagger/OpenAPI 어노테이션 import 추가
@Operation@ApiResponse 어노테이션을 위한 import가 적절히 추가되었습니다.


29-35: 채팅방 생성 API 문서화 어노테이션
createChatRoom 메서드에 요약(summary), 설명(description), 응답 코드 정보가 명확히 지정되어 있습니다.


47-53: 채팅방 삭제 API 문서화 어노테이션
removeChatRoom 메서드에 대한 OpenAPI 어노테이션이 일관성 있게 적용되었습니다.

src/main/java/org/ezcode/codetest/presentation/chattingmanagement/event/EventHandleController.java (2)

20-23: 메서드명 변경으로 가독성 향상
handleEnterhandleGetChatRoomList로 변경되어 역할이 더 명확해졌습니다.


29-33: 메서드명 변경으로 가독성 향상
handleChatRoomEnterhandleGetChattingHistory로 수정되어 기능 의도가 분명해졌습니다.

src/main/java/org/ezcode/codetest/infrastructure/event/listener/ChatEventListener.java (6)

3-7: 이벤트 DTO import 업데이트
리스너 쪽에서도 새 DTO인 ChatRoomListLoadEvent 등으로 import가 일관되게 변경되었습니다.


24-24: 리스너 메서드 시그니처 업데이트
EnterEventChatRoomListLoadEvent<?>로 변경되어 명명 일관성이 개선되었습니다.


34-34: 리스너 메서드 시그니처 업데이트
RoomEnterEventChatRoomHistoryLoadEvent<?>로 변경되어 이벤트 처리 로직이 명확해졌습니다.


47-47: 리스너 메서드 시그니처 업데이트
BroadCastChatEventChatMessageBroadcastEvent<?>로 변경되어 코드 가독성이 향상되었습니다.


57-57: 리스너 메서드 시그니처 업데이트
RoomEnterAndLeftEventChatRoomEntryExitMessageEvent<?>로 일관된 네이밍이 적용되었습니다.


67-67: 리스너 메서드 시그니처 업데이트
RoomChangeEventChatRoomParticipantCountChangeEvent<?>로 변경되어 이벤트 의미가 명확해졌습니다.

src/main/java/org/ezcode/codetest/domain/game/model/enums/ItemCategory.java (1)

3-5: 아이템 분류용 enum 정의 적절함
WEAPON, ARMOR, ACCESSORY 카테고리가 명확히 정의되어 있어 분류 로직에 잘 활용될 수 있습니다. 코드가 의도에 부합하므로 승인합니다.

src/main/java/org/ezcode/codetest/domain/game/model/enums/Stat.java (1)

5-19: Enum 정의 및 Lombok 활용 적절
각 스탯에 한글 설명이 포함되어 있으며 Lombok @Getter로 캡슐화도 잘 처리되었습니다. 의도대로 사용될 것으로 보입니다.

src/main/java/org/ezcode/codetest/infrastructure/cache/config/RedisCacheConfig.java (1)

16-17: 클래스명 리팩토링 확인 필요
CacheRedisConfig에서 RedisCacheConfig로 변경된 클래스명이 애플리케이션 컨텍스트 및 의존성 주입 지점에서 올바르게 참조되고 있는지 검증해 주세요.

src/main/java/org/ezcode/codetest/domain/game/model/enums/AccessoryType.java (1)

5-5: 'PENDENT' 상수명 스펠링 확인 필요
일반적으로 악세서리 종류를 나타내는 용어로 'Pendant'가 사용됩니다. 도메인 의도에 맞는 스펠링인지 검토 부탁드립니다.

src/main/java/org/ezcode/codetest/domain/game/repository/InventoryRepository.java (1)

7-12: 도메인 리포지터리 네이밍/어노테이션 확인

현재 인터페이스는 순수 도메인 계층이므로 @Repository 어노테이션을 생략한 점은 합리적입니다. 구현체가 인프라 계층에 존재한다면 이 상태로 충분합니다.

src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/GameCharacterJpaRepository.java (1)

11-12: skillId 필드명 확인 필요

@EntityGraph(attributePaths = {"stats", "skillId"}) 에서 skillId 가 실제 연관 관계 필드가 맞는지 검증해 주세요.
다대일 컬렉션이라면 skills 같이 복수형일 가능성이 높습니다. 필드명이 잘못되면 런타임에 IllegalArgumentException 을 유발합니다.

src/main/java/org/ezcode/codetest/application/game/dto/response/AccessoryResponse.java (1)

6-17: 레코드 정의 이상 없음

DTO 역할에 필요한 필드가 잘 정의되어 있으며, 불변성 확보 측면에서도 자바 record 선택이 적절합니다. 별다른 문제 없어 보입니다.

src/main/java/org/ezcode/codetest/domain/game/repository/ItemRepository.java (1)

21-24: findByIdIn 반환 타입 불일치

findByIdIn(List<String> ids) 는 다건 조회인데 반환 타입이 List<Item>이 아닌 Optional<List<Item>> 혹은 List<Item> 중 하나로 명확히 하는 편이 좋습니다. 현재는 List<Item>으로 충분해 보이며, Optional 랩핑은 과도할 수 있습니다.

src/main/java/org/ezcode/codetest/application/game/dto/request/WeaponSaveRequest.java (1)

13-34: 게터(getter) 부재로 직렬화/검증 호환성 확인 필요

클라이언트-단 직렬화나 검증 메시지 생성 시 프레임워크가 필드 접근을 기본 허용하도록 설정돼 있지 않다면, 현재 클래스에 Lombok @Getter 또는 명시적 게터 메서드가 필요합니다. 설정을 한 번 더 확인해 주세요.

src/main/java/org/ezcode/codetest/application/game/dto/request/ItemSaveRequest.java (1)

24-38: 문자열 기반 등급/이름 관리의 한계

grade, nameString으로 두면 오타·대소문자 편차로 동일 아이템이 다수 생성될 위험이 있습니다.
등급은 enum, 이름은 중복 검사용 서비스 로직(또는 DB Unique Index)을 추가해 주시는 편이 안전합니다.

src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/GameCharacterRepositoryImpl.java (1)

11-15: JPA 리포지토리 인터페이스 위치 확인 필요

GameCharacterJpaRepository가 같은 패키지에 없다면 import 누락으로 컴파일 오류가 발생합니다.
패키지 구조를 한 번 더 확인해 주세요.

src/main/java/org/ezcode/codetest/application/game/dto/request/DefenceSaveRequest.java (1)

14-16: 다형성 직렬화 설정 확인 요청
@JsonTypeName("defence")만 달려 있고 상위 ItemSaveRequest@JsonTypeInfo가 없다면 역직렬화가 실패합니다. 상위 클래스에 use = JsonTypeInfo.Id.NAME 설정이 있는지 다시 확인 부탁드립니다.

src/main/java/org/ezcode/codetest/domain/game/model/entity/CharacterRealStat.java (1)

30-53: HP·AP 증분 로직 누락 확인 요청

increase()에서 HP(체력)·AP(행동력)는 어떤 스탯을 올려도 변화하지 않습니다.
의도라면 주석으로 명시하고, 의도하지 않은 누락이라면 적절한 case 에서 증가하도록 보완해 주세요.

src/main/java/org/ezcode/codetest/application/game/dto/response/CharacterStatusResponse.java (1)

15-18: 레코드에 @builder 조합 사용은 Lombok 버전에 의존적입니다
레코드 + @Builder 조합은 Lombok 1.18.22 이상에서만 정식 지원됩니다. 팀 빌드 환경의 Lombok 버전을 확인해 주세요.

src/main/java/org/ezcode/codetest/domain/game/service/ItemShoppingDomainService.java (1)

41-44: 중복 아이템 보상 금액이 사용 금액과 맞지 않습니다
현재 구조: 도박 시 50 Gold 차감 → 중복이면 25 Gold 환급 ⇒ 순손실 25 Gold. 의도한 밸런스인지 확인 바랍니다.

Also applies to: 66-69, 91-94

Comment on lines +11 to +18
public class RandomEncounter {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String encounterText;
}
Copy link

@coderabbitai coderabbitai bot Jun 13, 2025

Choose a reason for hiding this comment

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

⚠️ Potential issue

필수 생성자 혹은 빌더 누락
encounterText 필드를 초기화할 수 있는 생성자, 빌더, 또는 setter가 없습니다. JPA 엔티티 인스턴스 생성 시 해당 값을 설정할 수 있도록 @AllArgsConstructor, @Builder 또는 명시적 파라미터 생성자를 추가해주세요.

🤖 Prompt for AI Agents
In
src/main/java/org/ezcode/codetest/domain/game/model/entity/RandomEncounter.java
around lines 11 to 18, the class lacks a constructor, builder, or setter to
initialize the encounterText field. Add either an explicit constructor with
encounterText as a parameter, or use Lombok annotations like @AllArgsConstructor
and @Builder to enable setting this field during entity creation.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

아직 미구현

Copy link

Choose a reason for hiding this comment

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

@chat26666 알겠습니다. 해당 엔티티가 아직 미구현 단계임을 확인했습니다. 추후 구현 시 encounterText 값을 설정할 수 있는 생성자나 빌더 등을 추가하실 예정이면 다음 PR에서 반영 여부만 확인하겠습니다.

혹시 이번 PR 이후 별도 이슈로 관리하시길 원하시면 말씀 주세요. 필요하시면 follow-up 이슈 생성 도와드리겠습니다!

Comment on lines +3 to +4
public class Skill {
}
Copy link

@coderabbitai coderabbitai bot Jun 13, 2025

Choose a reason for hiding this comment

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

⚠️ Potential issue

빈 엔티티 클래스 상태 확인 필요
현재 Skill 엔티티가 필드나 메서드 없이 비어 있습니다. 향후 사용 계획이 없다면 제거하거나, 도메인 로직/DB 매핑 어노테이션 등을 추가해 기능을 명시해주세요.

🤖 Prompt for AI Agents
In src/main/java/org/ezcode/codetest/domain/game/model/entity/Skill.java at
lines 3 to 4, the Skill class is currently empty without any fields, methods, or
annotations. To fix this, either remove the Skill class if it is not planned for
future use, or add relevant domain logic, fields, and database mapping
annotations (e.g., @Entity, @Id) to clearly define its purpose and
functionality.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

아직 안만들었음

Copy link

Choose a reason for hiding this comment

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

@chat26666 알겠습니다. 앞으로 구현 예정인 Placeholder 클래스라는 뜻이군요.
혼동을 줄이기 위해 다음 두 가지 중 한 가지 방법을 권장드립니다.

  1. Skill 클래스 상단에 // TODO 향후 구현 예정 같은 주석을 남겨 의도를 명확히 하기
  2. 실제 구현 시점 전까지는 파일을 제거해 두었다가, 기능이 완성될 때 다시 추가하기

추후 작업 항목을 추적하기 위해 GitHub Issue를 만들어 두는 방법도 있습니다. 필요하시면 말씀해주세요!

Comment on lines 9 to 18
@Service
@RequiredArgsConstructor
public class GameAdminUseCase {

private final ItemManagementDomainService itemManagementService;

public void createItem(ItemSaveRequest request) {

itemManagementService.createItem(request.toItem());
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

트랜잭션 경계와 입력 검증 누락

  1. 아이템 생성은 DB write 연산입니다. 클래스 또는 createItem 메서드에 @Transactional(propagation = REQUIRED) 을 선언해 트랜잭션 경계를 명시해 주세요.
  2. ItemSaveRequest 값 검증이 없으므로 @Validated 또는 메서드 인자에 @Valid 를 적용해 Bean Validation 을 활성화하는 것이 안전합니다.
-import org.springframework.stereotype.Service;
+import org.springframework.stereotype.Service;
+import org.springframework.transaction.annotation.Transactional;
...
 @Service
 @RequiredArgsConstructor
 public class GameAdminUseCase {

     private final ItemManagementDomainService itemManagementService;

+    @Transactional
     public void createItem(@Valid ItemSaveRequest request) {
         itemManagementService.createItem(request.toItem());
     }
 }

Committable suggestion skipped: line range outside the PR's diff.

🤖 Prompt for AI Agents
In
src/main/java/org/ezcode/codetest/application/game/management/GameAdminUseCase.java
around lines 9 to 18, the createItem method lacks transaction boundary and input
validation. Add the @Transactional annotation to the class or the createItem
method to define the transaction boundary for the DB write operation. Also,
enable Bean Validation by adding @Validated to the class or @Valid to the
ItemSaveRequest parameter in createItem to ensure input validation.

Comment on lines +3 to +15
import java.util.List;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;

@Configuration
public class MongoConverterConfig {

@Bean
public MongoCustomConversions customConversions() {
return new MongoCustomConversions(List.of(new ItemTypeReadConverter()));
}
Copy link

@coderabbitai coderabbitai bot Jun 13, 2025

Choose a reason for hiding this comment

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

⚠️ Potential issue

ItemTypeReadConverter import 누락으로 빌드 실패

new ItemTypeReadConverter() 를 사용하지만 해당 클래스의 import 문이 없습니다. 컴파일 에러가 발생하므로 반드시 추가해야 합니다.

 import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
+import org.ezcode.codetest.infrastructure.mongodb.converter.ItemTypeReadConverter;
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
@Configuration
public class MongoConverterConfig {
@Bean
public MongoCustomConversions customConversions() {
return new MongoCustomConversions(List.of(new ItemTypeReadConverter()));
}
import java.util.List;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.mongodb.core.convert.MongoCustomConversions;
+import org.ezcode.codetest.infrastructure.mongodb.converter.ItemTypeReadConverter;
@Configuration
public class MongoConverterConfig {
@Bean
public MongoCustomConversions customConversions() {
return new MongoCustomConversions(List.of(new ItemTypeReadConverter()));
}
}
🤖 Prompt for AI Agents
In
src/main/java/org/ezcode/codetest/infrastructure/mongodb/config/MongoConverterConfig.java
around lines 3 to 15, the class ItemTypeReadConverter is used but not imported,
causing a build failure. Add the appropriate import statement for
ItemTypeReadConverter at the top of the file to resolve the compilation error.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

같은 패키지라 안해도 되는듯?

Copy link

Choose a reason for hiding this comment

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

@chat26666 네, ItemTypeReadConverterorg.ezcode.codetest.infrastructure.mongodb.config 패키지에 있기 때문에 동일 패키지 내 클래스는 import 하지 않아도 컴파일에 문제가 없습니다. 제가 경로를 착오했습니다. 별도 수정은 필요 없습니다. 알려주셔서 감사합니다!

Comment on lines 54 to 66
@Transactional
public ItemGamblingResponse gamblingForItem(Long userId, String itemCategory) {

GameCharacter character = characterService.getGameCharacter(userId);

Item newItem = switch (ItemCategory.valueOf(itemCategory.toUpperCase())) {
case WEAPON -> itemShoppingService.gamblingNewWeapon(character);
case ARMOR -> itemShoppingService.gamblingNewDefence(character);
case ACCESSORY -> itemShoppingService.gamblingNewAccessory(character);
};

return ItemGamblingResponse.from(gameMapper.toItemResponse(newItem));
}
Copy link

Choose a reason for hiding this comment

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

⚠️ Potential issue

Enum 파싱 실패 시 도메인 예외로 래핑 필요
ItemCategory.valueOf(itemCategory.toUpperCase()) 는 잘못된 문자열 입력 시 IllegalArgumentException 을 그대로 노출합니다. 사용-자 정의 GameException 으로 변환해 API 레이어까지 일관된 에러코드를 전달하는 편이 좋습니다.

🤖 Prompt for AI Agents
In src/main/java/org/ezcode/codetest/application/game/play/GamePlayUseCase.java
between lines 54 and 66, the code uses ItemCategory.valueOf with a string that
may cause IllegalArgumentException if the input is invalid. To fix this, wrap
the valueOf call in a try-catch block that catches IllegalArgumentException and
throws a custom GameException instead, ensuring consistent error handling and
propagation of domain-specific exceptions to the API layer.

Comment on lines 68 to 76
@Transactional
public List<ItemResponse> inventoryOpen(Long userId) {

GameCharacter character = characterService.getGameCharacter(userId);

List<Item> inventoryItems = characterService.InventoryOpen(character.getId());

return inventoryItems.stream().map(gameMapper::toItemResponse).toList();
}
Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

서비스/메서드 명명 불일치
characterService.InventoryOpen 처럼 대문자로 시작하는 메서드는 컨벤션을 벗어납니다. 도메인 서비스 쪽도 inventoryOpen 으로 정정해 주세요.

🤖 Prompt for AI Agents
In src/main/java/org/ezcode/codetest/application/game/play/GamePlayUseCase.java
around lines 68 to 76, the method call characterService.InventoryOpen uses an
uppercase initial letter which violates naming conventions. Rename the method in
the domain service from InventoryOpen to inventoryOpen and update this call
accordingly to use the lowercase initial letter.

Comment on lines +104 to +119
public String equipItem(ItemType item , String newItem) {

String oldItemId = null;

if (item instanceof WeaponType) {
oldItemId = weaponId;
weaponId = newItem;
} else if (item instanceof DefenceType) {
oldItemId = defenceId;
defenceId = newItem;
} else if (item instanceof AccessoryType) {
oldItemId = accessoryId;
accessoryId = newItem;
}
return oldItemId;
}
Copy link

@coderabbitai coderabbitai bot Jun 13, 2025

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

instanceof 분기 대신 다형성/스위치 활용
equipItem 에서 instanceof 로 열거형을 구분하면 새로운 ItemType 추가 시 수정 지점이 늘어납니다. switch(item) 문이나 ItemTypeequip(GameCharacter, String newItemId) 추상 메서드를 두는 방법이 더 객체지향적입니다.

🤖 Prompt for AI Agents
In src/main/java/org/ezcode/codetest/domain/game/model/entity/GameCharacter.java
around lines 104 to 119, the equipItem method uses instanceof checks to
distinguish ItemType subclasses, which reduces extensibility. Refactor by either
replacing the instanceof branches with a switch statement on the item enum or,
preferably, add an abstract equip(GameCharacter, String newItemId) method to the
ItemType enum and implement it in each subclass. Then delegate the equip logic
to the item instance, removing the need for explicit type checks and improving
maintainability.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

음 생각해봄

Copy link

Choose a reason for hiding this comment

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

@chat26666 네, 천천히 검토해보시고 도움이 필요하시다면 언제든지 말씀해주세요!

Comment on lines +69 to +89
public void equipNewItem(GameCharacter character, String itemName) {

Inventory inventory = inventoryRepository.findByGameCharacterId(character.getId())
.orElseThrow(() -> new GameException(GameExceptionCode.INVENTORY_NOT_FOUND));

Item item = itemRepository.findByName(itemName)
.orElseThrow(() -> new GameException(GameExceptionCode.ITEM_NOT_FOUND));

ItemType type = item.getItemType();

String foundItemId = inventory.findItem(type, item.getId());

String checkFoundId = Optional.ofNullable(foundItemId)
.orElseThrow(() -> new GameException(GameExceptionCode.ITEM_NOT_FOUND));

String oldItem = character.equipItem(type, checkFoundId);

inventory.removeItem(type, checkFoundId);

inventory.addItem(type, oldItem);
}
Copy link

@coderabbitai coderabbitai bot Jun 13, 2025

Choose a reason for hiding this comment

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

⚠️ Potential issue

NOTHING 아이템을 인벤토리에 추가할 위험
장착 해제된 oldItemWeaponType.NOTHING.name() 과 같은 placeholder 일 경우에도 인벤토리에 추가됩니다. "NOTHING" 은 실재 아이템이 아니므로 추가 전 필터링이 필요합니다.

🤖 Prompt for AI Agents
In
src/main/java/org/ezcode/codetest/domain/game/service/CharacterStatusDomainService.java
between lines 69 and 89, the method equipNewItem adds the oldItem back to the
inventory without checking if it is a placeholder like "NOTHING". To fix this,
add a condition to check if oldItem equals WeaponType.NOTHING.name() before
calling inventory.addItem, and only add it if it is not the placeholder,
preventing invalid items from being added to the inventory.

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

어차피 영향없음

Copy link

Choose a reason for hiding this comment

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

@chat26666 알겠습니다. 영향이 없다고 판단하신다면 해당 부분은 그대로 두겠습니다. 다른 도움이 필요하시면 언제든 말씀해주세요!

Copy link
Collaborator Author

Choose a reason for hiding this comment

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

명시적으로 보여줄 용도임

Copy link

Choose a reason for hiding this comment

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

@chat26666 이해했습니다. NOTHING 아이템을 인벤토리에 남겨 두는 것이 “장비 해제 상태”를 명시적으로 보여주기 위한 설계임을 확인했습니다. 추후 리뷰에서 동일한 부분을 문제로 인식하지 않도록 기억해두겠습니다. 다른 사항이 필요하시면 말씀주세요!


✏️ Learnings added
Learnt from: chat26666
PR: ezcode-my/backend#58
File: src/main/java/org/ezcode/codetest/domain/game/service/CharacterStatusDomainService.java:69-89
Timestamp: 2025-06-13T17:48:54.688Z
Learning: Game 도메인에서 WeaponType.NOTHING / DefenceType.NOTHING / AccessoryType.NOTHING 등 “NOTHING” 아이템은 장비 해제 상태를 사용자에게 명시적으로 보여주기 위해 의도적으로 인벤토리에 저장된다. 따라서 인벤토리에 “NOTHING”이 포함되는 것은 정상 동작이다.

Note: Learnings are effective only in the context of similar code segments. To apply general coding guidelines, please configure review instructions. You can manage existing learnings in the app.

@chat26666 chat26666 changed the title Feature/game feat : 게임 캐릭터 생성 기능, 아이템 생성 기능, 아이템 뽑기, 스테이터스 확인, 아이템 장착 기능 추가 Jun 13, 2025
@chat26666 chat26666 self-assigned this Jun 13, 2025
@chat26666 chat26666 added the enhancement New feature or request label Jun 13, 2025
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

♻️ Duplicate comments (1)
src/main/java/org/ezcode/codetest/application/game/dto/request/ItemGamblingRequest.java (1)

8-14: 🛠️ Refactor suggestion

StringItemCategory 타입 전환 재검토 필요 (이전 리뷰와 동일)
여전히 itemCategoryString으로 받기 때문에, 서비스·도메인에서 enum 변환 실패 시 런타임 오류가 발생할 여지가 있습니다. @Pattern으로 유효성 검사를 중복 수행할 필요도 사라지므로, 다음과 같이 enum 을 직접 사용하고 @NotNull만 두는 편이 간결하고 타입 안전합니다.

-	@NotBlank(message = "아이템 타입을 결정해주세요(weapon, defence, accessory)")
-	@Pattern(
-		regexp = "weapon|defence|accessory",
-		flags = Pattern.Flag.CASE_INSENSITIVE,
-		message = "아이템 타입은 weapon, defence, accessory 중 하나여야 합니다."
-	)
-	String itemCategory
+	@NotNull(message = "아이템 타입을 결정해주세요(weapon, defence, accessory)")
+	ItemCategory itemCategory

기존 리뷰에서 동일 제안을 드린 바 있으므로 참고 바랍니다.

🧹 Nitpick comments (1)
src/main/java/org/ezcode/codetest/domain/game/model/enums/ItemCategory.java (1)

3-5: 역직렬화·검증 시 대소문자/오탈자 대응 메커니즘 추가 권장
현재 enum 이 그대로 사용될 경우, 클라이언트에서 weapon, WEAPON, Weapon 등으로 전달하면 valueOfIllegalArgumentException을 던집니다. 컨트롤러 단에서 문자열을 enum 으로 바인딩하거나, DTO 필드를 enum 타입으로 변경할 계획이라면 case-insensitive 매핑을 지원하는 팩토리 메서드를 마련해 두는 편이 안전합니다.

+import com.fasterxml.jackson.annotation.JsonCreator;
+import java.util.Arrays;
+
 public enum ItemCategory {
 	WEAPON, DEFENCE, ACCESSORY
+
+	@JsonCreator
+	public static ItemCategory from(String value) {
+		return Arrays.stream(values())
+		             .filter(v -> v.name().equalsIgnoreCase(value))
+		             .findFirst()
+		             .orElseThrow(() ->
+			             new IllegalArgumentException("Unsupported item category: " + value));
+	}
 }

이렇게 해두면 Jackson 역직렬화, 수동 파싱, 테스트 코드 어디서든 동일한 변환 로직을 재사용할 수 있습니다.

📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between e2671f5 and cd3a906.

📒 Files selected for processing (16)
  • src/main/java/org/ezcode/codetest/application/game/dto/request/ItemGamblingRequest.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/dto/response/CharacterStatusResponse.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/management/GameAdminUseCase.java (1 hunks)
  • src/main/java/org/ezcode/codetest/application/game/play/GamePlayUseCase.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Defence.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/EncounterChoice.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Inventory.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/model/enums/ItemCategory.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/service/CharacterStatusDomainService.java (1 hunks)
  • src/main/java/org/ezcode/codetest/domain/game/service/ItemShoppingDomainService.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/chat/ChatRepositoryImpl.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/chat/ChatRoomRepositoryImpl.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/GameCharacterRepositoryImpl.java (1 hunks)
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/InventoryRepositoryImpl.java (1 hunks)
  • src/main/java/org/ezcode/codetest/presentation/game/management/ItemManagementController.java (1 hunks)
  • src/main/java/org/ezcode/codetest/presentation/game/play/GamePlayController.java (1 hunks)
✅ Files skipped from review due to trivial changes (2)
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/chat/ChatRepositoryImpl.java
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/chat/ChatRoomRepositoryImpl.java
🚧 Files skipped from review as they are similar to previous changes (12)
  • src/main/java/org/ezcode/codetest/presentation/game/management/ItemManagementController.java
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/GameCharacterRepositoryImpl.java
  • src/main/java/org/ezcode/codetest/infrastructure/persistence/repository/game/InventoryRepositoryImpl.java
  • src/main/java/org/ezcode/codetest/application/game/management/GameAdminUseCase.java
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Inventory.java
  • src/main/java/org/ezcode/codetest/domain/game/service/ItemShoppingDomainService.java
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/EncounterChoice.java
  • src/main/java/org/ezcode/codetest/application/game/dto/response/CharacterStatusResponse.java
  • src/main/java/org/ezcode/codetest/domain/game/model/entity/Defence.java
  • src/main/java/org/ezcode/codetest/presentation/game/play/GamePlayController.java
  • src/main/java/org/ezcode/codetest/domain/game/service/CharacterStatusDomainService.java
  • src/main/java/org/ezcode/codetest/application/game/play/GamePlayUseCase.java
⏰ Context from checks skipped due to timeout of 90000ms (1)
  • GitHub Check: build

@chat26666
Copy link
Collaborator Author

@pokerbearkr 이거 테스트 실패하는거 properties 누락 때문인가여? 제 실행환경에서는 잘 실행되는데

@pokerbearkr
Copy link
Contributor

pokerbearkr commented Jun 13, 2025

혹시 환경변수 추가된거 있나요?
직접 다 넣어줘야해서요
슬랙이나 디코 DM주시면 추가해두겠습니다

@chat26666 chat26666 merged commit ecbbd60 into dev Jun 14, 2025
1 of 2 checks passed
@chat26666 chat26666 deleted the feature/game branch June 14, 2025 02:33
thezz9 pushed a commit that referenced this pull request Jun 14, 2025
* feat : 게임 도메인 엔티티 생성 및 스킬, 아이템 효과 정의

* feat : 게임 도메인 서비스, 아이템 뽑기 도메인서비스 추가, 랜덤 인카운터 추가

* feat : 아이템 장착, 뽑기, 인벤토리 오픈, 스탯 확인, 캐릭터 생성 기능 추가

# Conflicts:
#	src/main/java/org/ezcode/codetest/common/security/config/SecurityConfig.java

* chore : properties 수정

* chore : properties 수정

* chore : securityconfig 오타수정

* chore : 오타수정

* chore : 오타수정

* chore : 무수히 많은 오타수정, 누락된 어노테이션 추가

* docs : 환경변수 추가

* docs : 오타수정

---------

Co-authored-by: pokerbearkr <[email protected]>
thezz9 added a commit that referenced this pull request Jun 14, 2025
* build : update build.gradle for Redis

* refactor : Judge0 비동기 병렬 요청 구현

* refactor : 비동기 병렬 요청 구현을 위한 Application, dto

* refactor : 비동기 병렬 요청 구현을 위한 config 파일

* feat : Redis Stream 구현

* refactor : 병렬 요청에서 SSE 구별을 위한 인메모리 저장

* refactor : 테스트용 UI

* refactor : 그룹핑 처리 DTO로 책임 분리

* refactor : Judge0 polling 예외처리 고도화

* refactor : api 경로 수정

* refactor : 서비스 로직 리팩토링

* refactor : 모델 객체 추가

* refactor : 예외 코드 추가

* Refactor : html(google oauth)로 리다이렉팅되는 문제 해결 (#57)

* refactor : logout HttpServeletRequest를 컨트롤러에서 String으로 추출 후 service로 전달

* refactor : whitelist 등록

* refactor : 에러 발생 시, html응답 대신 Json응답으로 받을 수 있도록 리팩토링

* refactor : requestMapping으로 앞에 일괄적으로 /api 달기

* feat : 게임 캐릭터 생성 기능, 아이템 생성 기능, 아이템 뽑기, 스테이터스 확인, 아이템 장착 기능 추가 (#58)

* feat : 게임 도메인 엔티티 생성 및 스킬, 아이템 효과 정의

* feat : 게임 도메인 서비스, 아이템 뽑기 도메인서비스 추가, 랜덤 인카운터 추가

* feat : 아이템 장착, 뽑기, 인벤토리 오픈, 스탯 확인, 캐릭터 생성 기능 추가

# Conflicts:
#	src/main/java/org/ezcode/codetest/common/security/config/SecurityConfig.java

* chore : properties 수정

* chore : properties 수정

* chore : securityconfig 오타수정

* chore : 오타수정

* chore : 오타수정

* chore : 무수히 많은 오타수정, 누락된 어노테이션 추가

* docs : 환경변수 추가

* docs : 오타수정

---------

Co-authored-by: pokerbearkr <[email protected]>

* Refactor : Filter WhiteList 수정 (#59)

* refactor : api 경로 추가, oauth 경로 수정

* refactor : whitelist 경로 수정

* refactor : redirect url 수정

* refactor : Submission Stream

---------

Co-authored-by: MIN <[email protected]>
Co-authored-by: chat26666 <[email protected]>
Co-authored-by: pokerbearkr <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants