-
Notifications
You must be signed in to change notification settings - Fork 0
Fix: multi module 구조 변경 #54
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
Caution Review failedThe pull request is closed. Walkthrough이 변경사항은 프로젝트의 모듈 구조와 네이밍 규칙을 대대적으로 개편하고, 관련 소스 코드, Gradle 빌드 스크립트, CI/CD 워크플로우, import 경로, 패키지 선언, 그리고 일부 신규 서비스 및 DTO 클래스를 추가하는 작업을 포함합니다. 기존 모듈들은 Changes
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
Possibly related PRs
📜 Recent review detailsConfiguration used: CodeRabbit UI 📒 Files selected for processing (26)
✨ Finishing Touches
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed 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)
Other keywords and placeholders
CodeRabbit Configuration File (
|
# 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
There was a problem hiding this 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키가 없거나 서브맵에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:ResourceNotFoundExceptionimport 누락으로 컴파일 오류 발생현재 파일 패키지와
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)를 반복 호출하면 메뉴 수만큼 추가 쿼리가 발생합니다. 매장에 메뉴가 많을 경우 성능 이슈가 큽니다.가능한 개선안:
@EntityGraph나JOIN FETCH로 메뉴와 이미지를 한 번에 조회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 가능성
tokenCategory가null일 경우 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의savewith detached entity update)으로 원자적 변경을 고려해 주세요.nowait-app-user-api/src/main/java/com/nowait/applicationuser/oauth/oauth2/OAuth2LoginSuccessHandler.java (2)
55-58: 개인정보가 포함된 로그 최소화
user,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"문자열이 여러 메서드에서 반복됩니다. 상수화하여 오타 리스크를 줄여주세요.isExpired는ExpiredJwtException발생 시 그대로 예외가 전파됩니다. 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: 도메인 모듈 경로 수정 확인
StoreImageimport가 새 도메인 모듈로 정상 이동되었습니다. 추가로, DTO 필드 수가 적어 immutable 성격이 강하므로 Java 17+ 환경이라면 record 전환도 고려해볼 만합니다.nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/menu/dto/MenuReadDto.java (1)
5-5: 패키지 경로 업데이트 OKAdmin API 측 DTO 역시 올바른 패키지로 교체되었습니다. User-API와 중복 DTO 구조가 있으므로 공용 DTO 모듈로 분리하는 것까지 고려해 보시면 유지보수성이 높아집니다.
nowait-app-admin-api/src/main/java/com/nowait/applicationadmin/store/dto/StoreReadDto.java (1)
6-6: 중복 DTO 제거 고려 권장
StoreReadDto가user-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 경로 변경 확인
CustomOAuth2User가domainuserrdb모듈로 이동했습니다. 사용자 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 락이 길어질 수 있으니,
- 비동기 처리를 유지하고 업로드 완료 후 별도 이벤트/리스너에서
MenuImage저장,- 또는
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.jarnowait-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
⛔ Files ignored due to path filters (3)
domain-menu/gradle/wrapper/gradle-wrapper.jaris excluded by!**/*.jardomain-store/gradle/wrapper/gradle-wrapper.jaris excluded by!**/*.jarnowait-app-user-api/gradle/wrapper/gradle-wrapper.jaris 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모듈 의존성 확인 필요
CustomOAuth2User가domain-user-rdb모듈로 이동됨에 따라nowait-app-user-api의build.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-management1.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을 읽습니다. 파일명이 잘못되면 설정이 로드되지 않아 부트 실패가 발생할 수 있으니, 최신 모듈의 설정 파일 구조와 일치하는지 확인해 주세요.
...pp-admin-api/src/main/java/com/nowait/applicationadmin/order/controller/OrderController.java
Outdated
Show resolved
Hide resolved
| 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; | ||
|
|
There was a problem hiding this comment.
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.
작업 요약
Issue Link
#44
문제점 및 어려움
해결 방안
Reference
Summary by CodeRabbit
신규 기능
버그 수정
리팩터링
기타