diff --git a/src/main/java/com/depromeet/stonebed/domain/auth/application/AuthService.java b/src/main/java/com/depromeet/stonebed/domain/auth/application/AuthService.java index 3a6fd6a9..34ca3a41 100644 --- a/src/main/java/com/depromeet/stonebed/domain/auth/application/AuthService.java +++ b/src/main/java/com/depromeet/stonebed/domain/auth/application/AuthService.java @@ -20,6 +20,7 @@ import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord; import com.depromeet.stonebed.global.error.ErrorCode; import com.depromeet.stonebed.global.error.exception.CustomException; +import com.depromeet.stonebed.global.security.JwtTokenProvider; import com.depromeet.stonebed.global.util.MemberUtil; import java.util.List; import java.util.Optional; @@ -40,7 +41,7 @@ public class AuthService { private final AppleClient appleClient; private final KakaoClient kakaoClient; - private final JwtTokenService jwtTokenService; + private final JwtTokenProvider jwtTokenProvider; private final MemberUtil memberUtil; public SocialClientResponse authenticateFromProvider(OAuthProvider provider, String token) { @@ -83,7 +84,7 @@ public AuthTokenResponse socialLogin( // 임시 토큰 발행 TokenPairResponse temporaryTokenPair = - jwtTokenService.generateTemporaryTokenPair(newMember); + jwtTokenProvider.generateTemporaryTokenPair(newMember); newMember.updateLastLoginAt(); log.info("임시 회원가입 진행: {}", newMember.getId()); return AuthTokenResponse.of(temporaryTokenPair, true); @@ -110,9 +111,9 @@ public AuthTokenResponse registerMember(CreateMemberRequest request) { public AuthTokenResponse reissueTokenPair(RefreshTokenRequest request) { // 리프레시 토큰을 이용해 새로운 액세스 토큰 발급 RefreshTokenDto refreshTokenDto = - jwtTokenService.retrieveRefreshToken(request.refreshToken()); + jwtTokenProvider.retrieveRefreshToken(request.refreshToken()); RefreshTokenDto refreshToken = - jwtTokenService.createRefreshTokenDto(refreshTokenDto.memberId()); + jwtTokenProvider.createRefreshTokenDto(refreshTokenDto.memberId()); Member member = memberUtil.getMemberByMemberId(refreshToken.memberId()); @@ -121,11 +122,11 @@ public AuthTokenResponse reissueTokenPair(RefreshTokenRequest request) { } private TokenPairResponse getLoginResponse(Member member) { - return jwtTokenService.generateTokenPair(member.getId(), MemberRole.USER); + return jwtTokenProvider.generateTokenPair(member.getId(), MemberRole.USER); } private TokenPairResponse getTemporaryLoginResponse(Member member) { - return jwtTokenService.generateTokenPair(member.getId(), MemberRole.TEMPORARY); + return jwtTokenProvider.generateTokenPair(member.getId(), MemberRole.TEMPORARY); } public void withdraw() { @@ -144,7 +145,7 @@ public void withdraw() { withdrawMemberRelationByMemberId( missionRecords.stream().map(MissionRecord::getId).toList(), member.getId()); - jwtTokenService.deleteRefreshToken(member.getId()); + jwtTokenProvider.deleteRefreshToken(member.getId()); memberRepository.deleteById(member.getId()); } diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmController.java b/src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmNotificationController.java similarity index 89% rename from src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmController.java rename to src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmNotificationController.java index 10a8db96..81719f2b 100644 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmController.java +++ b/src/main/java/com/depromeet/stonebed/domain/fcm/api/FcmNotificationController.java @@ -1,7 +1,6 @@ package com.depromeet.stonebed.domain.fcm.api; import com.depromeet.stonebed.domain.fcm.application.FcmNotificationService; -import com.depromeet.stonebed.domain.fcm.application.FcmTokenService; import com.depromeet.stonebed.domain.fcm.dto.request.FcmTokenRequest; import com.depromeet.stonebed.domain.fcm.dto.response.FcmNotificationResponse; import io.swagger.v3.oas.annotations.Operation; @@ -25,22 +24,21 @@ @RestController @RequestMapping("/alarm") @RequiredArgsConstructor -public class FcmController { - private final FcmTokenService fcmTokenService; +public class FcmNotificationController { private final FcmNotificationService fcmNotificationService; @Operation(summary = "FCM 토큰 저장", description = "로그인 시 FCM 토큰을 저장합니다.") @PostMapping("/token") - public ResponseEntity fcmTokenStore( + public ResponseEntity fcmTokenSave( @RequestBody @Validated FcmTokenRequest fcmTokenRequest) { - fcmTokenService.storeOrUpdateToken(fcmTokenRequest.token()); + fcmNotificationService.saveFcmToken(fcmTokenRequest.token()); return ResponseEntity.ok().build(); } @Operation(summary = "FCM 토큰 삭제", description = "로그아웃 시 FCM 토큰을 삭제합니다.") @DeleteMapping("/token") public ResponseEntity fcmTokenDelete() { - fcmTokenService.invalidateTokenForCurrentMember(); + fcmNotificationService.invalidateTokenForCurrentMember(); return ResponseEntity.ok().build(); } diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationService.java b/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationService.java index 99dbc0cc..4adb016c 100644 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationService.java +++ b/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationService.java @@ -1,7 +1,7 @@ package com.depromeet.stonebed.domain.fcm.application; import com.depromeet.stonebed.domain.fcm.dao.FcmNotificationRepository; -import com.depromeet.stonebed.domain.fcm.dao.FcmRepository; +import com.depromeet.stonebed.domain.fcm.dao.FcmTokenRepository; import com.depromeet.stonebed.domain.fcm.domain.FcmMessage; import com.depromeet.stonebed.domain.fcm.domain.FcmNotification; import com.depromeet.stonebed.domain.fcm.domain.FcmNotificationType; @@ -28,6 +28,7 @@ import java.util.stream.Collectors; import java.util.stream.IntStream; import lombok.RequiredArgsConstructor; +import org.springdoc.core.parsers.ReturnTypeParser; import org.springframework.data.domain.PageRequest; import org.springframework.data.domain.Pageable; import org.springframework.data.domain.Sort; @@ -42,7 +43,7 @@ public class FcmNotificationService { private final FcmNotificationRepository notificationRepository; private final MissionRecordBoostRepository missionRecordBoostRepository; private final MissionRecordRepository missionRecordRepository; - private final FcmRepository fcmRepository; + private final FcmTokenRepository fcmTokenRepository; private final MemberRepository memberRepository; private final MemberUtil memberUtil; @@ -52,6 +53,7 @@ public class FcmNotificationService { private static final long FIRST_BOOST_THRESHOLD = 1; private static final long POPULAR_THRESHOLD = 1000; private static final long SUPER_POPULAR_THRESHOLD = 5000; + private final ReturnTypeParser genericReturnTypeParser; public void saveNotification( FcmNotificationType type, @@ -194,27 +196,38 @@ private long determineBoostCount(Long totalBoostCount) { return 0; } + private Optional getTokenForMember(Member member) { + return fcmTokenRepository.findByMember(member).map(FcmToken::getToken); + } + + private Optional validateTokenForMember(Member member) { + return getTokenForMember(member).filter(token -> !token.isEmpty()); + } + + private String generateDeepLink(MissionRecord missionRecord, long boostCount) { + return FcmNotification.generateDeepLink( + FcmNotificationType.BOOSTER, missionRecord.getId(), boostCount); + } + + private void createAndSendFcmMessage( + String title, String message, String token, String deepLink) { + FcmMessage fcmMessage = FcmMessage.of(title, message, token, deepLink); + sqsMessageService.sendMessage(fcmMessage); + } + private void sendBoostNotification( MissionRecord missionRecord, FcmNotificationConstants notificationConstants, long boostCount) { - String token = - fcmRepository - .findByMember(missionRecord.getMember()) - .map(FcmToken::getToken) - .orElseThrow(() -> new CustomException(ErrorCode.FAILED_TO_FIND_FCM_TOKEN)); - - String deepLink = - FcmNotification.generateDeepLink( - FcmNotificationType.BOOSTER, missionRecord.getId(), boostCount); - - FcmMessage fcmMessage = - FcmMessage.of( - notificationConstants.getTitle(), - notificationConstants.getMessage(), - token, - deepLink); - sqsMessageService.sendMessage(fcmMessage); + String token = validateTokenForMember(missionRecord.getMember()).orElse(null); + if (token == null) return; + + String deepLink = generateDeepLink(missionRecord, boostCount); + createAndSendFcmMessage( + notificationConstants.getTitle(), + notificationConstants.getMessage(), + token, + deepLink); saveNotification( FcmNotificationType.BOOSTER, @@ -242,7 +255,7 @@ private List buildNotificationList( for (String token : tokens) { Member member = - fcmRepository + fcmTokenRepository .findByToken(token) .map(FcmToken::getMember) .orElseThrow( @@ -279,4 +292,52 @@ private List> createBatches(List tokens, int batchSize) { Math.min(tokens.size(), (i + 1) * batchSize))) .collect(Collectors.toList()); } + + @Transactional(readOnly = true) + public List getAllTokens() { + return fcmTokenRepository.findAllValidTokens(); + } + + @Transactional + public void invalidateTokenForCurrentMember() { + Member currentMember = memberUtil.getCurrentMember(); + fcmTokenRepository + .findByMember(currentMember) + .ifPresentOrElse( + fcmToken -> updateToken(fcmToken, null), + () -> { + throw new CustomException(ErrorCode.FAILED_TO_FIND_FCM_TOKEN); + }); + } + + private void updateToken(FcmToken fcmToken, String token) { + fcmToken.updateToken(token); + fcmTokenRepository.save(fcmToken); + } + + @Transactional + public void saveFcmToken(String token) { + if (token == null || token.isEmpty()) { + throw new CustomException(ErrorCode.INVALID_FCM_TOKEN); + } + + Member member = memberUtil.getCurrentMember(); + Optional existingTokenOptional = fcmTokenRepository.findByToken(token); + + existingTokenOptional.ifPresent( + existingToken -> { + if (!existingToken.getMember().equals(member)) { + fcmTokenRepository.delete(existingToken); + } + }); + + fcmTokenRepository + .findByMember(member) + .ifPresentOrElse( + fcmToken -> fcmToken.updateToken(token), + () -> { + FcmToken fcmToken = FcmToken.createFcmToken(member, token); + fcmTokenRepository.save(fcmToken); + }); + } } diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmTokenService.java b/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmTokenService.java deleted file mode 100644 index 689bf201..00000000 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmTokenService.java +++ /dev/null @@ -1,80 +0,0 @@ -package com.depromeet.stonebed.domain.fcm.application; - -import com.depromeet.stonebed.domain.fcm.dao.FcmRepository; -import com.depromeet.stonebed.domain.fcm.domain.FcmToken; -import com.depromeet.stonebed.domain.member.domain.Member; -import com.depromeet.stonebed.global.error.ErrorCode; -import com.depromeet.stonebed.global.error.exception.CustomException; -import com.depromeet.stonebed.global.util.MemberUtil; -import java.util.List; -import java.util.Optional; -import lombok.RequiredArgsConstructor; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; - -@Service -@RequiredArgsConstructor -public class FcmTokenService { - - private final FcmRepository fcmRepository; - private final MemberUtil memberUtil; - - @Transactional(readOnly = true) - public List getAllTokens() { - return fcmRepository.findAllValidTokens(); - } - - @Transactional - public void invalidateTokenForCurrentMember() { - Member currentMember = memberUtil.getCurrentMember(); - fcmRepository - .findByMember(currentMember) - .ifPresentOrElse( - fcmToken -> updateToken(fcmToken, null), - () -> { - throw new CustomException(ErrorCode.FAILED_TO_FIND_FCM_TOKEN); - }); - } - - @Transactional - public void invalidateToken(String token) { - fcmRepository - .findByToken(token) - .ifPresentOrElse( - fcmToken -> updateToken(fcmToken, null), - () -> { - throw new CustomException(ErrorCode.FAILED_TO_FIND_FCM_TOKEN); - }); - } - - private void updateToken(FcmToken fcmToken, String token) { - fcmToken.updateToken(token); - fcmRepository.save(fcmToken); - } - - @Transactional - public void storeOrUpdateToken(String token) { - if (token == null || token.isEmpty()) { - throw new CustomException(ErrorCode.INVALID_FCM_TOKEN); - } - - Member member = memberUtil.getCurrentMember(); - Optional existingTokenOptional = fcmRepository.findByToken(token); - - existingTokenOptional.ifPresent( - existingToken -> { - if (!existingToken.getMember().equals(member)) { - fcmRepository.delete(existingToken); - } - }); - - fcmRepository - .findByMember(member) - .ifPresentOrElse( - fcmToken -> fcmToken.updateToken(token), - () -> { - FcmToken fcmToken = new FcmToken(member, token); - fcmRepository.save(fcmToken); - }); - } -} diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmRepository.java b/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmTokenRepository.java similarity index 83% rename from src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmRepository.java rename to src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmTokenRepository.java index 820d5be2..017b1e86 100644 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmRepository.java +++ b/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmTokenRepository.java @@ -8,13 +8,12 @@ import java.util.Optional; import org.springframework.data.jpa.repository.JpaRepository; -public interface FcmRepository extends JpaRepository, FcmRepositoryCustom { +public interface FcmTokenRepository + extends JpaRepository, FcmTokenRepositoryCustom { Optional findByMember(Member member); Optional findByToken(String token); - List findAll(); - List findAllByMemberStatus(MemberStatus status); List findAllByUpdatedAtBefore(LocalDateTime cutoffDate); diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmRepositoryCustom.java b/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmTokenRepositoryCustom.java similarity index 71% rename from src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmRepositoryCustom.java rename to src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmTokenRepositoryCustom.java index 06a68945..43151257 100644 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmRepositoryCustom.java +++ b/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmTokenRepositoryCustom.java @@ -2,6 +2,6 @@ import java.util.List; -public interface FcmRepositoryCustom { +public interface FcmTokenRepositoryCustom { List findAllValidTokens(); } diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmRepositoryImpl.java b/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmTokenRepositoryImpl.java similarity index 93% rename from src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmRepositoryImpl.java rename to src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmTokenRepositoryImpl.java index a806ab68..b52f939d 100644 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmRepositoryImpl.java +++ b/src/main/java/com/depromeet/stonebed/domain/fcm/dao/FcmTokenRepositoryImpl.java @@ -10,7 +10,7 @@ import lombok.RequiredArgsConstructor; @RequiredArgsConstructor -public class FcmRepositoryImpl implements FcmRepositoryCustom { +public class FcmTokenRepositoryImpl implements FcmTokenRepositoryCustom { private final JPAQueryFactory jpaQueryFactory; diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/domain/FcmToken.java b/src/main/java/com/depromeet/stonebed/domain/fcm/domain/FcmToken.java index f4b685f6..d274c820 100644 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/domain/FcmToken.java +++ b/src/main/java/com/depromeet/stonebed/domain/fcm/domain/FcmToken.java @@ -10,6 +10,7 @@ import jakarta.persistence.JoinColumn; import jakarta.persistence.OneToOne; import lombok.AccessLevel; +import lombok.Builder; import lombok.Getter; import lombok.NoArgsConstructor; @@ -25,14 +26,19 @@ public class FcmToken extends BaseTimeEntity { @JoinColumn(name = "member_id", nullable = false) private Member member; - @Column(unique = true, nullable = true) + @Column(unique = true) private String token; + @Builder(access = AccessLevel.PRIVATE) public FcmToken(Member member, String token) { this.member = member; this.token = token; } + public static FcmToken createFcmToken(Member member, String token) { + return FcmToken.builder().member(member).token(token).build(); + } + public void updateToken(String token) { this.token = token; } diff --git a/src/main/java/com/depromeet/stonebed/global/config/security/WebSecurityConfig.java b/src/main/java/com/depromeet/stonebed/global/config/security/WebSecurityConfig.java index d4be9e6e..861821a1 100644 --- a/src/main/java/com/depromeet/stonebed/global/config/security/WebSecurityConfig.java +++ b/src/main/java/com/depromeet/stonebed/global/config/security/WebSecurityConfig.java @@ -5,9 +5,9 @@ import static org.springframework.http.HttpHeaders.*; import static org.springframework.security.config.Customizer.*; -import com.depromeet.stonebed.domain.auth.application.JwtTokenService; import com.depromeet.stonebed.global.annotation.ConditionalOnProfile; import com.depromeet.stonebed.global.filter.JwtAuthenticationFilter; +import com.depromeet.stonebed.global.security.JwtTokenProvider; import com.depromeet.stonebed.global.util.CookieUtil; import com.depromeet.stonebed.global.util.SpringEnvironmentUtil; import com.depromeet.stonebed.infra.properties.SwaggerProperties; @@ -34,7 +34,7 @@ @EnableWebSecurity @RequiredArgsConstructor public class WebSecurityConfig { - private final JwtTokenService jwtTokenService; + private final JwtTokenProvider jwtTokenProvider; private final CookieUtil cookieUtil; private final SpringEnvironmentUtil springEnvironmentUtil; @@ -69,7 +69,7 @@ public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Excepti response.setStatus(401))); http.addFilterBefore( - jwtAuthenticationFilter(jwtTokenService, cookieUtil), + jwtAuthenticationFilter(jwtTokenProvider, cookieUtil), UsernamePasswordAuthenticationFilter.class); return http.build(); @@ -123,7 +123,7 @@ public CorsConfigurationSource corsConfigurationSource() { @Bean public JwtAuthenticationFilter jwtAuthenticationFilter( - JwtTokenService jwtTokenService, CookieUtil cookieUtil) { - return new JwtAuthenticationFilter(jwtTokenService, cookieUtil); + JwtTokenProvider jwtTokenProvider, CookieUtil cookieUtil) { + return new JwtAuthenticationFilter(jwtTokenProvider, cookieUtil); } } diff --git a/src/main/java/com/depromeet/stonebed/global/config/sqs/SqsConfig.java b/src/main/java/com/depromeet/stonebed/global/config/sqs/SqsConfig.java index cb914b84..f84747b2 100644 --- a/src/main/java/com/depromeet/stonebed/global/config/sqs/SqsConfig.java +++ b/src/main/java/com/depromeet/stonebed/global/config/sqs/SqsConfig.java @@ -17,12 +17,12 @@ public class SqsConfig { @Bean public SqsClient sqsClient() { - AwsBasicCredentials awsCreds = + AwsBasicCredentials awsBasicCredentials = AwsBasicCredentials.create(sqsProperties.accessKey(), sqsProperties.secretKey()); return SqsClient.builder() .region(Region.of(sqsProperties.region())) - .credentialsProvider(StaticCredentialsProvider.create(awsCreds)) + .credentialsProvider(StaticCredentialsProvider.create(awsBasicCredentials)) .build(); } } diff --git a/src/main/java/com/depromeet/stonebed/global/config/swagger/SwaggerConfig.java b/src/main/java/com/depromeet/stonebed/global/config/swagger/SwaggerConfig.java index 34341e25..c6772f5d 100644 --- a/src/main/java/com/depromeet/stonebed/global/config/swagger/SwaggerConfig.java +++ b/src/main/java/com/depromeet/stonebed/global/config/swagger/SwaggerConfig.java @@ -7,6 +7,7 @@ import io.swagger.v3.oas.models.Components; import io.swagger.v3.oas.models.OpenAPI; import io.swagger.v3.oas.models.info.Info; +import io.swagger.v3.oas.models.info.License; import io.swagger.v3.oas.models.security.SecurityRequirement; import io.swagger.v3.oas.models.security.SecurityScheme; import io.swagger.v3.oas.models.servers.Server; @@ -20,6 +21,9 @@ @Configuration @RequiredArgsConstructor public class SwaggerConfig { + + private static final String SERVER_NAME = "WalWal"; + private static final String GITHUB_URL = "https://github.com/depromeet/WalWal-server"; private static final String PACKAGES_TO_SCAN = "com.depromeet.stonebed"; private static final String SWAGGER_API_TITLE = "WalWal 프로젝트 API 문서"; private static final String SWAGGER_API_DESCRIPTION = "WalWal 프로젝트 API 문서입니다."; @@ -36,11 +40,19 @@ public OpenAPI openAPI() { .servers(swaggerServers()) .addSecurityItem(securityRequirement()) .components(authSetting()) - .info( - new Info() - .title(SWAGGER_API_TITLE) - .version(apiVersion) - .description(SWAGGER_API_DESCRIPTION)); + .info(swaggerInfo()); + } + + private Info swaggerInfo() { + License license = new License(); + license.setUrl(GITHUB_URL); + license.setName(SERVER_NAME); + + return new Info() + .title(SWAGGER_API_TITLE) + .version("v" + apiVersion) + .description(SWAGGER_API_DESCRIPTION) + .license(license); } private String getServerUrl() { diff --git a/src/main/java/com/depromeet/stonebed/global/filter/JwtAuthenticationFilter.java b/src/main/java/com/depromeet/stonebed/global/filter/JwtAuthenticationFilter.java index 7320265a..5bf844ab 100644 --- a/src/main/java/com/depromeet/stonebed/global/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/depromeet/stonebed/global/filter/JwtAuthenticationFilter.java @@ -2,10 +2,10 @@ import static com.depromeet.stonebed.global.common.constants.SecurityConstants.*; -import com.depromeet.stonebed.domain.auth.application.JwtTokenService; import com.depromeet.stonebed.domain.auth.dto.AccessTokenDto; import com.depromeet.stonebed.domain.auth.dto.RefreshTokenDto; import com.depromeet.stonebed.domain.member.domain.MemberRole; +import com.depromeet.stonebed.global.security.JwtTokenProvider; import com.depromeet.stonebed.global.security.PrincipalDetails; import com.depromeet.stonebed.global.util.CookieUtil; import jakarta.servlet.FilterChain; @@ -29,7 +29,7 @@ @RequiredArgsConstructor public class JwtAuthenticationFilter extends OncePerRequestFilter { - private final JwtTokenService jwtTokenService; + private final JwtTokenProvider jwtTokenProvider; private final CookieUtil cookieUtil; private static String extractAccessTokenFromHeader(HttpServletRequest request) { @@ -51,7 +51,7 @@ protected void doFilterInternal( // 헤더에 AT가 있으면 우선적으로 검증 if (accessTokenHeaderValue != null) { AccessTokenDto accessTokenDto = - jwtTokenService.retrieveAccessToken(accessTokenHeaderValue); + jwtTokenProvider.retrieveAccessToken(accessTokenHeaderValue); if (accessTokenDto != null) { setAuthenticationToContext(accessTokenDto.memberId(), accessTokenDto.memberRole()); filterChain.doFilter(request, response); @@ -65,7 +65,7 @@ protected void doFilterInternal( return; } - AccessTokenDto accessTokenDto = jwtTokenService.retrieveAccessToken(accessTokenValue); + AccessTokenDto accessTokenDto = jwtTokenProvider.retrieveAccessToken(accessTokenValue); // AT가 유효하면 통과 if (accessTokenDto != null) { @@ -76,15 +76,15 @@ protected void doFilterInternal( // AT가 만료된 경우 AT 재발급, 만료되지 않은 경우 null 반환 Optional reissuedAccessToken = - Optional.ofNullable(jwtTokenService.reissueAccessTokenIfExpired(accessTokenValue)); + Optional.ofNullable(jwtTokenProvider.reissueAccessTokenIfExpired(accessTokenValue)); // RT 유효하면 파싱, 유효하지 않으면 null 반환 - RefreshTokenDto refreshTokenDto = jwtTokenService.retrieveRefreshToken(refreshTokenValue); + RefreshTokenDto refreshTokenDto = jwtTokenProvider.retrieveRefreshToken(refreshTokenValue); // AT가 만료되었고, RT가 유효하면 AT, RT 재발급 if (reissuedAccessToken.isPresent() && refreshTokenDto != null) { AccessTokenDto accessToken = reissuedAccessToken.get(); // 재발급된 AT RefreshTokenDto refreshToken = - jwtTokenService.createRefreshTokenDto(refreshTokenDto.memberId()); + jwtTokenProvider.createRefreshTokenDto(refreshTokenDto.memberId()); // 쿠키에 재발급된 AT, RT 저장 HttpHeaders httpHeaders = diff --git a/src/main/java/com/depromeet/stonebed/domain/auth/application/JwtTokenService.java b/src/main/java/com/depromeet/stonebed/global/security/JwtTokenProvider.java similarity index 98% rename from src/main/java/com/depromeet/stonebed/domain/auth/application/JwtTokenService.java rename to src/main/java/com/depromeet/stonebed/global/security/JwtTokenProvider.java index a601f018..ae563401 100644 --- a/src/main/java/com/depromeet/stonebed/domain/auth/application/JwtTokenService.java +++ b/src/main/java/com/depromeet/stonebed/global/security/JwtTokenProvider.java @@ -1,4 +1,4 @@ -package com.depromeet.stonebed.domain.auth.application; +package com.depromeet.stonebed.global.security; import static com.depromeet.stonebed.global.common.constants.SecurityConstants.*; @@ -17,7 +17,7 @@ @Service @RequiredArgsConstructor -public class JwtTokenService { +public class JwtTokenProvider { private final JwtUtil jwtUtil; private final RefreshTokenRepository refreshTokenRepository; diff --git a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledService.java b/src/main/java/com/depromeet/stonebed/scheduler/fcm/FcmScheduler.java similarity index 83% rename from src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledService.java rename to src/main/java/com/depromeet/stonebed/scheduler/fcm/FcmScheduler.java index 1a67977f..96e817eb 100644 --- a/src/main/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledService.java +++ b/src/main/java/com/depromeet/stonebed/scheduler/fcm/FcmScheduler.java @@ -1,6 +1,7 @@ -package com.depromeet.stonebed.domain.fcm.application; +package com.depromeet.stonebed.scheduler.fcm; -import com.depromeet.stonebed.domain.fcm.dao.FcmRepository; +import com.depromeet.stonebed.domain.fcm.application.FcmNotificationService; +import com.depromeet.stonebed.domain.fcm.dao.FcmTokenRepository; import com.depromeet.stonebed.domain.fcm.domain.FcmToken; import com.depromeet.stonebed.domain.member.domain.MemberStatus; import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordRepository; @@ -18,18 +19,17 @@ @Slf4j @Service @RequiredArgsConstructor -public class FcmScheduledService { - private final FcmTokenService fcmTokenService; +public class FcmScheduler { private final FcmNotificationService fcmNotificationService; - private final FcmRepository fcmRepository; + private final FcmTokenRepository fcmTokenRepository; private final MissionRecordRepository missionRecordRepository; // 매일 0시 0분에 실행 @Scheduled(cron = "0 0 0 * * ?") public void removeInactiveTokens() { LocalDateTime cutoffDate = LocalDateTime.now().minusMonths(2); - List inactiveTokens = fcmRepository.findAllByUpdatedAtBefore(cutoffDate); - fcmRepository.deleteAll(inactiveTokens); + List inactiveTokens = fcmTokenRepository.findAllByUpdatedAtBefore(cutoffDate); + fcmTokenRepository.deleteAll(inactiveTokens); log.info("비활성 토큰 {}개 삭제 완료", inactiveTokens.size()); } @@ -39,7 +39,7 @@ public void sendDailyNotification() { FcmNotificationConstants notificationConstants = FcmNotificationConstants.MISSION_START; String title = notificationConstants.getTitle(); String message = notificationConstants.getMessage(); - List tokens = fcmTokenService.getAllTokens(); + List tokens = fcmNotificationService.getAllTokens(); fcmNotificationService.sendAndNotifications(title, message, tokens); @@ -71,7 +71,7 @@ private List getIncompleteMissionTokens() { .map(missionRecord -> missionRecord.getMember().getId()) .collect(Collectors.toList()); - return fcmRepository.findAllByMemberStatus(MemberStatus.NORMAL).stream() + return fcmTokenRepository.findAllByMemberStatus(MemberStatus.NORMAL).stream() .filter(fcmToken -> !completedMemberIds.contains(fcmToken.getMember().getId())) .map(FcmToken::getToken) .collect(Collectors.toList()); diff --git a/src/main/java/com/depromeet/stonebed/domain/missionRecord/application/MissionRecordScheduledService.java b/src/main/java/com/depromeet/stonebed/scheduler/missionRecord/MissionRecordScheduler.java similarity index 68% rename from src/main/java/com/depromeet/stonebed/domain/missionRecord/application/MissionRecordScheduledService.java rename to src/main/java/com/depromeet/stonebed/scheduler/missionRecord/MissionRecordScheduler.java index f2201474..0131a3d7 100644 --- a/src/main/java/com/depromeet/stonebed/domain/missionRecord/application/MissionRecordScheduledService.java +++ b/src/main/java/com/depromeet/stonebed/scheduler/missionRecord/MissionRecordScheduler.java @@ -1,12 +1,13 @@ -package com.depromeet.stonebed.domain.missionRecord.application; +package com.depromeet.stonebed.scheduler.missionRecord; +import com.depromeet.stonebed.domain.missionRecord.application.MissionRecordService; import lombok.RequiredArgsConstructor; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; @Service @RequiredArgsConstructor -public class MissionRecordScheduledService { +public class MissionRecordScheduler { private final MissionRecordService missionRecordService; @Scheduled(cron = "0 0 0 * * ?") diff --git a/src/test/java/com/depromeet/stonebed/TestQuerydslConfig.java b/src/test/java/com/depromeet/stonebed/config/TestQuerydslConfig.java similarity index 93% rename from src/test/java/com/depromeet/stonebed/TestQuerydslConfig.java rename to src/test/java/com/depromeet/stonebed/config/TestQuerydslConfig.java index 19733c17..94d25e46 100644 --- a/src/test/java/com/depromeet/stonebed/TestQuerydslConfig.java +++ b/src/test/java/com/depromeet/stonebed/config/TestQuerydslConfig.java @@ -1,4 +1,4 @@ -package com.depromeet.stonebed; +package com.depromeet.stonebed.config; import com.querydsl.jpa.JPQLTemplates; import com.querydsl.jpa.impl.JPAQueryFactory; diff --git a/src/test/java/com/depromeet/stonebed/TestRedisConfig.java b/src/test/java/com/depromeet/stonebed/config/TestRedisConfig.java similarity index 92% rename from src/test/java/com/depromeet/stonebed/TestRedisConfig.java rename to src/test/java/com/depromeet/stonebed/config/TestRedisConfig.java index 265ea027..dab87fb9 100644 --- a/src/test/java/com/depromeet/stonebed/TestRedisConfig.java +++ b/src/test/java/com/depromeet/stonebed/config/TestRedisConfig.java @@ -1,4 +1,4 @@ -package com.depromeet.stonebed; +package com.depromeet.stonebed.config; import com.depromeet.stonebed.infra.config.redis.RedisConfig; import com.depromeet.stonebed.infra.properties.RedisProperties; diff --git a/src/test/java/com/depromeet/stonebed/domain/auth/application/AuthServiceTest.java b/src/test/java/com/depromeet/stonebed/domain/auth/application/AuthServiceTest.java index c92f2213..809c8bfe 100644 --- a/src/test/java/com/depromeet/stonebed/domain/auth/application/AuthServiceTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/auth/application/AuthServiceTest.java @@ -14,6 +14,7 @@ import com.depromeet.stonebed.domain.member.domain.MemberStatus; import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordBoostRepository; import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordRepository; +import com.depromeet.stonebed.global.security.JwtTokenProvider; import com.depromeet.stonebed.global.util.MemberUtil; import java.util.Optional; import org.junit.jupiter.api.BeforeEach; @@ -30,7 +31,7 @@ class AuthServiceTest extends FixtureMonkeySetUp { @InjectMocks private AuthService authService; - @Mock private JwtTokenService jwtTokenService; + @Mock private JwtTokenProvider jwtTokenProvider; @Mock private MemberRepository memberRepository; @@ -60,7 +61,7 @@ void setUp() { when(memberRepository.findByOauthInfoOauthProviderAndOauthInfoOauthId( provider.getValue(), oauthId)) .thenReturn(Optional.of(member)); - when(jwtTokenService.generateTokenPair(member.getId(), MemberRole.USER)) + when(jwtTokenProvider.generateTokenPair(member.getId(), MemberRole.USER)) .thenReturn(new TokenPairResponse("accessToken", "refreshToken")); // when @@ -78,7 +79,7 @@ void setUp() { when(memberRepository.findByOauthInfoOauthProviderAndOauthInfoOauthId( provider.getValue(), oauthId)) .thenReturn(Optional.of(member)); - when(jwtTokenService.generateTokenPair(member.getId(), MemberRole.USER)) + when(jwtTokenProvider.generateTokenPair(member.getId(), MemberRole.USER)) .thenReturn(new TokenPairResponse("accessToken", "refreshToken")); // when @@ -99,7 +100,7 @@ void setUp() { provider.getValue(), oauthId)) .thenReturn(Optional.empty()); when(memberRepository.save(any(Member.class))).thenReturn(newMember); - when(jwtTokenService.generateTemporaryTokenPair(any(Member.class))) + when(jwtTokenProvider.generateTemporaryTokenPair(any(Member.class))) .thenReturn(temporaryTokenPair); // when @@ -111,7 +112,7 @@ void setUp() { assertEquals("refreshToken", response.refreshToken()); assertTrue(response.isTemporaryToken()); verify(memberRepository).save(any(Member.class)); - verify(jwtTokenService).generateTemporaryTokenPair(any(Member.class)); + verify(jwtTokenProvider).generateTemporaryTokenPair(any(Member.class)); } @Test @@ -147,7 +148,7 @@ void setUp() { assertEquals("", member.getProfile().getNickname()); // jwtTokenService에서 리프레시 토큰 삭제가 호출되었는지 확인 - verify(jwtTokenService).deleteRefreshToken(member.getId()); + verify(jwtTokenProvider).deleteRefreshToken(member.getId()); // MemberStatus가 DELETED로 변경되었는지 확인 assertEquals(MemberStatus.DELETED, member.getStatus()); diff --git a/src/test/java/com/depromeet/stonebed/domain/auth/application/JwtTokenServiceTest.java b/src/test/java/com/depromeet/stonebed/domain/auth/application/JwtTokenProviderTest.java similarity index 86% rename from src/test/java/com/depromeet/stonebed/domain/auth/application/JwtTokenServiceTest.java rename to src/test/java/com/depromeet/stonebed/domain/auth/application/JwtTokenProviderTest.java index 4202d590..90354e78 100644 --- a/src/test/java/com/depromeet/stonebed/domain/auth/application/JwtTokenServiceTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/auth/application/JwtTokenProviderTest.java @@ -12,6 +12,7 @@ import com.depromeet.stonebed.domain.auth.dto.response.TokenPairResponse; import com.depromeet.stonebed.domain.member.domain.Member; import com.depromeet.stonebed.domain.member.domain.MemberRole; +import com.depromeet.stonebed.global.security.JwtTokenProvider; import com.depromeet.stonebed.global.util.JwtUtil; import io.jsonwebtoken.ExpiredJwtException; import java.util.Optional; @@ -24,9 +25,9 @@ @ActiveProfiles("test") @ExtendWith(MockitoExtension.class) -class JwtTokenServiceTest extends FixtureMonkeySetUp { +class JwtTokenProviderTest extends FixtureMonkeySetUp { - @InjectMocks private JwtTokenService jwtTokenService; + @InjectMocks private JwtTokenProvider jwtTokenProvider; @Mock private JwtUtil jwtUtil; @Mock private RefreshTokenRepository refreshTokenRepository; @@ -43,7 +44,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { when(jwtUtil.generateRefreshToken(memberId)).thenReturn(refreshToken); // when - TokenPairResponse tokenPair = jwtTokenService.generateTokenPair(memberId, memberRole); + TokenPairResponse tokenPair = jwtTokenProvider.generateTokenPair(memberId, memberRole); // then assertNotNull(tokenPair); @@ -63,7 +64,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { when(jwtUtil.generateRefreshToken(temporaryMember.getId())).thenReturn(refreshToken); // when - TokenPairResponse tokenPair = jwtTokenService.generateTemporaryTokenPair(temporaryMember); + TokenPairResponse tokenPair = jwtTokenProvider.generateTemporaryTokenPair(temporaryMember); // then assertNotNull(tokenPair); @@ -81,7 +82,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { .thenReturn(new AccessTokenDto(memberId, memberRole, tokenValue)); // when - AccessTokenDto accessTokenDto = jwtTokenService.createAccessTokenDto(memberId, memberRole); + AccessTokenDto accessTokenDto = jwtTokenProvider.createAccessTokenDto(memberId, memberRole); // then assertNotNull(accessTokenDto); @@ -101,7 +102,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { when(jwtUtil.parseAccessToken(accessTokenValue)).thenReturn(accessTokenDto); // when - AccessTokenDto result = jwtTokenService.retrieveAccessToken(accessTokenValue); + AccessTokenDto result = jwtTokenProvider.retrieveAccessToken(accessTokenValue); // then assertNotNull(result); @@ -120,7 +121,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { .thenReturn(Optional.of(refreshToken)); // when - RefreshTokenDto result = jwtTokenService.retrieveRefreshToken(refreshTokenValue); + RefreshTokenDto result = jwtTokenProvider.retrieveRefreshToken(refreshTokenValue); // then assertNotNull(result); @@ -134,7 +135,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { when(jwtUtil.parseAccessToken(accessTokenValue)).thenThrow(new RuntimeException()); // when - AccessTokenDto result = jwtTokenService.retrieveAccessToken(accessTokenValue); + AccessTokenDto result = jwtTokenProvider.retrieveAccessToken(accessTokenValue); // then assertNull(result); @@ -151,7 +152,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { .thenReturn(Optional.empty()); // when - RefreshTokenDto result = jwtTokenService.retrieveRefreshToken(refreshTokenValue); + RefreshTokenDto result = jwtTokenProvider.retrieveRefreshToken(refreshTokenValue); // then assertNull(result); @@ -165,7 +166,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { .thenReturn(new AccessTokenDto(1L, MemberRole.USER, accessTokenValue)); // when - AccessTokenDto result = jwtTokenService.reissueAccessTokenIfExpired(accessTokenValue); + AccessTokenDto result = jwtTokenProvider.reissueAccessTokenIfExpired(accessTokenValue); // then assertNull(result); @@ -182,7 +183,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { when(jwtUtil.generateRefreshTokenDto(memberId)).thenReturn(refreshTokenDto); // when - RefreshTokenDto result = jwtTokenService.createRefreshTokenDto(memberId); + RefreshTokenDto result = jwtTokenProvider.createRefreshTokenDto(memberId); // then assertNotNull(result); @@ -208,7 +209,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { when(jwtUtil.generateAccessTokenDto(memberId, memberRole)).thenReturn(accessTokenDto); // when - AccessTokenDto result = jwtTokenService.reissueAccessTokenIfExpired(accessTokenValue); + AccessTokenDto result = jwtTokenProvider.reissueAccessTokenIfExpired(accessTokenValue); // then assertNotNull(result); @@ -221,7 +222,7 @@ class JwtTokenServiceTest extends FixtureMonkeySetUp { Long memberId = fixtureMonkey.giveMeOne(Long.class); // when - jwtTokenService.deleteRefreshToken(memberId); + jwtTokenProvider.deleteRefreshToken(memberId); // then verify(refreshTokenRepository).deleteById(memberId); diff --git a/src/test/java/com/depromeet/stonebed/domain/auth/dao/RefreshTokenRepositoryTest.java b/src/test/java/com/depromeet/stonebed/domain/auth/dao/RefreshTokenRepositoryTest.java index df2b6e74..31dac9fa 100644 --- a/src/test/java/com/depromeet/stonebed/domain/auth/dao/RefreshTokenRepositoryTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/auth/dao/RefreshTokenRepositoryTest.java @@ -2,7 +2,7 @@ import static org.junit.jupiter.api.Assertions.*; -import com.depromeet.stonebed.TestRedisConfig; +import com.depromeet.stonebed.config.TestRedisConfig; import com.depromeet.stonebed.domain.auth.domain.RefreshToken; import java.util.Optional; import org.junit.jupiter.api.AfterEach; diff --git a/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationServiceTest.java b/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationServiceTest.java index 284fa1f7..c6f4356c 100644 --- a/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationServiceTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmNotificationServiceTest.java @@ -5,13 +5,11 @@ import com.depromeet.stonebed.FixtureMonkeySetUp; import com.depromeet.stonebed.domain.fcm.dao.FcmNotificationRepository; -import com.depromeet.stonebed.domain.fcm.dao.FcmRepository; import com.depromeet.stonebed.domain.fcm.domain.FcmNotification; import com.depromeet.stonebed.domain.fcm.domain.FcmNotificationType; import com.depromeet.stonebed.domain.fcm.dto.response.FcmNotificationResponse; import com.depromeet.stonebed.domain.member.dao.MemberRepository; import com.depromeet.stonebed.domain.member.domain.Member; -import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordBoostRepository; import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordRepository; import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord; import com.depromeet.stonebed.global.error.ErrorCode; @@ -34,8 +32,6 @@ public class FcmNotificationServiceTest extends FixtureMonkeySetUp { @Mock private FcmNotificationRepository notificationRepository; @Mock private MissionRecordRepository missionRecordRepository; - @Mock private MissionRecordBoostRepository missionRecordBoostRepository; - @Mock private FcmRepository fcmRepository; @Mock private MemberRepository memberRepository; @Mock private MemberUtil memberUtil; diff --git a/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledServiceTest.java b/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmSchedulerTest.java similarity index 81% rename from src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledServiceTest.java rename to src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmSchedulerTest.java index ce2bdfa7..069f80e3 100644 --- a/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmScheduledServiceTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/fcm/application/FcmSchedulerTest.java @@ -4,12 +4,13 @@ import static org.mockito.Mockito.*; import com.depromeet.stonebed.FixtureMonkeySetUp; -import com.depromeet.stonebed.domain.fcm.dao.FcmRepository; +import com.depromeet.stonebed.domain.fcm.dao.FcmTokenRepository; import com.depromeet.stonebed.domain.fcm.domain.FcmToken; import com.depromeet.stonebed.domain.member.domain.MemberStatus; import com.depromeet.stonebed.domain.missionRecord.dao.MissionRecordRepository; import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecord; import com.depromeet.stonebed.domain.missionRecord.domain.MissionRecordStatus; +import com.depromeet.stonebed.scheduler.fcm.FcmScheduler; import java.time.LocalDate; import java.time.LocalDateTime; import java.util.List; @@ -24,42 +25,42 @@ @ActiveProfiles("test") @ExtendWith(MockitoExtension.class) -public class FcmScheduledServiceTest extends FixtureMonkeySetUp { +public class FcmSchedulerTest extends FixtureMonkeySetUp { @Mock private FcmNotificationService fcmNotificationService; - @Mock private FcmRepository fcmRepository; - @Mock private FcmTokenService fcmTokenService; + @Mock private FcmTokenRepository fcmTokenRepository; @Mock private MissionRecordRepository missionRecordRepository; - @InjectMocks private FcmScheduledService fcmScheduledService; + @InjectMocks private FcmScheduler fcmScheduler; @Test void 비활성화된_토큰을_삭제하면_정상적으로_삭제된다() { // given List tokens = fixtureMonkey.giveMe(FcmToken.class, 5); - when(fcmRepository.findAllByUpdatedAtBefore(any(LocalDateTime.class))).thenReturn(tokens); + when(fcmTokenRepository.findAllByUpdatedAtBefore(any(LocalDateTime.class))) + .thenReturn(tokens); // when - fcmScheduledService.removeInactiveTokens(); + fcmScheduler.removeInactiveTokens(); // then ArgumentCaptor captor = ArgumentCaptor.forClass(LocalDateTime.class); - verify(fcmRepository).findAllByUpdatedAtBefore(captor.capture()); + verify(fcmTokenRepository).findAllByUpdatedAtBefore(captor.capture()); LocalDateTime actualCutoffDate = captor.getValue(); assertNotNull(actualCutoffDate); assertTrue(actualCutoffDate.isBefore(LocalDateTime.now())); - verify(fcmRepository).deleteAll(tokens); + verify(fcmTokenRepository).deleteAll(tokens); } @Test void 매일_정기_알림을_모든_사용자에게_전송하고_저장한다() { // given List tokens = fixtureMonkey.giveMe(String.class, 5); - when(fcmTokenService.getAllTokens()).thenReturn(tokens); + when(fcmNotificationService.getAllTokens()).thenReturn(tokens); // when - fcmScheduledService.sendDailyNotification(); + fcmScheduler.sendDailyNotification(); // then verify(fcmNotificationService, times(1)) @@ -90,7 +91,7 @@ public class FcmScheduledServiceTest extends FixtureMonkeySetUp { .collect(Collectors.toList())); List allTokens = fixtureMonkey.giveMe(FcmToken.class, 5); - when(fcmRepository.findAllByMemberStatus(MemberStatus.NORMAL)).thenReturn(allTokens); + when(fcmTokenRepository.findAllByMemberStatus(MemberStatus.NORMAL)).thenReturn(allTokens); List tokens = allTokens.stream() @@ -99,7 +100,7 @@ public class FcmScheduledServiceTest extends FixtureMonkeySetUp { .collect(Collectors.toList()); // when - fcmScheduledService.sendReminderToIncompleteMissions(); + fcmScheduler.sendReminderToIncompleteMissions(); // then verify(fcmNotificationService, times(1)) diff --git a/src/test/java/com/depromeet/stonebed/domain/mission/dao/MissionHistoryRepositoryTest.java b/src/test/java/com/depromeet/stonebed/domain/mission/dao/MissionHistoryRepositoryTest.java index fff6c4f8..b1b144f1 100644 --- a/src/test/java/com/depromeet/stonebed/domain/mission/dao/MissionHistoryRepositoryTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/mission/dao/MissionHistoryRepositoryTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.assertThat; -import com.depromeet.stonebed.TestQuerydslConfig; +import com.depromeet.stonebed.config.TestQuerydslConfig; import com.depromeet.stonebed.domain.member.domain.RaisePet; import com.depromeet.stonebed.domain.mission.domain.Mission; import com.depromeet.stonebed.domain.missionHistory.dao.MissionHistoryRepository; diff --git a/src/test/java/com/depromeet/stonebed/domain/mission/dao/MissionRepositoryTest.java b/src/test/java/com/depromeet/stonebed/domain/mission/dao/MissionRepositoryTest.java index 2a77c2fb..8b51f518 100644 --- a/src/test/java/com/depromeet/stonebed/domain/mission/dao/MissionRepositoryTest.java +++ b/src/test/java/com/depromeet/stonebed/domain/mission/dao/MissionRepositoryTest.java @@ -2,7 +2,7 @@ import static org.assertj.core.api.Assertions.*; -import com.depromeet.stonebed.TestQuerydslConfig; +import com.depromeet.stonebed.config.TestQuerydslConfig; import com.depromeet.stonebed.domain.member.domain.RaisePet; import com.depromeet.stonebed.domain.mission.domain.Mission; import org.junit.jupiter.api.Test; diff --git a/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/Order.java b/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/Order.java deleted file mode 100644 index 247171d9..00000000 --- a/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/Order.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.depromeet.stonebed.fixtureMonkeyTest; - -import jakarta.validation.constraints.Max; -import jakarta.validation.constraints.Min; -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.PastOrPresent; -import jakarta.validation.constraints.Size; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import lombok.Data; - -@Data -public class Order { - @NotNull private Long id; - - @NotBlank private String orderNo; - - private OrderType orderType; - - @Size(min = 2, max = 10) - private String productName; - - @Min(1) - @Max(100) - private int quantity; - - @Min(0) - private long price; - - private long totalPrice; - - private List<@NotBlank @Size(max = 10) String> items = new ArrayList<>(); - - @PastOrPresent private Instant orderedAt; - - public enum OrderType { - SMARTSTORE, - BLOG, - CAFE, - } -} diff --git a/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/TestFixtureMonkey.java b/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/TestFixtureMonkey.java deleted file mode 100644 index 037d6839..00000000 --- a/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/TestFixtureMonkey.java +++ /dev/null @@ -1,98 +0,0 @@ -package com.depromeet.stonebed.fixtureMonkeyTest; - -import static org.assertj.core.api.BDDAssertions.*; - -import com.depromeet.stonebed.domain.fcm.application.FcmNotificationService; -import com.depromeet.stonebed.domain.sqs.application.SqsMessageService; -import com.google.firebase.messaging.FirebaseMessaging; -import com.navercorp.fixturemonkey.FixtureMonkey; -import com.navercorp.fixturemonkey.api.introspector.FieldReflectionArbitraryIntrospector; -import io.awspring.cloud.autoconfigure.sqs.SqsAutoConfiguration; -import net.jqwik.api.Arbitraries; -import org.junit.jupiter.api.Test; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.ActiveProfiles; -import software.amazon.awssdk.services.sqs.SqsClient; - -@EnableAutoConfiguration(exclude = {SqsAutoConfiguration.class}) -@SpringBootTest -@ActiveProfiles("test") -class TestFixtureMonkey { - - @MockBean private FirebaseMessaging firebaseMessaging; - @MockBean private FcmNotificationService fcmNotificationService; - @MockBean private SqsMessageService sqsMessageService; - @MockBean private SqsClient sqsClient; - - @Test - void checkPerson() { - // given - FixtureMonkey sut = - FixtureMonkey.builder() - .objectIntrospector(FieldReflectionArbitraryIntrospector.INSTANCE) - .defaultNotNull(true) - .build(); - - // when - User person = - sut.giveMeBuilder(User.class) - .set("personId", Arbitraries.strings().ofMinLength(1).ofMaxLength(16)) - .set("personName", Arbitraries.strings().ofMinLength(1).ofMaxLength(16)) - .set("age", Arbitraries.integers().between(1, 100)) - .set("personNo", Arbitraries.strings().ofMinLength(1).ofMaxLength(16)) - .set( - "addressList", - Arbitraries.strings() - .ofMaxLength(16) - .list() - .ofMinSize(1) - .ofMaxSize(2)) - .sample(); - - // then - then(person.getPersonId()).isNotNull(); - then(person.getPersonNo().length()).isBetween(1, 16); - } - - @Test - void testOrder() { - // given - FixtureMonkey sut = - FixtureMonkey.builder() - .objectIntrospector(FieldReflectionArbitraryIntrospector.INSTANCE) - .defaultNotNull(true) - .build(); - - // when - Order actual = - sut.giveMeBuilder(Order.class) - .set( - "orderNo", - Arbitraries.strings() - .ofMinLength(1) - .ofMaxLength(16) - .map(it -> "orderNo-" + it)) - .set("productName", Arbitraries.strings().ofMinLength(2).ofMaxLength(10)) - .set("price", Arbitraries.longs().between(0, 1000)) - .set("quantity", Arbitraries.integers().between(1, 100)) - .set( - "items", - Arbitraries.strings() - .ofMaxLength(10) - .list() - .ofMinSize(1) - .ofMaxSize(2)) - .sample(); - - // then - then(actual.getId()).isNotNull(); // @NotNull - then(actual.getOrderNo()).isNotBlank(); // @NotBlank - then(actual.getProductName().length()).isBetween(2, 10); // @Size(min = 2, max = 10) - then(actual.getQuantity()).isBetween(1, 100); // Min(1) @Max(100) - then(actual.getPrice()).isGreaterThanOrEqualTo(0); // @Min(0) - then(actual.getItems()).hasSizeLessThan(3); // @Size(max = 3) - then(actual.getItems()).allMatch(it -> it.length() <= 10); // @NotBlank @Size(max = 10) - } -} diff --git a/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/User.java b/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/User.java deleted file mode 100644 index 069aa5fb..00000000 --- a/src/test/java/com/depromeet/stonebed/fixtureMonkeyTest/User.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.depromeet.stonebed.fixtureMonkeyTest; - -import jakarta.validation.constraints.NotBlank; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; -import java.util.List; -import lombok.Data; - -@Data -public class User { - - @NotNull private String personId; - - @NotBlank private String personName; - - private Gender gender; - - @Size(min = 1, max = 16) - private String personNo; - - @Size(min = 1, max = 16) - private int age; - - private List addressList; - - public enum Gender { - MAN, - WOMAN - } -}