Skip to content

Conversation

@Jjiggu
Copy link
Contributor

@Jjiggu Jjiggu commented Jul 4, 2025

작업 요약

  • 멀티 모듈 구조 변경
  • 시큐리티 application 레이어로 변경

Issue Link

#44

문제점 및 어려움

  • Application 빈 주입 관련 어려움 존재

해결 방안

  • 파일 위치 변경

Reference

Summary by CodeRabbit

  • 신규 기능

    • 관리자 및 사용자 API 서비스에 Swagger(OpenAPI) 문서화와 JWT 인증 연동을 추가했습니다.
    • 관리자 API에서 주문 목록 조회, 주문 상태 변경 기능이 추가되었습니다.
    • 공통 역할(enum)에 SUPER_ADMIN이 추가되었습니다.
  • 버그 수정

    • 일부 경로 매핑(@RequestMapping)에서 슬래시 누락을 수정했습니다.
  • 리팩터링

    • 프로젝트 전체 패키지 구조와 모듈 네이밍이 nowait-* 규칙으로 통일되었습니다.
    • 도메인, 인프라, 공통, OAuth 등 여러 모듈의 의존성 및 빌드 구성이 개선되었습니다.
  • 기타

    • 불필요한 .gitignore, .gitattributes, Gradle 설정 파일이 정리되었습니다.

@Jjiggu Jjiggu self-assigned this Jul 4, 2025
@Jjiggu Jjiggu added the refactor 리팩토링 label Jul 4, 2025
@coderabbitai
Copy link

coderabbitai bot commented Jul 4, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

이 변경사항은 프로젝트의 모듈 구조와 네이밍 규칙을 대대적으로 개편하고, 관련 소스 코드, Gradle 빌드 스크립트, CI/CD 워크플로우, import 경로, 패키지 선언, 그리고 일부 신규 서비스 및 DTO 클래스를 추가하는 작업을 포함합니다. 기존 모듈들은 nowait- 접두사로 통합되고, 도메인 엔티티 및 예외 클래스의 패키지가 세분화되었으며, 빌드 및 배포 파이프라인도 새로운 구조에 맞게 수정되었습니다.

Changes

파일/경로 그룹 변경 요약
.github/workflows/deploy-admin.yml, .github/workflows/deploy-user.yml 워크플로우 트리거 경로, 모듈명, 빌드/패키징 대상 디렉토리 및 아티팩트명을 신규 nowait- 네이밍 규칙으로 변경
build.gradle, nowait-app-admin-api/build.gradle, nowait-app-user-api/build.gradle, nowait-common/build.gradle, nowait-domain/build.gradle, nowait-domain/domain-admin-rdb/build.gradle, nowait-domain/domain-core-rdb/build.gradle, nowait-domain/domain-user-rdb/build.gradle, nowait-infra/build.gradle 루트/서브프로젝트 빌드 설정, group 및 version 통일, Spring Boot 플러그인 적용 방식 변경, 의존성 및 jar/bootJar 활성화 방식 변경, Swagger/JWT 등 의존성 추가/이동, 모듈 간 의존성 경로 변경
application-admin/**, application-user/**, application-config/**, common/**, domain-base/**, domain-menu/**, domain-reservation/**, domain-store/**, domain-token/**, external-oauth/**, infra-aws/** 구 모듈의 빌드 스크립트, 엔트리포인트, 설정 파일, .gitignore, .gitattributes 등 삭제
nowait-app-admin-api/src/main/java/com/nowait/ApiAdminApplication.java, nowait-app-user-api/src/main/java/com/nowait/ApiUserApplication.java 신규 Spring Boot 엔트리포인트 클래스 추가 (@SpringBootApplication, @EnableJpaAuditing)
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/config/SwaggerConfig.java, nowait-app-user-api/src/main/java/com/nowait/applicationuser/config/SwaggerConfig.java OpenAPI/Swagger 설정 클래스 추가, JWT 인증 스키마 및 API 문서 메타데이터 정의
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/config/security/CorsConfig.java, nowait-app-user-api/src/main/java/com/nowait/applicationuser/config/security/CorsConfig.java CORS 설정 클래스 추가/패키지 이동, 허용 오리진 및 헤더 등 설정
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/dto/OrderResponseDto.java, OrderStatusUpdateRequestDto.java, OrderStatusUpdateResponseDto.java, order/service/OrderService.java 주문 관련 DTO 및 서비스 신규 추가: 주문 목록 조회, 상태 변경 처리, 엔티티→DTO 변환 메서드 포함
nowait-common/src/main/java/com/nowait/common/enums/Role.java SUPER_ADMIN enum 상수 추가
nowait-app-admin-api/**, nowait-app-user-api/** 내 다수의 dto/service/controller/exception import 경로 및 패키지 선언을 신규 도메인 패키지(domaincorerdb, domainuserrdb 등)로 일괄 변경, 일부 클래스 신규 패키지로 이동
nowait-domain/domain-core-rdb/**, nowait-domain/domain-user-rdb/** 도메인 엔티티, 예외, 리포지토리 등 패키지 선언 및 import 경로를 신규 네이밍으로 변경 및 통합

Sequence Diagram(s)

sequenceDiagram
    participant AdminAPI as nowait-app-admin-api
    participant OrderRepo as OrderRepository (domain-core-rdb)
    participant DTO as OrderResponseDto/OrderStatusUpdateResponseDto

    AdminAPI->>OrderRepo: findAllByStoreId(storeId)
    OrderRepo-->>AdminAPI: List<UserOrder>
    AdminAPI->>DTO: UserOrder 리스트를 DTO 리스트로 변환
    AdminAPI-->>Client: List<OrderResponseDto>

    AdminAPI->>OrderRepo: findById(orderId)
    OrderRepo-->>AdminAPI: UserOrder or Exception
    AdminAPI->>OrderRepo: userOrder.updateOrderStatus(newStatus)
    AdminAPI->>DTO: UserOrder → OrderStatusUpdateResponseDto
    AdminAPI-->>Client: OrderStatusUpdateResponseDto
Loading

Possibly related PRs


📜 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 ca8b140 and 2615a2b.

📒 Files selected for processing (26)
  • .github/workflows/deploy-admin.yml (2 hunks)
  • .github/workflows/deploy-user.yml (2 hunks)
  • build.gradle (1 hunks)
  • nowait-app-admin-api/build.gradle (2 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/dto/OrderResponseDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/dto/OrderStatusUpdateRequestDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/dto/OrderStatusUpdateResponseDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/service/OrderService.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/token/service/TokenService.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/serivce/UserService.java (1 hunks)
  • nowait-app-user-api/build.gradle (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/oauth2/OAuth2LoginSuccessHandler.java (2 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateResponseDto.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/token/controller/TokenController.java (1 hunks)
  • nowait-common/build.gradle (1 hunks)
  • nowait-domain/build.gradle (2 hunks)
  • nowait-domain/domain-admin-rdb/build.gradle (2 hunks)
  • nowait-domain/domain-core-rdb/build.gradle (1 hunks)
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/entity/OrderStatus.java (1 hunks)
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/entity/UserOrder.java (1 hunks)
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java (1 hunks)
  • nowait-domain/domain-user-rdb/build.gradle (2 hunks)
  • nowait-infra/build.gradle (2 hunks)
✨ 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.

# Conflicts:
#	application-config/build.gradle
#	nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateResponseDto.java
#	nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java
#	nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/entity/OrderStatus.java
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: 8

🔭 Outside diff range comments (20)
nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/jwt/JwtUtil.java (1)

18-23: 비밀키 생성 로직을 Keys.hmacShaKeyFor 로 교체 권장

SecretKeySpec 생성 시 알고리즘 문자열을 매번 동적으로 가져올 필요 없이, JJWT에서 제공하는 헬퍼 메서드를 사용하면 키 길이 검증과 타입 안정성이 보장됩니다.

-import javax.crypto.SecretKey;
-import javax.crypto.spec.SecretKeySpec;
+import io.jsonwebtoken.security.Keys;

-	this.secretKey = new SecretKeySpec(
-		secret.getBytes(StandardCharsets.UTF_8),
-		Jwts.SIG.HS256.key().build().getAlgorithm()
-	);
+	this.secretKey = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/dto/KaKaoResponse.java (1)

24-32: Null-Safe 캐스팅 및 NPE 방어 로직 추가 제안

attributes 맵에 kakao_account/properties 키가 없거나 서브맵에 email, nickname, profile_image 항목이 누락되면 NPE가 발생합니다. 간단히 Map 디폴트값을 사용해 방어 코드를 추가해 주세요.

-        Map<String, Object> kakaoAccount = (Map<String, Object>)attributes.get("kakao_account");
-        return kakaoAccount.get("email").toString();
+        Map<String, Object> kakaoAccount =
+            (Map<String, Object>) attributes.getOrDefault("kakao_account", Map.of());
+        Object email = kakaoAccount.get("email");
+        return email != null ? email.toString() : "";

동일 패턴이 getNickName, getProfileImage에도 반복되니 함께 반영해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/token/controller/TokenController.java (1)

44-53: 새 리프레시 토큰을 반환하지 않는 치명적 버그

newRefreshToken을 생성해 DB에 저장하지만, 응답에는 이전 refreshToken을 그대로 실어 보내고 있습니다.

-            AuthenticationResponse authenticationResponse = new AuthenticationResponse(newAccessToken, refreshToken);
+            AuthenticationResponse authenticationResponse =
+                new AuthenticationResponse(newAccessToken, newRefreshToken);

이 실수로 클라이언트는 이미 만료·폐기된 토큰을 계속 사용하게 되어 재로그인이 필요해집니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerSignupRequestDto.java (1)

34-45: socialType 필드 입력이 무시되고 있습니다

File: nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerSignupRequestDto.java (Lines 34–45)

  • DTO에서 socialType을 입력받고 있지만, toEntity()에서는 항상 SocialType.LOCAL만 사용되고 있습니다.

의도에 따라 아래 중 하나를 선택해 수정해 주세요:

• 관리자 가입을 로컬만 허용할 경우
– DTO에서 socialType 필드를 제거하거나, 입력값이 "LOCAL"이 아니면 예외를 던지는 검증 로직을 추가합니다.

• 추후 SNS 로그인을 지원할 계획일 경우
toEntity()에서 입력된 값을 반영하도록 변경합니다. 예:

-        .socialType(SocialType.LOCAL)
+        .socialType(SocialType.valueOf(socialType))

의도를 명확히 해 주세요.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/token/controller/TokenController.java (1)

48-55: 새로 발급한 리프레시 토큰을 반환하지 않는 버그

newRefreshToken을 생성·DB 업데이트까지 했으나 응답에는 여전히 refreshToken(기존 토큰)을 넣고 있습니다.
클라이언트가 이전 토큰을 계속 사용하게 되어 갱신 로직 전체가 무의미해집니다.

-            AuthenticationResponse authenticationResponse = new AuthenticationResponse(newAccessToken, refreshToken);
+            AuthenticationResponse authenticationResponse = new AuthenticationResponse(newAccessToken, newRefreshToken);

테스트 케이스도 함께 수정해 올바른 토큰이 내려오는지 검증해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/exception/RefreshTokenNotFoundException.java (1)

1-5: ResourceNotFoundException import 누락으로 컴파일 오류 발생

현재 파일 패키지와 ResourceNotFoundException의 패키지가 달라 기본 import 가 되지 않습니다. 다음 diff 와 같이 명시적 import 를 추가하거나, 공통 모듈로 클래스를 이동해 주세요.

 package com.nowait.applicationuser.security.exception;

 import com.nowait.common.exception.ErrorMessage;
+import com.nowait.applicationadmin.security.exception.ResourceNotFoundException;
nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/entity/Menu.java (1)

27-30: 필드명 Id 대문자 사용으로 인한 컨벤션 불일치

엔티티 PK 필드는 일반적으로 id(소문자)로 작성합니다. 대문자 Id 는 JPA 메타모델·직렬화·쿼리DSL 등에서 예상치 못한 혼란을 줄 수 있습니다.

-	private Long Id;
+	private Long id;

필드명 변경 시, 생성자·레포지토리·쿼리 전반에 영향이 있으므로 전역 검색 후 수정 바랍니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/service/MenuService.java (1)

33-43: N+1 쿼리 가능성 – 이미지 조회를 배치 처리로 개선 필요

menus 를 조회한 뒤 메뉴별로 menuImageRepository.findByMenu(menu) 를 반복 호출하면 메뉴 수만큼 추가 쿼리가 발생합니다. 매장에 메뉴가 많을 경우 성능 이슈가 큽니다.

가능한 개선안:

  1. @EntityGraphJOIN FETCH 로 메뉴와 이미지를 한 번에 조회
  2. menuImageRepository.findByMenuIn(menus) 로 이미지 일괄 로딩 후 Map 매핑

예시 diff:

-List<MenuImage> images = menuImageRepository.findByMenu(menu);
+List<MenuImage> images = imagesByMenuMap.get(menu.getId());

그리고 조회 전에:

List<MenuImage> allImages = menuImageRepository.findByMenuIn(menus);
Map<Long, List<MenuImage>> imagesByMenuMap = allImages.stream()
        .collect(Collectors.groupingBy(img -> img.getMenu().getId()));

이를 통해 쿼리 수를 2회로 고정할 수 있습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/jwt/JwtAuthorizationFilter.java (2)

42-44: 민감한 Access Token 전체를 로그로 출력하고 있습니다

header.substring(7) 로 실제 토큰 문자열을 그대로 로그에 남기면 토큰 탈취‧재사용 위험이 큽니다. 토큰 길이나 해시값 일부만 남기거나 아예 로그 제거가 안전합니다.

- log.info("header :: {}, header.substring(7) :: {}", header, header.substring(7));
+ log.debug("Authorization header detected. tokenLength={}", header != null ? header.length() - 7 : 0);

61-64: tokenCategory.equals("accessToken") → NPE 가능성

tokenCategorynull 일 경우 NPE 가 발생합니다. 상수 기준으로 비교하거나 Objects.equals 를 사용해 방어 코드를 추가하세요.

- if (!tokenCategory.equals("accessToken")) {
+ if (!"accessToken".equals(tokenCategory)) {
nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/service/CustomUserDetailService.java (1)

21-23: 예외 타입·메시지가 명세와 다릅니다

orElseThrow()NoSuchElementException 을 던져 UsernameNotFoundException 계약을 깨뜨립니다. 또한 사용자 식별에 도움이 되는 메시지도 없습니다.

- User user = userRepository.findByEmail(email).orElseThrow();
+ User user = userRepository.findByEmail(email)
+     .orElseThrow(() -> new UsernameNotFoundException("User not found: " + email));
nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java (1)

58-66: ID 비교에 != 연산자를 사용하면 NPE·비정상 비교 위험이 있습니다.

Long 래퍼 타입은 != 비교 시 오토언박싱이 일어나고, 둘 중 하나라도 null 이면 NullPointerException이 발생합니다. 또한 참조가 다르면 값이 같아도 false를 반환합니다. 안전하게 Objects.equals를 사용하세요.

-import java.util.Objects;
 ...
-        if (bookmark.getUser().getId() != customOAuth2User.getUserId()) {
+        if (!Objects.equals(bookmark.getUser().getId(), customOAuth2User.getUserId())) {
             throw new IllegalArgumentException("you can only delete your own bookmark");
         }
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/token/service/TokenService.java (1)

25-50: validateToken 트랜잭션은 읽기 전용으로 지정하세요.

조회만 수행하므로 @Transactional(readOnly = true)가 적절합니다. 쓰기 불가 힌트를 주어 성능을 향상하고 불필요한 flush 위험을 줄입니다.

-    @Transactional
+    @Transactional(readOnly = true)
     public Boolean validateToken(String token, Long userId){
nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java (1)

35-43: N+1 쿼리 발생 가능성 제거 권장

Store 마다 storeImageRepository.findByStore(store) 를 호출하면서 이미지 조회가 반복적으로 일어나고 있습니다. Store 개수가 많을 때 DB 라운드트립이 급증하여 성능 저하가 발생합니다.
@EntityGraph 또는 JOIN FETCH 로 한 번에 이미지까지 로딩하거나, 별도 batch 쿼리를 활용해 N+1 문제를 해소해주세요.

Also applies to: 55-63

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/service/CustomUserDetailService.java (1)

20-29: UsernameNotFoundException 미발생 버그

orElseThrow() 에 기본값을 쓰면 NoSuchElementException 이 발생해 Spring Security 가 예상하는 UsernameNotFoundException 처리가 되지 않습니다. 인증 필터에서 예외가 잡히지 않아 500 에러로 이어질 수 있습니다.

-User user = userRepository.findByEmail(email).orElseThrow();
+User user = userRepository.findByEmail(email)
+    .orElseThrow(() -> new UsernameNotFoundException("User not found: " + email));

loadUserById 도 동일하게 수정해주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/token/service/TokenService.java (1)

52-63: 토큰 갱신 로직의 동시성 위험
delete → save 두 단계를 한 트랜잭션에서 수행하더라도, DB 유니크 제약(예: user_id + refresh_token)이 있다면 동일 트랜잭션 안에서 잠깐의 공백이 생깁니다. UPDATE로 한 번에 갱신하거나, ON CONFLICT ... UPDATE 구문(JPA의 save with detached entity update)으로 원자적 변경을 고려해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/oauth2/OAuth2LoginSuccessHandler.java (2)

55-58: 개인정보가 포함된 로그 최소화
user, email 값을 그대로 info 레벨로 출력하면 PII 노출 위험이 있습니다.

- log.info("user, userId, email, role :: {} {} {} {}", user, userId, email, role);
+ log.debug("OAuth2 login success. userId={}, role={}", userId, role);

운영 로그에는 식별 불가능한 최소 정보만 남기는 것을 권장합니다.


62-65: 중복 리프레시 토큰 저장 여부 확인 필요
tokenRepository.save() 이전에 동일 userId의 토큰이 존재하는지 검사하지 않으면 DB UNIQUE 제약 위반 또는 다중 토큰이 허용될 수 있습니다. existsByUserId 체크 후 업데이트 방식으로 변경하거나, user_id 고유키 제약 + save 대신 saveOrUpdate 로직을 고려해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/oauth2/CustomOAuth2UserService.java (2)

33-35: 민감 정보 과다 로깅 주의

oAuth2User.getAttributes() 는 이메일·프로필 이미지 등 PII 를 포함합니다.
운영 환경에서는 DEBUG 로그라도 보안 사고로 이어질 수 있으니 제거하거나 log.isDebugEnabled() 조건부 + 마스킹을 적용해 주세요.
[security]


39-44: Provider 식별 대소문자 예외 허용

registrationId.equals("kakao") 는 대소문자에 민감합니다. 설정 파일에서 kakao, KAKAO 등으로 변경되어도 인증이 실패하므로 equalsIgnoreCase 로 완화하거나 enum-mapping 으로 안전하게 파싱하는 편이 좋습니다.

- if (registrationId.equals("kakao")) {
+ if ("kakao".equalsIgnoreCase(registrationId)) {
♻️ Duplicate comments (1)
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/config/SwaggerConfig.java (1)

12-29: Swagger 중복 구현

user-api 모듈과 동일 내용이 복제되어 있습니다. 공통 모듈로 추출하여 DRY 원칙을 지켜 주세요.

🧹 Nitpick comments (40)
nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/base/entity/BaseTimeEntity.java (1)

26-33: createdAt 필드에 불변성 명시 권장

@CreatedDate 필드가 업데이트되지 않도록 하기 위해 JPA 매핑에 updatable = false 옵션을 추가하면 의도가 명확해집니다.

-	@CreatedDate
+	@CreatedDate
+	@Column(updatable = false)
nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/jwt/JwtUtil.java (1)

47-74: Jwts.parser() 인스턴스 재사용으로 성능 개선 가능

매 호출마다 Jwts.parser().verifyWith(secretKey).build()를 생성하면 불필요한 객체 생성이 반복됩니다. 파서 인스턴스를 필드로 캐싱하면 GC 부하를 줄일 수 있습니다.

+	private final JwtParser jwtParser;
+
 	public JwtUtil(@Value("${jwt.secret}") String secret) {
-		this.secretKey = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
+		this.secretKey = Keys.hmacShaKeyFor(secret.getBytes(StandardCharsets.UTF_8));
+		this.jwtParser = Jwts.parser().verifyWith(secretKey).build();
 	}

-	return Jwts.parser().verifyWith(secretKey).build()
+	return jwtParser
 		.parseClaimsJws(token)
nowait-app-user-api/src/main/java/com/nowait/applicationuser/config/security/CorsConfig.java (1)

17-22: 허용 Origin 목록 외부화 권장

현재 허용 Origin이 코드에 하드코딩되어 있어 환경별(Dev/Prod) 차이에 대응하기 어렵습니다. application-*.yml 또는 환경 변수로 분리해 동적으로 주입하는 방안을 고려해 주세요.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/jwt/JwtUtil.java (1)

26-45: JWT Claim 상수화 및 만료 예외 처리 개선 제안

  • "tokenCategory", "userId", "role" 문자열이 여러 메서드에서 반복됩니다. 상수화하여 오타 리스크를 줄여주세요.
  • isExpiredExpiredJwtException 발생 시 그대로 예외가 전파됩니다. try/catch로 true 반환하도록 보완하는 편이 안전합니다.
+public static final String CLAIM_CATEGORY = "tokenCategory";
+public static final String CLAIM_USER_ID = "userId";
+public static final String CLAIM_ROLE = "role";
...
-            .claim("tokenCategory", tokenCategory)
-            .claim("userId", userId)
-            .claim("role", role)
+            .claim(CLAIM_CATEGORY, tokenCategory)
+            .claim(CLAIM_USER_ID, userId)
+            .claim(CLAIM_ROLE, role)
public boolean isExpired(String token) {
    try {
        return Jwts.parser()
                   .verifyWith(secretKey).build()
                   .parseSignedClaims(token)
                   .getPayload()
                   .getExpiration()
                   .before(new Date());
    } catch (ExpiredJwtException e) {
        return true;
    }
}
nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/exception/MenuImageEmptyException.java (1)

5-9: serialVersionUID 누락

RuntimeException 상속 커스텀 예외는 직렬화 환경(예: REST 예외 직렬화, 메시지 큐 등)에서 serialVersionUID 경고가 발생할 수 있습니다. 간단히 추가해 두는 것을 권장드립니다.

 public class MenuImageEmptyException extends RuntimeException {
+    private static final long serialVersionUID = 1L;
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreImageUploadResponse.java (1)

3-3: 도메인 모듈 경로 수정 확인

StoreImage import가 새 도메인 모듈로 정상 이동되었습니다. 추가로, DTO 필드 수가 적어 immutable 성격이 강하므로 Java 17+ 환경이라면 record 전환도 고려해볼 만합니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/dto/MenuReadDto.java (1)

5-5: 패키지 경로 업데이트 OK

Admin API 측 DTO 역시 올바른 패키지로 교체되었습니다. User-API와 중복 DTO 구조가 있으므로 공용 DTO 모듈로 분리하는 것까지 고려해 보시면 유지보수성이 높아집니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreReadDto.java (1)

6-6: 중복 DTO 제거 고려 권장
StoreReadDtouser-api 모듈에도 동일 구현으로 존재합니다. 두 모듈 간 DTO 코드 중복은 유지보수 비용을 높입니다.
공통 모듈(예: nowait-common-dto)로 추출하거나, Gradle API 의존성으로 공유하는 방식의 리팩터를 검토해 보세요.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/exception/UnauthorizedException.java (1)

5-21: serialVersionUID 누락으로 직렬화 경고 가능성

RuntimeException 을 상속하는 커스텀 예외이므로 Java 직렬화 환경에서 serialVersionUID 경고가 발생할 수 있습니다. 필수는 아니지만, 버전 불일치에 따른 문제를 예방하려면 아래처럼 명시해 두는 편이 안전합니다.

 public class UnauthorizedException extends RuntimeException {
+   private static final long serialVersionUID = 1L;
     private final ErrorMessage errorMessage;
nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/controller/ReservationController.java (1)

16-16: OAuth2 사용자 DTO 경로 변경 확인
CustomOAuth2Userdomainuserrdb 모듈로 이동했습니다. 사용자 API 모듈이 해당 모듈에 의존하도록 설정되었는지 확인해 주세요. 추가로, @AuthenticationPrincipal 로 주입되는 객체가 null 이 될 수 있으므로 예약 생성 전에 NPE 방지 체크나 GlobalExceptionHandler 처리가 있는지도 점검하면 좋겠습니다.

nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/entity/Menu.java (1)

50-59: nullable Boolean 기본값 처리 로직 중복

isSoldOut, deleted 를 null-safe 하게 초기화하려고 != null ? … : false 패턴을 사용하셨는데, 두 필드 모두 DB 컬럼 nullable = false 이므로 애초에 객체 생성 시 null 이 입력되지 않도록 빌더/서비스 계층에서 보장하거나, 필드 선언부에 기본값을 주면 생성자 코드가 간결해집니다.

@Column(nullable = false)
@Builder.Default
private Boolean isSoldOut = false;

이렇게 하면 생성자 및 빌더 경로 모두 기본값이 자동 세팅되어 null 체크 로직을 제거할 수 있습니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuService.java (1)

14-20: Menu 서비스에서 Order 도메인 예외 재사용은 결합도 증가
OrderParameterEmptyException을 메뉴 서비스에서 사용하면 도메인 간 의존성이 생깁니다. 파라미터 누락은 공통·유틸 예외로 분리하거나 menu 전용 예외를 정의해 사용하는 편이 구조적으로 깔끔합니다.

-import com.nowait.domaincorerdb.order.exception.OrderParameterEmptyException;
+import com.nowait.nowaitcommon.exception.ParameterEmptyException; // 예시

...
-    throw new OrderParameterEmptyException();
+    throw new ParameterEmptyException();
nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/jwt/JwtAuthorizationFilter.java (1)

74-77: 하드코딩된 사용자 정보가 실제 인증 흐름을 왜곡합니다

sampleEmail, sampleNickname 등 임의 값으로 User 를 생성하면 이후 로직에서 실제 사용자 메타데이터가 필요한 경우 오류가 발생할 수 있습니다.
토큰에서 email 등을 추출하거나 DB 조회로 실제 User 엔티티를 가져오도록 개선이 필요합니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java (2)

118-125: DigestUtils.md5DigestAsHex(raw.getBytes()) 플랫폼 종속 문자셋 위험

운영 환경이 UTF-8 이 아닐 경우 동일 주문이라도 해시값이 달라질 수 있습니다.

-return DigestUtils.md5DigestAsHex(raw.getBytes());
+return DigestUtils.md5DigestAsHex(raw.getBytes(StandardCharsets.UTF_8));

127-134: 시그니처 중복 검사 Race Condition

existsBySignatureAndCreatedAtAfter 확인 후 저장 사이에 동일 요청이 들어오면 중복 주문이 발생할 수 있습니다.
DB UNIQUE 인덱스(signature) 및 예외 캐치로 이중 방어를 권장합니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java (2)

24-27: 생성자 주입 필드 순서를 통일하면 가독성이 높아집니다.

현재 bookmarkRepository → storeRepository → userRepository 순으로 선언되어 있으나, 메서드 사용 빈도는 storeRepository → userRepository → bookmarkRepository 입니다. 자주 쓰이는 의존성을 상단에 두면 읽기 편합니다.


69-77: parameterValidation의 매개변수명이 문맥과 어긋납니다.

deleteBookmark에서 bookmarkId를 넘기지만 메서드는 storeId라는 이름을 그대로 사용해 가독성이 떨어집니다. 범용성을 위해 id 혹은 별도 메서드 분리가 필요합니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/config/security/SecurityConfig.java (1)

62-64: 필터 인스턴스 직접 생성은 테스트·DI 유연성을 저하시킵니다.

new JwtAuthorizationFilter(jwtUtil, customUserDetailService)를 직접 생성하지 말고, 빈으로 등록한 뒤 .addFilterBefore(jwtAuthorizationFilter, ...) 형태로 주입하면 모킹·테스트가 쉬워집니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/token/service/TokenService.java (1)

31-40: 디버그용 한글 로그는 릴리스 전에 제거하거나 수준을 낮추세요.

"여기에 걸렸니 ? -- n" 형태의 로그는 의미가 불분명하고 프로덕션 로그 오염 가능성이 있습니다. trace 레벨로 내리거나 메시지를 구체화하세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/config/security/SecurityConfig.java (1)

74-76: JwtAuthorizationFilter를 빈 주입으로 교체하면 재사용성이 향상됩니다.

관리자 API와 동일하게, 필터를 직접 새로 생성하기보다 스프링 빈으로 정의해 주입받으면 테스트와 구성 일관성이 높아집니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java (1)

47-48: hasNext 고정값 하드코딩

getAllStores() 는 페이지네이션을 사용하지 않으므로 hasNext=false 를 하드코딩한 것으로 보입니다.
향후 전체 조회 방식이 변경될 경우 누락 위험이 있으니, DTO 생성 시 의미 없는 필드는 제거하거나 Optional<Boolean> 으로 변경하여 의도를 명확히 해 두는 편이 좋습니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuImageService.java (1)

37-44: join() 블로킹 호출로 비동기 이점 상실

s3Service.upload(...).join() 으로 즉시 블로킹하면서 CompletableFuture 의 장점이 사라집니다.
업로드가 완료될 때까지 트랜잭션이 열려 있어 DB 락이 길어질 수 있으니,

  1. 비동기 처리를 유지하고 업로드 완료 후 별도 이벤트/리스너에서 MenuImage 저장,
  2. 또는 upload 를 동기 메서드로 단순화
    중 하나로 선택하여 일관성을 확보해주세요.
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/serivce/UserService.java (1)

44-54: 중복 검증 예외 정보 강화

validateEmailDuplicated, validateNickNameDuplicated 메서드가 단순 IllegalArgumentException() 을 던져 API 소비자가 원인을 파악하기 어렵습니다.
의미 있는 메시지 또는 커스텀 예외(EmailDuplicatedException, NicknameDuplicatedException) 로 교체해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/service/ReservationService.java (1)

33-36: 도메인 전용 예외 사용 권장

storeRepository.findById 실패 시 IllegalArgumentException 문자열을 직접 생성하고 있습니다. 관리 편의성을 위해 StoreNotFoundException 과 같은 도메인 예외를 정의·재사용하면 일관성 있는 오류 응답을 제공할 수 있습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/token/service/TokenService.java (1)

30-39: 디버깅용 로그 메시지 제거 권장
"여기에 걸렸니 ? -- n" 형태의 로그는 개발 단계용 메시지로 보입니다. 운영 환경에서는 불필요한 로그 noise 및 정보 유출 가능성이 있으니 debug 레벨로 낮추거나 제거를 권장합니다.

nowait-app-user-api/src/main/java/com/nowait/ApiUserApplication.java (1)

7-9: 컴포넌트 스캔 범위 최소화 제안
루트 패키지(com.nowait)에 위치한 @SpringBootApplication은 다중 모듈(classpath 공유) 시 불필요하게 admin-api 등 다른 모듈까지 스캔할 수 있습니다.

-@SpringBootApplication
+@SpringBootApplication(scanBasePackages = "com.nowait.applicationuser")

같이 스캔 범위를 명시적으로 좁혀 모듈 간 의존성 누수를 방지하는 것을 권장합니다.

nowait-app-admin-api/src/main/java/com/nowait/ApiAdminApplication.java (1)

6-10: SpringApplication 정규 import로 간결화

-import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
...
-        org.springframework.boot.SpringApplication.run(ApiAdminApplication.class, args);
+        SpringApplication.run(ApiAdminApplication.class, args);

불필요한 FQN 사용을 줄여 가독성을 높일 수 있습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/oauth2/OAuth2LoginSuccessHandler.java (1)

67-77: HTTP 상태 코드 명시 누락
JSON 응답만 작성하고 response.setStatus(HttpServletResponse.SC_OK) 호출이 없습니다. 프레임워크 기본값에 의존하지 않고 명시적으로 200 OK를 설정해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/config/SwaggerConfig.java (1)

12-29: Swagger 설정 공통화 고려

SwaggerConfig 가 admin-api 모듈에도 거의 동일한 형태로 존재합니다.
중복 클래스를 각 모듈에 두기보다는 nowait-common 같은 공통 모듈에 배치하고,
패키지별 컴포넌트 스캔으로 공유하도록 하면 유지·버전 관리가 단순해집니다.

- package com.nowait.applicationuser.config;
+ package com.nowait.common.config.swagger;

장기적으로는 title·version 등을 application.yml 로 외부화하여 CI 단계에서 자동 주입하는 방안도 검토해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/oauth2/CustomOAuth2UserService.java (1)

51-61: 회원가입 트랜잭션 처리 누락

userRepository.save(user) 호출 전후가 트랜잭션 경계 밖이면, 동일 이메일로 동시 요청 시 중복 계정이 생성될 수 있습니다.
@Transactional 어노테이션을 메서드(또는 서비스 상위) 수준에 추가하여 원자성을 확보해 주세요.

nowait-app-admin-api/build.gradle (2)

30-33: 중복 테스트 의존성

testImplementation 'org.springframework.boot:spring-boot-starter-test' 가 32행과 51행에 두 번 선언되어 있습니다. 한 번만 남겨 불필요한 의존성 중복을 제거하세요.

-    testImplementation 'org.springframework.boot:spring-boot-starter-test'

35-39: jwt 라이브러리 버전 BOM 연동 권장

jjwt-impl, jjwt-jackson 은 동일 버전을 유지해야 하며, Spring Boot BOM 과 충돌 가능성이 있습니다. io.jsonwebtoken:jjwt-bom 을 import 하여 버전을 중앙집중화하는 방식을 권장합니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/config/security/CorsConfig.java (2)

22-22: 중복된 주석 코드를 제거하세요.

17번 줄에서 이미 setAllowCredentials(true)를 설정했으므로 주석 처리된 중복 코드를 제거해야 합니다.

-		//  config.setAllowCredentials(true); // 쿠키 포함 허용

18-18: 환경별 Origin 설정을 고려하세요.

현재 하드코딩된 localhost Origin들은 개발 환경에만 적합합니다. 프로덕션 환경을 위해 프로파일별 설정을 고려해보세요.

-		config.setAllowedOrigins(List.of("http://localhost:5173","http://localhost:63342"));
+		config.setAllowedOrigins(allowedOrigins);

그리고 @Value 어노테이션을 통해 환경별로 설정할 수 있습니다:

@Value("${cors.allowed-origins}")
private List<String> allowedOrigins;
nowait-domain/domain-core-rdb/build.gradle (1)

38-43: 의존성 버전 관리를 일관성 있게 하세요.

Lombok과 Jackson 의존성에 하드코딩된 버전이 있습니다. 루트 프로젝트의 BOM을 통해 관리하는 것이 좋습니다.

-    compileOnly 'org.projectlombok:lombok:1.18.26'
-    annotationProcessor 'org.projectlombok:lombok:1.18.26'
+    compileOnly 'org.projectlombok:lombok'
+    annotationProcessor 'org.projectlombok:lombok'

-    // Jackson
-    api 'com.fasterxml.jackson.core:jackson-databind:2.15.2'           // Jackson 핵심
-    api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.2'
+    // Jackson
+    api 'com.fasterxml.jackson.core:jackson-databind'
+    api 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310'
.github/workflows/deploy-user.yml (1)

58-58: 라인 끝 공백을 제거하세요.

Static analysis 도구에서 라인 끝 공백을 지적했습니다.

-        cp nowait-app-user-api/build/libs/nowait-app-user-api-*.jar deploy/nowait-app-user-api.jar  
+        cp nowait-app-user-api/build/libs/nowait-app-user-api-*.jar deploy/nowait-app-user-api.jar
nowait-app-user-api/build.gradle (2)

12-13: 버전 관리를 일관성 있게 하세요.

모듈별로 다른 버전을 사용하고 있습니다. 루트 프로젝트와 일관성을 유지하세요.

group = 'com.nowait'
-version = '0.0.1-SNAPSHOT'
+version = rootProject.version

56-56: 중복된 테스트 의존성을 제거하세요.

spring-boot-starter-test가 두 번 선언되어 있습니다.

    testImplementation 'org.springframework.boot:spring-boot-starter-test'
    implementation 'org.springframework.boot:spring-boot-starter-oauth2-client'
    // ... 기타 의존성들 ...
-    testImplementation 'org.springframework.boot:spring-boot-starter-test'
.github/workflows/deploy-admin.yml (2)

54-58: YAML trailing whitespace 제거 권장

54, 58행 끝에 남아 있는 불필요한 공백 때문에 YAMLlint 오류가 보고되었습니다. 기능상 문제는 없지만 CI 품질을 위해 공백을 제거하는 편이 좋습니다.

-          rm -rf deploy ␠
+          rm -rf deploy
...
-          cp nowait-app-admin-api/build/libs/nowait-app-admin-api-*.jar deploy/nowait-app-admin-api.jar␠ 
+          cp nowait-app-admin-api/build/libs/nowait-app-admin-api-*.jar deploy/nowait-app-admin-api.jar

63-69: OIDC 기반 AWS 자격 증명으로 전환 고려

aws-actions/configure-aws-credentials 스텝에서 영구 Access Key/Secret Key를 사용하고 있습니다. GitHub OIDC + IAM Role 방식을 적용하면 키 관리 부담이 줄고 보안성이 향상됩니다. 추후 단계적으로 전환을 검토해 보시는 것을 권장드립니다.

📜 Review details

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

📥 Commits

Reviewing files that changed from the base of the PR and between b9bb8cb and ca8b140.

⛔ Files ignored due to path filters (3)
  • domain-menu/gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
  • domain-store/gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
  • nowait-app-user-api/gradle/wrapper/gradle-wrapper.jar is excluded by !**/*.jar
📒 Files selected for processing (107)
  • .github/workflows/deploy-admin.yml (2 hunks)
  • .github/workflows/deploy-user.yml (2 hunks)
  • application-admin/src/main/java/com/nowait/applicationadmin/ApiAdminApplication.java (0 hunks)
  • application-config/build.gradle (0 hunks)
  • application-user/build.gradle (0 hunks)
  • application-user/src/main/java/com/nowait/applicationuser/ApiUserApplication.java (0 hunks)
  • build.gradle (1 hunks)
  • common/build.gradle (0 hunks)
  • domain-base/.gitattributes (0 hunks)
  • domain-base/build.gradle (0 hunks)
  • domain-bookmark/build.gradle (0 hunks)
  • domain-menu/.gitattributes (0 hunks)
  • domain-menu/gradle/wrapper/gradle-wrapper.properties (0 hunks)
  • domain-reservation/.gitignore (0 hunks)
  • domain-reservation/build.gradle (0 hunks)
  • domain-store/.gitattributes (0 hunks)
  • domain-store/.gitignore (0 hunks)
  • domain-store/build.gradle (0 hunks)
  • domain-store/gradle/wrapper/gradle-wrapper.properties (0 hunks)
  • domain-token/.gitattributes (0 hunks)
  • domain-token/.gitignore (0 hunks)
  • domain-token/build.gradle (0 hunks)
  • domain-token/src/main/resources/application.properties (0 hunks)
  • domain-user/.gitattributes (0 hunks)
  • domain-user/.gitignore (0 hunks)
  • external-oauth/.gitignore (0 hunks)
  • external-oauth/build.gradle (0 hunks)
  • infra-aws/.gitattributes (0 hunks)
  • infra-aws/.gitignore (0 hunks)
  • nowait-app-admin-api/build.gradle (2 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/ApiAdminApplication.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/config/SwaggerConfig.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/config/security/CorsConfig.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/config/security/SecurityConfig.java (2 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/exception/GlobalExceptionHandler.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/dto/MenuCreateRequest.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/dto/MenuCreateResponse.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/dto/MenuImageUploadResponse.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/dto/MenuReadDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuImageService.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/service/MenuService.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/CallGetResponseDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/ReservationGetResponseDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/exception/RefreshTokenNotFoundException.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/exception/ResourceNotFoundException.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/exception/TokenBadRequestException.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/exception/UnauthorizedException.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/jwt/JwtAuthorizationFilter.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/jwt/JwtUtil.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/service/CustomUserDetailService.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateRequest.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateResponse.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreImageUploadResponse.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreReadDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreServiceImpl.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/token/controller/TokenController.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/token/service/TokenService.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerLoginResponseDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerSignupRequestDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerSignupResponseDto.java (1 hunks)
  • nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/serivce/UserService.java (1 hunks)
  • nowait-app-user-api/build.gradle (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/ApiUserApplication.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/controller/BookmarkController.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/dto/BookmarkCreateResponse.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/dto/BookmarkGetResponse.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/service/BookmarkService.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/config/SwaggerConfig.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/config/security/CorsConfig.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/config/security/SecurityConfig.java (2 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/exception/GlobalExceptionHandler.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/dto/MenuImageUploadResponse.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/dto/MenuReadDto.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/service/MenuService.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/dto/KaKaoResponse.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/dto/OAuth2Response.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/oauth2/CustomOAuth2UserService.java (2 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/oauth2/OAuth2LoginSuccessHandler.java (2 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateResponseDto.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemListGetResponseDto.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/service/OrderService.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/controller/ReservationController.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/reservation/service/ReservationService.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/exception/RefreshTokenNotFoundException.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/exception/ResourceNotFoundException.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/exception/TokenBadRequestException.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/exception/UnauthorizedException.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/jwt/JwtAuthorizationFilter.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/jwt/JwtUtil.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/service/CustomUserDetailService.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreImageUploadResponse.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreReadDto.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/service/StoreServiceImpl.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/token/controller/TokenController.java (1 hunks)
  • nowait-app-user-api/src/main/java/com/nowait/applicationuser/token/service/TokenService.java (1 hunks)
  • nowait-common/build.gradle (1 hunks)
  • nowait-common/src/main/java/com/nowait/common/enums/Role.java (1 hunks)
  • nowait-domain/build.gradle (2 hunks)
  • nowait-domain/domain-admin-rdb/build.gradle (2 hunks)
  • nowait-domain/domain-core-rdb/build.gradle (1 hunks)
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/base/entity/BaseTimeEntity.java (1 hunks)
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/entity/Menu.java (1 hunks)
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/entity/MenuImage.java (1 hunks)
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/exception/MenuImageEmptyException.java (1 hunks)
⛔ Files not processed due to max files limit (47)
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/exception/MenuImageNotFoundException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/exception/MenuNotFoundException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/exception/MenuParamEmptyException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/repository/MenuImageRepository.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/repository/MenuRepository.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/entity/OrderItem.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/entity/UserOrder.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/exception/DepositorNameTooLongException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/exception/DuplicateOrderException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/exception/OrderItemsEmptyException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/exception/OrderParameterEmptyException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderItemRepository.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/order/repository/OrderRepository.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/entity/Reservation.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/exception/ReservationNotFoundException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/reservation/repository/ReservationRepository.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/Store.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/entity/StoreImage.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/exception/StoreImageEmptyException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/exception/StoreImageNotFoundException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/exception/StoreKeywordEmptyException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/exception/StoreNotFoundException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/exception/StoreParamEmptyException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreImageRepository.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/store/repository/StoreRepository.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/token/entity/Token.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/token/exception/BusinessException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/token/repository/TokenRepository.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/user/entity/MemberDetails.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/user/entity/User.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/user/exception/UserNotFoundException.java
  • nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/user/repository/UserRepository.java
  • nowait-domain/domain-user-rdb/build.gradle
  • nowait-domain/domain-user-rdb/src/main/java/com/nowait/domainuserrdb/bookmark/entity/Bookmark.java
  • nowait-domain/domain-user-rdb/src/main/java/com/nowait/domainuserrdb/bookmark/exception/BookmarkOwnerMismatchException.java
  • nowait-domain/domain-user-rdb/src/main/java/com/nowait/domainuserrdb/bookmark/exception/DuplicateBookmarkException.java
  • nowait-domain/domain-user-rdb/src/main/java/com/nowait/domainuserrdb/bookmark/repository/BookmarkRepository.java
  • nowait-domain/domain-user-rdb/src/main/java/com/nowait/domainuserrdb/oauth/dto/CustomOAuth2User.java
  • nowait-infra/build.gradle
  • nowait-infra/src/main/java/com/nowait/infraaws/aws/s3/S3Service.java
  • nowait-infra/src/main/java/com/nowait/infraaws/config/AsyncConfig.java
  • security-admin/.gitattributes
  • security-admin/.gitignore
  • security-admin/build.gradle
  • security-front/.gitignore
  • security-front/build.gradle
  • settings.gradle
💤 Files with no reviewable changes (26)
  • domain-token/src/main/resources/application.properties
  • domain-base/.gitattributes
  • domain-store/.gitignore
  • domain-user/.gitattributes
  • domain-store/gradle/wrapper/gradle-wrapper.properties
  • domain-token/.gitignore
  • domain-menu/gradle/wrapper/gradle-wrapper.properties
  • domain-menu/.gitattributes
  • common/build.gradle
  • external-oauth/.gitignore
  • application-admin/src/main/java/com/nowait/applicationadmin/ApiAdminApplication.java
  • application-config/build.gradle
  • domain-store/.gitattributes
  • infra-aws/.gitignore
  • domain-reservation/build.gradle
  • domain-store/build.gradle
  • domain-bookmark/build.gradle
  • domain-token/build.gradle
  • domain-base/build.gradle
  • infra-aws/.gitattributes
  • domain-token/.gitattributes
  • domain-user/.gitignore
  • domain-reservation/.gitignore
  • application-user/build.gradle
  • external-oauth/build.gradle
  • application-user/src/main/java/com/nowait/applicationuser/ApiUserApplication.java
🧰 Additional context used
🪛 YAMLlint (1.37.1)
.github/workflows/deploy-admin.yml

[error] 54-54: trailing spaces

(trailing-spaces)


[error] 58-58: trailing spaces

(trailing-spaces)

.github/workflows/deploy-user.yml

[warning] 8-8: wrong indentation: expected 4 but found 6

(indentation)


[error] 58-58: trailing spaces

(trailing-spaces)

🔇 Additional comments (48)
nowait-common/build.gradle (1)

1-15: java / java-library 플러그인 적용 여부를 확인해주세요

jar { ... }, bootJar { ... }, java { ... } 블록이 정의되어 있지만, 이 파일 내에서 java 혹은 java-library 플러그인을 명시적으로 적용하고 있지 않습니다. 최상위 build.gradle(또는 convention 플러그인)에서 일괄 적용하고 있다면 문제없지만, 누락 시 Jar 생성·툴체인 설정이 무시될 수 있습니다.
필요 시 다음과 같이 명시적으로 추가하는 방안을 검토해 주세요.

plugins {
    id 'java-library'
}
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/dto/MenuCreateResponse.java (1)

5-5: 패키지 경로 변경 반영 확인 완료

Menu 엔티티 패키지 변경에 맞춰 import가 올바르게 수정되었습니다. 추가 이슈 없습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/dto/KaKaoResponse.java (1)

1-1: 의존성 전파 검증 완료
rg -n "com\.nowait\.externaloauth\.dto\.KaKaoResponse" 실행 결과, 이전 패키지 경로를 참조하는 코드는 더 이상 존재하지 않습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/token/controller/TokenController.java (1)

11-11: JwtUtil 경로 변경 확인 완료
패키지 변경에 따른 import 수정이 잘 반영되었습니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/dto/MenuImageUploadResponse.java (1)

3-3: 도메인 모듈 경로 변경 확인

엔티티가 com.nowait.domaincorerdb로 이동됨에 따라 import가 정상적으로 수정되었습니다. 해당 모듈이 implementation 혹은 api 의존성에 포함되어 있는지만 다시 한 번 확인해 주세요.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/jwt/JwtUtil.java (1)

1-1: 패키지 이동 확인

보안 유틸이 applicationadmin.security.jwt로 이동된 부분 문제 없습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/dto/MenuImageUploadResponse.java (1)

3-3: 도메인 경로 변경 승인

MenuImage 엔티티 import 경로가 새로운 모듈 구조에 맞게 수정되었습니다. 별다른 문제 없어 보입니다.

nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/exception/MenuImageEmptyException.java (1)

1-1: 패키지 변경 일관성 확인 완료

모듈 리팩터링에 맞춰 패키지 경로가 정상적으로 수정되었습니다. 동일 예외를 참조하는 모든 클래스에서도 동일 경로로 업데이트됐는지 한 번 더 grep 확인만 부탁드립니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/menu/dto/MenuReadDto.java (1)

5-5: 패키지 경로 업데이트 OK

새로운 domaincorerdb 네임스페이스로 import 수정이 잘 반영되었습니다. 관련 서비스·컨트롤러에서도 동일하게 수정되었는지 확인만 부탁드립니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/dto/MenuCreateRequest.java (1)

4-4: import 경로 변경 확인

Menu 엔티티 경로가 새 모듈 구조와 일치합니다. 빌더 사용으로 생성 로직도 문제없습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreReadDto.java (1)

6-6: 패키지 경로 변경 확인 완료
Store 엔티티의 패키지 경로가 새 모듈 구조(domaincorerdb)에 맞게 올바르게 수정되었습니다. 추가 조치 필요 없습니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerLoginResponseDto.java (1)

3-3: 패키지 경로 변경 확인 완료
User 엔티티 import가 새 도메인 모듈로 정상 변경되었습니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateResponse.java (1)

5-5: 패키지 경로 변경 확인 완료
Store 엔티티 import가 새 모듈 구조에 맞추어 올바르게 수정되었습니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreCreateRequest.java (1)

3-3: 패키지 경로 변경 확인 완료
도메인 엔티티 import가 새 패키지로 정상 업데이트되었습니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/user/dto/ManagerSignupResponseDto.java (1)

4-4: 패키지 경로 수정 확인 완료

도메인 모듈 이동에 맞춘 import 변경으로, 컴파일 오류 없이 정상 동작할 것으로 보입니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/ReservationGetResponseDto.java (1)

5-5: 패키지 경로 수정 확인 완료

도메인 모듈 이동에 맞춘 import 변경입니다. 다른 영향은 없어 보입니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/exception/UnauthorizedException.java (1)

1-1: 패키지 이동 정상 확인
모듈 재구성에 따른 package 경로 변경만 이루어졌으며, 클래스 내용과 직·간접 참조에 영향이 없는 것으로 보입니다. 다른 모듈에서의 import 경로도 동일하게 업데이트되었는지 한번 더 확인만 해 주세요.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/dto/CallGetResponseDto.java (1)

5-5: 도메인 모듈 의존성 확인 필요
com.nowait.domaincorerdb.reservation.entity.Reservation 로 import 가 변경되었습니다. nowait-domain/domain-core-rdb 모듈이 admin-api 모듈의 compile classpath 에 포함되어 있지 않으면 컴파일 오류가 발생하니, build.gradle(또는 gradle.kts) 의 implementation 의존성을 점검해 주세요.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/exception/RefreshTokenNotFoundException.java (1)

1-1: 패키지 경로 변경만 수행됨
패키지 이동 외 로직 변경은 없으며, 상위 클래스(ResourceNotFoundException) 위치도 동일 네임스페이스로 이동했는지 확인해 두면 좋겠습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/exception/ResourceNotFoundException.java (1)

1-1: 패키지 네임스페이스 통일 완료
package 변경 외 차이점 없으며, 공통 예외 처리에서 새 경로를 import 하고 있는지 확인만 하면 될 것 같습니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/exception/ResourceNotFoundException.java (1)

1-1: 패키지 이동이 다른 모듈 컴파일 오류를 유발할 가능성 확인 필요

ResourceNotFoundException이 admin-api 모듈로 이동했습니다. 동일 클래스를 사용하던 user-api 모듈(예: RefreshTokenNotFoundException)에 적절한 import 수정 또는 공통 모듈로의 추출이 없으면 컴파일이 실패합니다.
의존성 그래프와 import 구문이 모두 갱신되었는지 다시 한 번 전체 빌드로 점검해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderCreateResponseDto.java (1)

5-5: 도메인 모듈 의존성 확인

import 경로가 com.nowait.domaincorerdb.order.entity.UserOrder 로 변경되었습니다.
nowait-app-user-api 모듈의 build.gradle(또는 build.gradle.kts) 에 domain-core-rdb 모듈 의존성이 추가되지 않았다면 런타임/컴파일 오류가 발생합니다. 의존성 선언 여부를 확인해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/dto/BookmarkCreateResponse.java (1)

3-3: 모듈 의존성 점검

domain-user-rdb 모듈에 대한 의존성이 누락되면 해당 import 가 컴파일되지 않습니다. Gradle 설정을 재확인해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/dto/BookmarkGetResponse.java (1)

3-3: 모듈 의존성 점검

위 파일과 동일하게 domain-user-rdb 모듈 의존성 추가 여부를 확인해 주세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/order/dto/OrderItemListGetResponseDto.java (1)

4-4: 패키지 경로 수정 확인 완료
OrderItem 엔티티가 새 모듈(domain-core-rdb)로 이동된 변경 사항이 정상적으로 반영되었습니다. 별도의 사이드이펙트는 없어 보입니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/store/dto/StoreImageUploadResponse.java (1)

3-3: 패키지 경로 수정 확인 완료
새로운 StoreImage 위치를 올바르게 임포트하고 있습니다. 빌드 의존성만 최신화되어 있다면 추가 조치가 필요 없습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/bookmark/controller/BookmarkController.java (1)

16-16: CustomOAuth2User 모듈 의존성 확인 필요
CustomOAuth2Userdomain-user-rdb 모듈로 이동됨에 따라 nowait-app-user-apibuild.gradle(또는 build.gradle.kts)에 해당 모듈이 implementation(또는 api) 의존성으로 추가되어 있는지 확인 부탁드립니다. 누락되면 컴파일 오류가 발생합니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/reservation/service/ReservationService.java (1)

14-17: 패키지 경로 변경 검토 완료
엔티티·예외·레포지토리 모두 새로운 domain-core-rdb 네임스페이스로 정상 교체되었습니다. 서비스 로직에는 영향을 주지 않으므로 변경 사항에 문제 없습니다.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/dto/OAuth2Response.java (1)

1-1: 패키지 이동 후 참조 정합성 확인 권장
인터페이스 패키지가 applicationuser.oauth.dto로 변경되었습니다. 이를 구현하거나 참조하는 클래스(예: CustomOAuth2UserService, KaKaoResponse, CustomOAuth2User)의 임포트가 모두 업데이트되었는지 확인해주세요. 일부 파일이 이전 경로를 참조하면 클래스 충돌 또는 컴파일 오류가 발생할 수 있습니다.

nowait-domain/domain-core-rdb/src/main/java/com/nowait/domaincorerdb/menu/entity/MenuImage.java (1)

30-38: Cascade 옵션·고아 객체 처리 검토 권장

@ManyToOne(fetch = FetchType.LAZY) 로만 지정되어 있어 메뉴 삭제 시 연관 이미지가 고아로 남을 수 있습니다.
Menu 삭제 시 연관 MenuImage 를 함께 삭제하도록 cascade = CascadeType.REMOVE 또는 별도 서비스 로직을 고려해주세요.

nowait-common/src/main/java/com/nowait/common/enums/Role.java (1)

5-7: SUPER_ADMIN 추가 확인 완료

역할 상수 추가 외에는 영향이 없으며, fromString 로직도 그대로 동작합니다. 인가 설정에서 새 역할이 매핑되었는지만 별도 확인 부탁드립니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreServiceImpl.java (1)

13-18: 패키지 네이밍 확인 결과 오타가 아닙니다
domain-core-rdb 모듈 전반에서 com.nowait.domaincorerdb 패키지를 일관되게 사용 중이며, Java 패키지명에 하이픈(-)은 허용되지 않으므로 의도된 네이밍입니다. 해당 import는 그대로 유지하셔도 됩니다.

Likely an incorrect or invalid review comment.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/security/exception/TokenBadRequestException.java (1)

1-5: 패키지 이동 정상 반영 확인
BusinessException 경로 변경 및 패키지 이동이 깔끔하게 적용되었습니다. 별다른 문제 없어 보입니다.

nowait-domain/domain-admin-rdb/build.gradle (1)

27-28: 의존성 모듈 경로 최신화 완료
nowait-common, nowait-domain:domain-core-rdb로의 변경이 새로운 모듈 구조와 일관됩니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/service/StoreImageService.java (1)

13-20: 의존성 경로 변경 후 모듈 빌드 확인 필요
infraaws.aws.s3.S3Service로 패키지가 변경되었습니다. nowait-infra-aws 모듈이 실제로 해당 경로의 클래스를 export하는지, 그리고 app-admin-api 모듈이 이를 의존성에 포함했는지 다시 한 번 확인 부탁드립니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/exception/TokenBadRequestException.java (1)

1-11: 변경된 패키지 이동만 이루어졌으며 로직 문제 없습니다

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/security/jwt/JwtAuthorizationFilter.java (1)

30-46: 두 필터 간 JwtUtil.isExpired 반환 타입이 불일치합니다

user-api 필터는 isExpired 가 예외를 던진다고 가정하고, admin-api 필터는 boolean 을 기대합니다.
동일 유틸을 공유한다면 계약을 통일하거나 메서드를 분리해 혼동을 방지하세요.

nowait-app-user-api/src/main/java/com/nowait/applicationuser/token/service/TokenService.java (1)

9-13: 패키지 이동 반영 확인 완료
새로운 모듈 구조에 맞춰 import 경로가 정상적으로 조정되었습니다. 추가적인 이슈는 보이지 않습니다.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/exception/GlobalExceptionHandler.java (1)

20-30: 패키지 리팩터링 반영 확인 완료
예외 클래스 import 경로가 새 도메인 모듈로 정상 이동되었습니다. 추가적으로 코드 변경 사항은 없어 문제 없습니다.

nowait-app-admin-api/build.gradle (1)

5-10: bootJar / jar 설정 검토

Spring Boot 모듈이라면 일반적으로 bootJar.enabled = true, jar.enabled = false 설정이 맞지만, 동일 모듈을 다른 하위 모듈들이 implementation 으로 참조한다면 jar 생성을 꺼버리면 의존성 해결이 실패합니다.
실제 의존 관계를 다시 확인해 주세요.

nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/config/security/CorsConfig.java (1)

17-18: 개발 환경에 적합한 CORS 설정입니다.

로컬호스트 Origin 허용과 자격증명 허용 설정이 개발 환경에 적절합니다. 다만 프로덕션 환경에서는 실제 도메인으로 변경해야 합니다.

nowait-domain/domain-core-rdb/build.gradle (1)

5-10: 도메인 모듈에 적합한 JAR 설정입니다.

도메인 모듈이므로 실행 가능한 JAR는 비활성화하고 일반 JAR만 활성화한 것이 올바릅니다.

.github/workflows/deploy-user.yml (1)

43-51: 모듈 이름 변경이 올바르게 반영되었습니다.

application-user에서 nowait-app-user-api로의 모듈 이름 변경이 CI/CD 워크플로우에 일관성 있게 적용되었습니다.

nowait-app-user-api/build.gradle (1)

5-10: 애플리케이션 모듈에 적합한 JAR 설정입니다.

애플리케이션 모듈이므로 실행 가능한 JAR는 활성화하고 일반 JAR는 비활성화한 것이 올바릅니다.

build.gradle (2)

6-16: 그룹 ID 변경이 일관성 있게 적용되었습니다.

com.nowaiting에서 com.nowait로의 그룹 ID 변경이 루트와 모든 프로젝트에 일관성 있게 적용되었습니다.


2-3: 플러그인 버전 호환성 확인됨
Spring Boot 3.5.0과 io.spring.dependency-management 1.1.7 플러그인은 상호 호환되므로, 현 구성(플러그인 버전 명시)을 그대로 유지해도 문제가 없습니다.

.github/workflows/deploy-admin.yml (2)

8-12: 경로 패턴 누락 가능성 확인 필요

paths: 섹션에 신규 모듈 경로가 반영된 것은 👍 입니다. 다만 Admin API가 직접/간접으로 참조하는 다른 모듈(예: nowait-domain/domain-common-rdb/**, nowait-domain/domain-support/** 등)이 누락되면 해당 모듈의 변경이 워크플로 트리거에 포함되지 않을 수 있습니다. 실제 의존 관계와 비교해 패턴을 한 번 더 점검해 주세요.


43-48: application-admin.yml 경로 및 파일명 검증 필요

리팩터링 후에도 프로퍼티 파일명이 여전히 application-admin.yml 인지 확실치 않습니다.
Spring Boot는 기본적으로 application.yml 또는 application-{profile}.yml 을 읽습니다. 파일명이 잘못되면 설정이 로드되지 않아 부트 실패가 발생할 수 있으니, 최신 모듈의 설정 파일 구조와 일치하는지 확인해 주세요.

Comment on lines +21 to 34
import com.nowait.applicationuser.security.exception.ResourceNotFoundException;
import com.nowait.applicationuser.security.exception.UnauthorizedException;
import com.nowait.common.exception.ErrorMessage;
import com.nowait.common.exception.ErrorResponse;
import com.nowait.frontsecurity.exception.ResourceNotFoundException;
import com.nowait.frontsecurity.exception.UnauthorizedException;
import com.nowait.order.exception.DepositorNameTooLongException;
import com.nowait.order.exception.DuplicateOrderException;
import com.nowait.order.exception.OrderItemsEmptyException;
import com.nowait.order.exception.OrderParameterEmptyException;
import com.nowait.reservation.exception.ReservationNotFoundException;
import com.nowait.token.exception.BusinessException;
import com.nowait.user.exception.UserNotFoundException;
import com.nowait.domaincorerdb.order.exception.DepositorNameTooLongException;
import com.nowait.domaincorerdb.order.exception.DuplicateOrderException;
import com.nowait.domaincorerdb.order.exception.OrderItemsEmptyException;
import com.nowait.domaincorerdb.order.exception.OrderParameterEmptyException;
import com.nowait.domaincorerdb.reservation.exception.ReservationNotFoundException;
import com.nowait.domaincorerdb.token.exception.BusinessException;
import com.nowait.domaincorerdb.user.exception.UserNotFoundException;
import com.nowait.domainuserrdb.bookmark.exception.BookmarkOwnerMismatchException;
import com.nowait.domainuserrdb.bookmark.exception.DuplicateBookmarkException;

Copy link

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Exception 클래스 의존성 관리 과다

도메인별 예외를 모두 import 하여 메서드를 개별 선언하면, 새 도메인 추가 시마다 Handler 수정이 필요합니다.
BusinessException 을 상속받도록 통일하고 하나의 메서드에서 처리하거나, 패키지 스캔 기반 @ExceptionHandler(BusinessException.class) 로 축약하는 방향을 고려해 보세요.

🤖 Prompt for AI Agents
In
nowait-app-user-api/src/main/java/com/nowait/applicationuser/exception/GlobalExceptionHandler.java
between lines 21 and 34, multiple domain-specific exception classes are imported
and handled individually, causing maintenance overhead when adding new domains.
Refactor by having all domain exceptions inherit from BusinessException and
consolidate exception handling into a single method annotated with
@ExceptionHandler(BusinessException.class) to handle all related exceptions
uniformly, reducing the need to modify the handler for each new domain
exception.

@Jjiggu Jjiggu merged commit 5aa8867 into develop Jul 4, 2025
@coderabbitai coderabbitai bot mentioned this pull request Jul 8, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

refactor 리팩토링

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants