Skip to content

Conversation

@Jjiggu
Copy link
Contributor

@Jjiggu Jjiggu commented Jun 29, 2025

작업 요약

store, menu 도메인 리팩토링 및 update, delete 추가

Issue Link

#2

문제점 및 어려움

해결 방안

Reference

Summary by CodeRabbit

  • New Features

    • Added endpoints to retrieve, update, delete, and toggle sold-out status for individual menus.
    • Introduced the ability to toggle a store's active status.
    • Added paginated retrieval of stores for infinite scroll functionality.
  • Enhancements

    • Menu and store data now include sold-out and deleted status fields where applicable.
    • Menu and store retrieval endpoints now filter out deleted items for cleaner results.
  • Removals

    • Removed the image type field from store image responses and related upload logic.
    • Removed the endpoint and support for retrieving all stores without pagination in the admin panel.
  • Bug Fixes

    • Improved update methods to prevent overwriting fields with null values.

@Jjiggu Jjiggu self-assigned this Jun 29, 2025
@Jjiggu Jjiggu added enhancement New feature or request refactor 리팩토링 labels Jun 29, 2025
@github-actions github-actions bot requested a review from HyemIin June 29, 2025 15:19
@coderabbitai
Copy link

coderabbitai bot commented Jun 29, 2025

Walkthrough

This update introduces soft delete and sold-out status management for menu items, removes the image type concept from store images, and adds or modifies endpoints for menu and store management. It also implements paginated store retrieval for users, refines update logic for store and menu entities, and adjusts related service, repository, and DTO structures accordingly.

Changes

File(s) / Group Change Summary
api-admin/menu/controller/MenuController.java, api-user/menu/controller/MenuController.java Added endpoints for menu CRUD, sold-out toggle, and specific menu retrieval; updated service method calls.
api-admin/menu/dto/MenuCreateRequest.java Ensured new menus are created as not sold out and not deleted.
api-admin/menu/dto/MenuCreateResponse.java, api-admin/menu/dto/MenuReadDto.java, api-user/menu/dto/MenuReadDto.java Added isSoldOut and deleted fields to menu DTOs and updated builders/factories.
api-admin/menu/dto/MenuUpdateRequest.java Introduced new DTO for menu updates.
api-admin/menu/service/MenuService.java, api-user/menu/service/MenuService.java Renamed and added methods for soft delete, sold-out toggle, and menu retrieval; updated queries to filter deleted menus.
domain-menu/entity/Menu.java Added isSoldOut and deleted fields, update and toggle methods, and soft delete logic.
domain-menu/repository/MenuRepository.java Updated queries to exclude deleted menus; added methods for specific menu retrieval.
api-admin/store/controller/StoreController.java Removed all-stores endpoint; added toggle-active endpoint.
api-admin/store/controller/StoreImageController.java, api-admin/store/service/StoreImageService.java, api-admin/store/dto/StoreImageUploadResponse.java, api-user/store/dto/StoreImageUploadResponse.java, domain-store/entity/StoreImage.java Removed type field from store images and related DTOs/methods.
api-admin/store/dto/StoreReadResponse.java Deleted DTO for store read responses.
api-admin/store/dto/StoreUpdateRequest.java Removed isActive from update request DTO.
api-admin/store/service/StoreService.java, api-admin/store/service/StoreServiceImpl.java Removed all-stores method; added toggleActive method.
api-user/store/controller/StoreController.java, api-user/store/service/StoreService.java, api-user/store/service/StoreServiceImpl.java, domain-store/repository/StoreRepository.java Added paginated store retrieval endpoint and service/repository support.
domain-store/entity/Store.java Updated info update logic to be conditional; replaced activate/deactivate with toggleActive.

Sequence Diagram(s)

sequenceDiagram
    participant Admin as Admin API Client
    participant MenuController
    participant MenuService
    participant MenuRepository
    participant Menu as Menu Entity

    Admin->>MenuController: PATCH /menus/{menuId} (MenuUpdateRequest)
    MenuController->>MenuService: updateMenu(menuId, request)
    MenuService->>MenuRepository: findByIdAndDeletedFalse(menuId)
    MenuRepository-->>MenuService: Menu
    MenuService->>Menu: updateInfo()
    MenuService->>MenuRepository: save(Menu)
    MenuService-->>MenuController: MenuReadDto
    MenuController-->>Admin: 200 OK (MenuReadDto)
Loading
sequenceDiagram
    participant User as User API Client
    participant StoreController
    participant StoreService
    participant StoreRepository

    User->>StoreController: GET /all-stores/infinite-scroll?page=...
    StoreController->>StoreService: getAllStoresByPage(pageable)
    StoreService->>StoreRepository: findAllByDeletedFalseOrderByStoreIdDesc(pageable)
    StoreRepository-->>StoreService: Slice<Store>
    StoreService-->>StoreController: StoreReadResponse
    StoreController-->>User: 200 OK (StoreReadResponse)
Loading

Possibly related issues

  • [백엔드] menu, store 리팩토링 #2: The changes in this PR directly address the refactoring and feature additions described in this issue, including menu/store CRUD, soft deletes, image type removal, and pagination.

Poem

A menu now can hide or show,
Sold out or back, just let us know!
Store images lost their typey tail,
And toggling stores is now on sale.
Paginated lists for users' delight,
Soft deletes keep data out of sight.
Code hops ahead—what a rabbit’s night! 🐇✨


📜 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 75b11d8 and de975c1.

📒 Files selected for processing (6)
  • api-admin/src/main/java/com/example/apiadmin/menu/controller/MenuController.java (3 hunks)
  • api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateRequest.java (1 hunks)
  • api-admin/src/main/java/com/example/apiadmin/menu/service/MenuService.java (3 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/controller/StoreController.java (1 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/service/StoreServiceImpl.java (1 hunks)
  • domain-menu/src/main/java/com/example/menu/repository/MenuRepository.java (2 hunks)
🚧 Files skipped from review as they are similar to previous changes (6)
  • api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateRequest.java
  • api-admin/src/main/java/com/example/apiadmin/store/controller/StoreController.java
  • api-admin/src/main/java/com/example/apiadmin/store/service/StoreServiceImpl.java
  • domain-menu/src/main/java/com/example/menu/repository/MenuRepository.java
  • api-admin/src/main/java/com/example/apiadmin/menu/service/MenuService.java
  • api-admin/src/main/java/com/example/apiadmin/menu/controller/MenuController.java
✨ Finishing Touches
  • 📝 Generate Docstrings

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

🔭 Outside diff range comments (1)
api-admin/src/main/java/com/example/apiadmin/store/controller/StoreImageController.java (1)

59-59: Fix parameter name mismatch in delete endpoint.

The method parameter is named imageId but the path variable is storeImageId. This will cause a 400 Bad Request error.

-public ResponseEntity<?> deleteStoreImage(@PathVariable Long imageId) {
+public ResponseEntity<?> deleteStoreImage(@PathVariable Long storeImageId) {

And update the service call:

-storeImageService.delete(imageId);
+storeImageService.delete(storeImageId);
🧹 Nitpick comments (7)
api-user/src/main/java/com/example/apiuser/store/controller/StoreController.java (1)

36-41: Consider improving naming for clarity.

The endpoint path /infinite-scroll and method name reuse could be misleading:

  1. The path suggests infinite scroll but implements standard pagination
  2. Having two getAllStores methods (overloaded) may reduce code readability

Consider renaming to be more explicit about the pagination mechanism.

-@GetMapping("/all-stores/infinite-scroll")
-public ResponseEntity<?> getAllStores(Pageable pageable) {
+@GetMapping("/all-stores/paginated")
+public ResponseEntity<?> getAllStoresPaginated(Pageable pageable) {
api-user/src/main/java/com/example/apiuser/store/service/StoreServiceImpl.java (1)

48-65: Well-implemented pagination method.

The implementation correctly uses Slice for infinite scroll pagination and maintains consistency with the existing getAllStores method. The transaction annotation and logic are appropriate.

Consider extracting the common store-to-DTO mapping logic to reduce duplication:

private StoreReadDto mapStoreToDto(Store store) {
    List<StoreImage> images = storeImageRepository.findByStore(store);
    List<StoreImageUploadResponse> imageDto = images.stream()
        .map(StoreImageUploadResponse::fromEntity)
        .toList();
    return StoreReadDto.fromEntity(store, imageDto);
}

Then use it in both methods:

List<StoreReadDto> storeRead = stores.stream()
    .map(this::mapStoreToDto)
    .toList();
api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java (1)

20-21: Fix formatting inconsistency.

There's an extra tab character before Boolean isSoldOut that creates inconsistent indentation.

-	private	Boolean isSoldOut;
+	private Boolean isSoldOut;
 	private Boolean deleted;
api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuReadDto.java (2)

20-21: Fix formatting inconsistency.

There's an extra tab character before Boolean isSoldOut that creates inconsistent indentation.

-	private	Boolean isSoldOut;
+	private Boolean isSoldOut;
 	private Boolean deleted;

14-36: Consider consolidating duplicate DTOs.

The MenuReadDto classes in admin and user APIs are identical. Consider creating a shared DTO in a common module to reduce code duplication and maintain consistency.

api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java (1)

43-54: Consider using more specific exception for entity not found.

The implementation correctly filters deleted menus and follows the same image loading pattern. However, consider using a more domain-specific exception instead of IllegalArgumentException for better error handling and API responses.

-		Menu menu = menuRepository.findByStoreIdAndIdAndDeletedFalse(storeId, menuId)
-			.orElseThrow(() -> new IllegalArgumentException("Menu not found with id: " + menuId));
+		Menu menu = menuRepository.findByStoreIdAndIdAndDeletedFalse(storeId, menuId)
+			.orElseThrow(() -> new EntityNotFoundException("Menu not found with id: " + menuId + " for store: " + storeId));
domain-menu/src/main/java/com/example/menu/entity/Menu.java (1)

32-33: New Boolean fields correctly added for soft deletion and sold-out status.

The isSoldOut and deleted Boolean fields are appropriately added to support the new functionality. Consider using primitive boolean instead of Boolean if these fields should never be null in the database.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between 1d9860e and 75b11d8.

📒 Files selected for processing (27)
  • api-admin/src/main/java/com/example/apiadmin/menu/controller/MenuController.java (3 hunks)
  • api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateRequest.java (1 hunks)
  • api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateResponse.java (2 hunks)
  • api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuReadDto.java (2 hunks)
  • api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuUpdateRequest.java (1 hunks)
  • api-admin/src/main/java/com/example/apiadmin/menu/service/MenuService.java (3 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/controller/StoreController.java (1 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/controller/StoreImageController.java (2 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/dto/StoreImageUploadResponse.java (0 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/dto/StoreReadResponse.java (0 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/dto/StoreUpdateRequest.java (0 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/service/StoreImageService.java (1 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/service/StoreService.java (1 hunks)
  • api-admin/src/main/java/com/example/apiadmin/store/service/StoreServiceImpl.java (1 hunks)
  • api-user/src/main/java/com/example/apiuser/menu/controller/MenuController.java (1 hunks)
  • api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java (2 hunks)
  • api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java (2 hunks)
  • api-user/src/main/java/com/example/apiuser/store/controller/StoreController.java (2 hunks)
  • api-user/src/main/java/com/example/apiuser/store/dto/StoreImageUploadResponse.java (0 hunks)
  • api-user/src/main/java/com/example/apiuser/store/dto/StoreReadResponse.java (1 hunks)
  • api-user/src/main/java/com/example/apiuser/store/service/StoreService.java (1 hunks)
  • api-user/src/main/java/com/example/apiuser/store/service/StoreServiceImpl.java (2 hunks)
  • domain-menu/src/main/java/com/example/menu/entity/Menu.java (1 hunks)
  • domain-menu/src/main/java/com/example/menu/repository/MenuRepository.java (2 hunks)
  • domain-store/src/main/java/com/example/domainstore/entity/Store.java (1 hunks)
  • domain-store/src/main/java/com/example/domainstore/entity/StoreImage.java (0 hunks)
  • domain-store/src/main/java/com/example/domainstore/repository/StoreRepository.java (2 hunks)
💤 Files with no reviewable changes (5)
  • domain-store/src/main/java/com/example/domainstore/entity/StoreImage.java
  • api-admin/src/main/java/com/example/apiadmin/store/dto/StoreUpdateRequest.java
  • api-admin/src/main/java/com/example/apiadmin/store/dto/StoreReadResponse.java
  • api-user/src/main/java/com/example/apiuser/store/dto/StoreImageUploadResponse.java
  • api-admin/src/main/java/com/example/apiadmin/store/dto/StoreImageUploadResponse.java
🔇 Additional comments (29)
api-user/src/main/java/com/example/apiuser/store/service/StoreService.java (1)

5-5: LGTM! Clean pagination support added.

The addition of paginated store retrieval follows Spring Data conventions properly and maintains backward compatibility with the existing getAllStores() method.

Also applies to: 14-14

api-admin/src/main/java/com/example/apiadmin/store/service/StoreService.java (1)

18-18: LGTM! Good design choice for state management.

The toggle pattern is an excellent approach for managing binary state changes, and the Boolean return type provides clear feedback about the operation result.

domain-store/src/main/java/com/example/domainstore/repository/StoreRepository.java (1)

6-7: Excellent pagination implementation following best practices.

The repository method demonstrates several good practices:

  • Uses Slice instead of Page for efficient infinite scroll (avoids counting total elements)
  • Proper soft delete filtering with DeletedFalse
  • Logical ordering with newest stores first (OrderByStoreIdDesc)
  • Follows Spring Data JPA naming conventions

Also applies to: 22-22

api-admin/src/main/java/com/example/apiadmin/store/controller/StoreImageController.java (1)

31-31: LGTM: Types parameter removal is consistent with refactoring goals.

The removal of the types parameter aligns with the system-wide removal of image type handling for store images, simplifying the API.

Also applies to: 48-48

api-admin/src/main/java/com/example/apiadmin/store/service/StoreServiceImpl.java (1)

88-88: Consider consistency with deleted store handling.

This method uses findById while other methods in this service use findByStoreIdAndDeletedFalse. Should deleted stores be allowed to toggle active status?

If deleted stores should not be toggleable, use:

-Store store = storeRepository.findById(storeId)
+Store store = storeRepository.findByStoreIdAndDeletedFalse(storeId)
api-admin/src/main/java/com/example/apiadmin/store/service/StoreImageService.java (1)

31-31: LGTM: Types parameter removal simplifies the API.

Hardcoding the type as "store" is appropriate for this service and aligns with the system-wide removal of the image type concept.

Also applies to: 33-33

domain-store/src/main/java/com/example/domainstore/entity/Store.java (2)

61-63: Excellent defensive programming approach!

The null checks prevent accidental overwrites with null values, which is a robust improvement over unconditional assignment. This ensures partial updates work correctly when only some fields need to be modified.


70-72: Clean consolidation of activation logic!

Replacing separate activate and deactivate methods with a single toggleActive method is a cleaner approach that reduces code duplication while providing the same functionality. The implementation correctly toggles the boolean state.

api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateRequest.java (1)

33-34: Fields are correctly initialized to false for new menu creation.

The hardcoded false values align with the expected behavior for new menus (not sold out, not deleted).

api-user/src/main/java/com/example/apiuser/menu/dto/MenuReadDto.java (1)

31-32: Fields are correctly mapped from the entity.

The new Boolean fields are properly populated from the Menu entity in the factory method.

api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuCreateResponse.java (1)

20-21: Implementation correctly follows the established pattern.

The new Boolean fields are properly added and mapped from the Menu entity, maintaining consistency with other response DTOs.

Also applies to: 32-33

api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuReadDto.java (1)

31-32: Fields are correctly mapped from the entity.

The new Boolean fields are properly populated from the Menu entity in the factory method.

api-admin/src/main/java/com/example/apiadmin/menu/dto/MenuUpdateRequest.java (1)

12-16: Well-designed DTO for partial updates.

The DTO correctly implements the pattern for PATCH operations with all fields optional, allowing for partial menu updates. The absence of validation annotations is appropriate since updates should be optional.

api-user/src/main/java/com/example/apiuser/menu/controller/MenuController.java (2)

28-31: Method call updated to support soft deletion filtering.

The service method call change from getMenusByStoreId to getAllMenusByStoreId correctly aligns with the soft deletion feature implementation, ensuring deleted menus are excluded from the response.


33-45: New endpoint implementation looks good.

The new endpoint correctly implements menu retrieval by ID with proper path variable structure. The dual path variables (storeId and menuId) provide good scoping and security by ensuring the menu belongs to the specified store.

domain-menu/src/main/java/com/example/menu/repository/MenuRepository.java (2)

4-4: Import addition supports new repository method.

The Optional import is correctly added to support the new findByStoreIdAndIdAndDeletedFalse method return type.


13-14: Repository methods properly implement soft deletion filtering.

The updated methods correctly implement soft deletion by:

  • Filtering out deleted records with AndDeletedFalse in method names
  • Using descriptive Spring Data JPA method naming conventions
  • Returning Optional<Menu> for single entity retrieval, which is a best practice

The dual filtering on storeId and id with deletion status provides proper scoping and data integrity.

api-user/src/main/java/com/example/apiuser/menu/service/MenuService.java (1)

27-28: Service method correctly updated for soft deletion.

The method rename to getAllMenusByStoreId and updated repository call to findAllByStoreIdAndDeletedFalse correctly implements soft deletion filtering, ensuring deleted menus are excluded from results.

domain-menu/src/main/java/com/example/menu/entity/Menu.java (3)

36-45: Constructor properly handles new fields with safe defaults.

The constructor correctly handles the new Boolean fields with null checks and sensible defaults (false). This prevents NPE issues and ensures consistent behavior when these fields are not explicitly set.


47-51: Update method provides good selective field modification.

The updateInfo method correctly implements selective updates with null checks, allowing partial updates without overwriting fields with null values. This is a good pattern for entity updates.


53-55: State management methods are well-encapsulated.

The markAsDeleted and toggleSoldOut methods provide clear, single-purpose operations for state management. The implementation is correct and follows good encapsulation principles.

api-admin/src/main/java/com/example/apiadmin/menu/controller/MenuController.java (4)

5-7: Import additions support new functionality.

The new imports for DeleteMapping, PatchMapping, and MenuUpdateRequest are correctly added to support the enhanced CRUD operations.

Also applies to: 16-16


49-52: Service method call updated consistently.

The service method call is correctly updated to getAllMenusByStoreId, maintaining consistency with the user API and soft deletion filtering.


54-66: New getMenuById endpoint implemented correctly.

The endpoint correctly implements menu retrieval by ID with proper path variable structure, consistent with the user API implementation.


69-81: Update endpoint correctly implements PATCH semantics.

The update endpoint properly uses PATCH method with validation and follows the established response pattern. The implementation supports partial updates as intended.

api-admin/src/main/java/com/example/apiadmin/menu/service/MenuService.java (4)

13-13: LGTM!

The import for MenuUpdateRequest is correctly added to support the new update functionality.


38-52: Method correctly updated to support soft delete.

The rename to getAllMenusByStoreId and the filtering of deleted menus using findAllByStoreIdAndDeletedFalse properly implements the soft delete feature.


54-65: Well-implemented single menu retrieval.

The method correctly filters out deleted menus and validates that the menu belongs to the specified store.


39-39: Repository methods verified
The required methods for filtering by deleted status are defined in domain-menu/src/main/java/com/example/menu/repository/MenuRepository.java:

  • List<Menu> findAllByStoreIdAndDeletedFalse(Long storeId);
  • Optional<Menu> findByStoreIdAndIdAndDeletedFalse(Long storeId, Long menuId);

No further changes needed.

@Jjiggu Jjiggu merged commit 0e50f25 into develop Jun 29, 2025
1 check passed
@Jjiggu Jjiggu deleted the feature#2/add-menu-update branch June 29, 2025 15:49
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

enhancement New feature or request refactor 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants