From b89244010b6c0c1a709f98a429af705998056e34 Mon Sep 17 00:00:00 2001 From: queenriwon Date: Fri, 28 Mar 2025 22:39:51 +0900 Subject: [PATCH 1/4] =?UTF-8?q?refactor(global):=20=EB=8D=94=EB=AF=B8?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=83=9D=EC=84=B1=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 수정한 것 - 더미데이터 랜덤수 생성을 리팩토링 --- .../auth/controller/AuthController.java | 4 +- .../domain/product/entity/Product.java | 4 + .../product/service/ProductService.java | 2 + .../eightyage/domain/user/entity/User.java | 1 + .../user/repository/UserBulkRepository.java | 5 +- .../domain/user/service/UserService.java | 2 +- .../user/{entity => userrole}/UserRole.java | 2 +- .../eightyage/global/dto/AuthUser.java | 2 +- .../filter/JwtAuthenticationFilter.java | 2 +- .../eightyage/global/util/JwtUtil.java | 2 +- .../eightyage/bulk/ProductBulkTest.java | 131 ++++++++++-------- .../eightyage/bulk/ReviewBulkTest.java | 121 ++++++++-------- .../example/eightyage/bulk/UserBulkTest.java | 127 ++++++++--------- .../domain/auth/service/AuthServiceTest.java | 2 +- .../domain/auth/service/TokenServiceTest.java | 2 +- .../domain/user/service/UserServiceTest.java | 2 +- src/test/resources/application-test.yml | 21 ++- 17 files changed, 235 insertions(+), 197 deletions(-) rename src/main/java/com/example/eightyage/domain/user/{entity => userrole}/UserRole.java (94%) diff --git a/src/main/java/com/example/eightyage/domain/auth/controller/AuthController.java b/src/main/java/com/example/eightyage/domain/auth/controller/AuthController.java index 9ae8d48..99693ec 100644 --- a/src/main/java/com/example/eightyage/domain/auth/controller/AuthController.java +++ b/src/main/java/com/example/eightyage/domain/auth/controller/AuthController.java @@ -13,8 +13,8 @@ import org.springframework.security.access.annotation.Secured; import org.springframework.web.bind.annotation.*; -import static com.example.eightyage.domain.user.entity.UserRole.Authority.ADMIN; -import static com.example.eightyage.domain.user.entity.UserRole.Authority.USER; +import static com.example.eightyage.domain.user.userrole.UserRole.Authority.ADMIN; +import static com.example.eightyage.domain.user.userrole.UserRole.Authority.USER; @RestController @RequiredArgsConstructor diff --git a/src/main/java/com/example/eightyage/domain/product/entity/Product.java b/src/main/java/com/example/eightyage/domain/product/entity/Product.java index 5f061f9..10587ef 100644 --- a/src/main/java/com/example/eightyage/domain/product/entity/Product.java +++ b/src/main/java/com/example/eightyage/domain/product/entity/Product.java @@ -41,6 +41,10 @@ public class Product extends TimeStamped { @Temporal(TemporalType.TIMESTAMP) private LocalDateTime deletedAt; + public Product(Long id) { + this.id = id; + } + @Builder public Product(String name, Category category, String content, Integer price, SaleState saleState) { this.name = name; diff --git a/src/main/java/com/example/eightyage/domain/product/service/ProductService.java b/src/main/java/com/example/eightyage/domain/product/service/ProductService.java index 052a4a0..29d4ec8 100644 --- a/src/main/java/com/example/eightyage/domain/product/service/ProductService.java +++ b/src/main/java/com/example/eightyage/domain/product/service/ProductService.java @@ -148,4 +148,6 @@ public Product findProductByIdOrElseThrow(Long productId) { () -> new NotFoundException("해당 제품이 존재하지 않습니다.") ); } + + } diff --git a/src/main/java/com/example/eightyage/domain/user/entity/User.java b/src/main/java/com/example/eightyage/domain/user/entity/User.java index 5847eec..c857965 100644 --- a/src/main/java/com/example/eightyage/domain/user/entity/User.java +++ b/src/main/java/com/example/eightyage/domain/user/entity/User.java @@ -1,5 +1,6 @@ package com.example.eightyage.domain.user.entity; +import com.example.eightyage.domain.user.userrole.UserRole; import com.example.eightyage.global.dto.AuthUser; import com.example.eightyage.global.entity.TimeStamped; import jakarta.persistence.*; diff --git a/src/main/java/com/example/eightyage/domain/user/repository/UserBulkRepository.java b/src/main/java/com/example/eightyage/domain/user/repository/UserBulkRepository.java index 2a861c0..8c953a3 100644 --- a/src/main/java/com/example/eightyage/domain/user/repository/UserBulkRepository.java +++ b/src/main/java/com/example/eightyage/domain/user/repository/UserBulkRepository.java @@ -17,15 +17,12 @@ public class UserBulkRepository { private final int BATCH_SIZE = 1000; public void bulkInsertUsers(List users) { - String sql = "INSERT INTO user (email, password, nickname, deleted_at) values (?, ?, ?, ?)"; - - Random random = new Random(); + String sql = "INSERT INTO user (email, password, nickname) values (?, ?, ?)"; jdbcTemplate.batchUpdate(sql, users, BATCH_SIZE, (ps, argument) -> { ps.setString(1, argument.getEmail()); ps.setString(2, argument.getPassword()); ps.setString(3, argument.getNickname()); - ps.setString(4, random.nextBoolean() ? null : LocalDateTime.now().toString()); // 랜덤으로 유저 삭제 }); } } diff --git a/src/main/java/com/example/eightyage/domain/user/service/UserService.java b/src/main/java/com/example/eightyage/domain/user/service/UserService.java index fc18d0c..8840f3d 100644 --- a/src/main/java/com/example/eightyage/domain/user/service/UserService.java +++ b/src/main/java/com/example/eightyage/domain/user/service/UserService.java @@ -2,7 +2,7 @@ import com.example.eightyage.domain.user.dto.request.UserDeleteRequestDto; import com.example.eightyage.domain.user.entity.User; -import com.example.eightyage.domain.user.entity.UserRole; +import com.example.eightyage.domain.user.userrole.UserRole; import com.example.eightyage.domain.user.repository.UserRepository; import com.example.eightyage.global.dto.AuthUser; import com.example.eightyage.global.exception.BadRequestException; diff --git a/src/main/java/com/example/eightyage/domain/user/entity/UserRole.java b/src/main/java/com/example/eightyage/domain/user/userrole/UserRole.java similarity index 94% rename from src/main/java/com/example/eightyage/domain/user/entity/UserRole.java rename to src/main/java/com/example/eightyage/domain/user/userrole/UserRole.java index 7f92a4f..49b1fb1 100644 --- a/src/main/java/com/example/eightyage/domain/user/entity/UserRole.java +++ b/src/main/java/com/example/eightyage/domain/user/userrole/UserRole.java @@ -1,4 +1,4 @@ -package com.example.eightyage.domain.user.entity; +package com.example.eightyage.domain.user.userrole; import com.example.eightyage.global.exception.UnauthorizedException; import lombok.Getter; diff --git a/src/main/java/com/example/eightyage/global/dto/AuthUser.java b/src/main/java/com/example/eightyage/global/dto/AuthUser.java index 022a0d4..07f565e 100644 --- a/src/main/java/com/example/eightyage/global/dto/AuthUser.java +++ b/src/main/java/com/example/eightyage/global/dto/AuthUser.java @@ -1,6 +1,6 @@ package com.example.eightyage.global.dto; -import com.example.eightyage.domain.user.entity.UserRole; +import com.example.eightyage.domain.user.userrole.UserRole; import lombok.Builder; import lombok.Getter; import org.springframework.security.core.GrantedAuthority; diff --git a/src/main/java/com/example/eightyage/global/filter/JwtAuthenticationFilter.java b/src/main/java/com/example/eightyage/global/filter/JwtAuthenticationFilter.java index 1e626ec..dccf118 100644 --- a/src/main/java/com/example/eightyage/global/filter/JwtAuthenticationFilter.java +++ b/src/main/java/com/example/eightyage/global/filter/JwtAuthenticationFilter.java @@ -1,6 +1,6 @@ package com.example.eightyage.global.filter; -import com.example.eightyage.domain.user.entity.UserRole; +import com.example.eightyage.domain.user.userrole.UserRole; import com.example.eightyage.global.config.JwtAuthenticationToken; import com.example.eightyage.global.util.JwtUtil; import com.example.eightyage.global.dto.AuthUser; diff --git a/src/main/java/com/example/eightyage/global/util/JwtUtil.java b/src/main/java/com/example/eightyage/global/util/JwtUtil.java index 8547e15..1716dd0 100644 --- a/src/main/java/com/example/eightyage/global/util/JwtUtil.java +++ b/src/main/java/com/example/eightyage/global/util/JwtUtil.java @@ -4,7 +4,7 @@ import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import io.jsonwebtoken.security.Keys; -import com.example.eightyage.domain.user.entity.UserRole; +import com.example.eightyage.domain.user.userrole.UserRole; import jakarta.annotation.PostConstruct; import lombok.extern.slf4j.Slf4j; import org.springframework.beans.factory.annotation.Value; diff --git a/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java b/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java index 3b2584c..99df7d3 100644 --- a/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java @@ -1,61 +1,70 @@ -//package com.example.eightyage.bulk; -// -//import com.example.eightyage.domain.product.entity.Product; -//import com.example.eightyage.domain.product.repository.ProductBulkRepository; -//import org.junit.jupiter.api.Test; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.test.context.ActiveProfiles; -// -//import java.util.ArrayList; -//import java.util.List; -//import java.util.UUID; -// -//@SpringBootTest -//@ActiveProfiles("ci") -//public class ProductBulkTest { -// -// @Autowired -// private ProductBulkRepository productBulkRepository; -// -// @Test -// void 제품_더미데이터_생성() { -// -// int insertCount; -// -// if ("ci".equals(System.getProperty("spring.profiles.active"))) { -// insertCount = 100; // CI에서는 데이터 적게 -// } else { -// insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 -// } -// -// List batchList = new ArrayList<>(); -// -// for (int i = 0; i < insertCount; i++) { -// Product product = Product.builder() -// .name(UUID.randomUUID().toString()) -// .build(); -// batchList.add(product); -// -// if (batchList.size() == insertCount) { -// productBulkRepository.bulkInsertProduct(batchList); -// batchList.clear(); -// -// sleep(500); -// } -// } -// -// if (!batchList.isEmpty()) { -// productBulkRepository.bulkInsertProduct(batchList); -// batchList.clear(); -// } -// } -// -// private static void sleep(int millis) { -// try { -// Thread.sleep(millis); -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// } -//} +package com.example.eightyage.bulk; + +import com.example.eightyage.domain.product.entity.Category; +import com.example.eightyage.domain.product.entity.Product; +import com.example.eightyage.domain.product.entity.SaleState; +import com.example.eightyage.domain.product.repository.ProductBulkRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; +import java.util.UUID; + +@SpringBootTest +@ActiveProfiles("ci") +public class ProductBulkTest { + + @Autowired + private ProductBulkRepository productBulkRepository; + + @Test + void 제품_더미데이터_생성() { + + int insertCount; + + if ("ci".equals(System.getProperty("spring.profiles.active"))) { + insertCount = 100; // CI에서는 데이터 적게 + } else { + insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 + } + + Random random = new Random(); + + List batchList = new ArrayList<>(); + + for (int i = 0; i < insertCount; i++) { + Category randomCategory = Category.values()[random.nextInt(Category.values().length)]; + Product product = Product.builder() + .category(randomCategory) + .name(UUID.randomUUID().toString()) + .saleState(random.nextBoolean() ? SaleState.FOR_SALE : SaleState.SOLD_OUT) + .build(); + + batchList.add(product); + + if (batchList.size() == insertCount) { + productBulkRepository.bulkInsertProduct(batchList); + batchList.clear(); + + sleep(500); + } + } + + if (!batchList.isEmpty()) { + productBulkRepository.bulkInsertProduct(batchList); + batchList.clear(); + } + } + + private static void sleep(int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java b/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java index ebd86aa..458d2c0 100644 --- a/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java @@ -1,58 +1,65 @@ -//package com.example.eightyage.bulk; -// -//import com.example.eightyage.domain.review.entity.Review; -//import com.example.eightyage.domain.review.repository.ReviewBulkRepository; -//import org.junit.jupiter.api.Test; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.test.context.ActiveProfiles; -// -//import java.util.ArrayList; -//import java.util.List; -// -//@SpringBootTest -//@ActiveProfiles("ci") -//public class ReviewBulkTest { -// -// @Autowired -// private ReviewBulkRepository reviewBulkRepository; -// -// @Test -// void 리뷰_더미데이터_생성() { -// -// int insertCount; -// -// if ("ci".equals(System.getProperty("spring.profiles.active"))) { -// insertCount = 100; // CI에서는 데이터 적게 -// } else { -// insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 -// } -// -// List batchList = new ArrayList<>(); -// -// for (int i = 0; i < insertCount; i++) { -// Review review = new Review(); -// batchList.add(review); -// -// if (batchList.size() == insertCount) { -// reviewBulkRepository.bulkInsertReviews(batchList); -// batchList.clear(); -// +package com.example.eightyage.bulk; + +import com.example.eightyage.domain.product.entity.Product; +import com.example.eightyage.domain.review.entity.Review; +import com.example.eightyage.domain.review.repository.ReviewBulkRepository; +import com.example.eightyage.domain.user.entity.User; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import java.util.ArrayList; +import java.util.List; +import java.util.Random; + +@SpringBootTest +@ActiveProfiles("ci") +public class ReviewBulkTest { + + @Autowired + private ReviewBulkRepository reviewBulkRepository; + + @Test + void 리뷰_더미데이터_생성() { + + int insertCount; + + if ("ci".equals(System.getProperty("spring.profiles.active"))) { + insertCount = 100; // CI에서는 데이터 적게 + } else { + insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 + } + + Random random = new Random(); + List batchList = new ArrayList<>(); + + for (int i = 0; i < insertCount; i++) { + User user = User.builder().id(1L).build(); + Product product = new Product((long) (random.nextInt(100) + 1)); + + Review review = new Review(user, product, random.nextDouble() * 5, "content" + i); + batchList.add(review); + + if (batchList.size() == insertCount) { + reviewBulkRepository.bulkInsertReviews(batchList); + batchList.clear(); + // sleep(500); -// } -// } -// -// if (!batchList.isEmpty()) { -// reviewBulkRepository.bulkInsertReviews(batchList); -// batchList.clear(); -// } -// } -// -// private static void sleep(int millis) { -// try { -// Thread.sleep(millis); -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// } -//} + } + } + + if (!batchList.isEmpty()) { + reviewBulkRepository.bulkInsertReviews(batchList); + batchList.clear(); + } + } + + private static void sleep(int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/test/java/com/example/eightyage/bulk/UserBulkTest.java b/src/test/java/com/example/eightyage/bulk/UserBulkTest.java index 084b16f..ae2799f 100644 --- a/src/test/java/com/example/eightyage/bulk/UserBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/UserBulkTest.java @@ -1,64 +1,65 @@ -//package com.example.eightyage.bulk; -// -//import com.example.eightyage.domain.user.entity.User; -//import com.example.eightyage.domain.user.entity.UserRole; -//import com.example.eightyage.domain.user.repository.UserBulkRepository; -//import org.junit.jupiter.api.Test; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.test.context.SpringBootTest; -//import org.springframework.test.context.ActiveProfiles; -// -//import java.util.ArrayList; -//import java.util.List; -// -//@SpringBootTest -//@ActiveProfiles("ci") -//public class UserBulkTest { -// -// @Autowired -// private UserBulkRepository userBulkRepository; -// -// @Test -// void 유저_데이터_백만건_생성() { -// -// int insertCount; -// -// if ("ci".equals(System.getProperty("spring.profiles.active"))) { -// insertCount = 100; // CI에서는 데이터 적게 -// } else { -// insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 -// } -// -// List batchList = new ArrayList<>(); -// -// for (int i = 0; i < insertCount; i++) { -// User user = User.builder() -// .email(i + "@email.com") -// .nickname("nickname" + i) -// .password("password") -// .userRole(UserRole.ROLE_USER) -// .build(); -// batchList.add(user); -// -// if (batchList.size() == insertCount) { -// userBulkRepository.bulkInsertUsers(batchList); -// batchList.clear(); -// +package com.example.eightyage.bulk; + +import com.example.eightyage.domain.user.entity.User; +import com.example.eightyage.domain.user.userrole.UserRole; +import com.example.eightyage.domain.user.repository.UserBulkRepository; +import com.example.eightyage.global.util.RandomCodeGenerator; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.ActiveProfiles; + +import java.util.ArrayList; +import java.util.List; + +@SpringBootTest +@ActiveProfiles("ci") +public class UserBulkTest { + + @Autowired + private UserBulkRepository userBulkRepository; + + @Test + void 유저_데이터_생성() { + + int insertCount; + + if ("ci".equals(System.getProperty("spring.profiles.active"))) { + insertCount = 100; // CI에서는 데이터 적게 + } else { + insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 + } + + List batchList = new ArrayList<>(); + + for (int i = 0; i < insertCount; i++) { + User user = User.builder() + .email(RandomCodeGenerator.generateCouponCode(8) + "@email.com") + .nickname("nickname" + i) + .password("password") + .userRole(UserRole.ROLE_USER) + .build(); + batchList.add(user); + + if (batchList.size() == insertCount) { + userBulkRepository.bulkInsertUsers(batchList); + batchList.clear(); + // sleep(500); -// } -// } -// -// if (!batchList.isEmpty()) { -// userBulkRepository.bulkInsertUsers(batchList); -// batchList.clear(); -// } -// } -// -// private static void sleep(int millis) { -// try { -// Thread.sleep(millis); -// } catch (InterruptedException e) { -// throw new RuntimeException(e); -// } -// } -//} + } + } + + if (!batchList.isEmpty()) { + userBulkRepository.bulkInsertUsers(batchList); + batchList.clear(); + } + } + + private static void sleep(int millis) { + try { + Thread.sleep(millis); + } catch (InterruptedException e) { + throw new RuntimeException(e); + } + } +} diff --git a/src/test/java/com/example/eightyage/domain/auth/service/AuthServiceTest.java b/src/test/java/com/example/eightyage/domain/auth/service/AuthServiceTest.java index c65ea01..7254b8e 100644 --- a/src/test/java/com/example/eightyage/domain/auth/service/AuthServiceTest.java +++ b/src/test/java/com/example/eightyage/domain/auth/service/AuthServiceTest.java @@ -4,7 +4,7 @@ import com.example.eightyage.domain.auth.dto.request.AuthSignupRequestDto; import com.example.eightyage.domain.auth.dto.response.AuthTokensResponseDto; import com.example.eightyage.domain.user.entity.User; -import com.example.eightyage.domain.user.entity.UserRole; +import com.example.eightyage.domain.user.userrole.UserRole; import com.example.eightyage.domain.user.service.UserService; import com.example.eightyage.global.exception.BadRequestException; import com.example.eightyage.global.exception.UnauthorizedException; diff --git a/src/test/java/com/example/eightyage/domain/auth/service/TokenServiceTest.java b/src/test/java/com/example/eightyage/domain/auth/service/TokenServiceTest.java index 584784f..455f169 100644 --- a/src/test/java/com/example/eightyage/domain/auth/service/TokenServiceTest.java +++ b/src/test/java/com/example/eightyage/domain/auth/service/TokenServiceTest.java @@ -3,7 +3,7 @@ import com.example.eightyage.domain.auth.entity.RefreshToken; import com.example.eightyage.domain.auth.repository.RefreshTokenRepository; import com.example.eightyage.domain.user.entity.User; -import com.example.eightyage.domain.user.entity.UserRole; +import com.example.eightyage.domain.user.userrole.UserRole; import com.example.eightyage.domain.user.service.UserService; import com.example.eightyage.global.exception.NotFoundException; import com.example.eightyage.global.exception.UnauthorizedException; diff --git a/src/test/java/com/example/eightyage/domain/user/service/UserServiceTest.java b/src/test/java/com/example/eightyage/domain/user/service/UserServiceTest.java index 8041ceb..e2fd5f7 100644 --- a/src/test/java/com/example/eightyage/domain/user/service/UserServiceTest.java +++ b/src/test/java/com/example/eightyage/domain/user/service/UserServiceTest.java @@ -2,7 +2,7 @@ import com.example.eightyage.domain.user.dto.request.UserDeleteRequestDto; import com.example.eightyage.domain.user.entity.User; -import com.example.eightyage.domain.user.entity.UserRole; +import com.example.eightyage.domain.user.userrole.UserRole; import com.example.eightyage.domain.user.repository.UserRepository; import com.example.eightyage.global.dto.AuthUser; import com.example.eightyage.global.exception.BadRequestException; diff --git a/src/test/resources/application-test.yml b/src/test/resources/application-test.yml index da95d4b..bb86911 100644 --- a/src/test/resources/application-test.yml +++ b/src/test/resources/application-test.yml @@ -7,10 +7,27 @@ spring: jpa: hibernate: - ddl-auto: create + ddl-auto: update properties: hibernate: show_sql: true format_sql: true use_sql_comments: true - dialect: org.hibernate.dialect.MySQLDialect \ No newline at end of file + dialect: org.hibernate.dialect.MySQLDialect + cloud: + aws: + credentials: + access-key: ${AWS_ACCESS_KEY} + secret-key: ${AWS_SECRET_KEY} + region: + static: ap-northeast-2 + s3: + bucket: my-gom-bucket + +aws: + credentials: + access-key: ${AWS_ACCESS_KEY} + secret-key: ${AWS_SECRET_KEY} + region: ap-northeast-2 + s3: + bucket: my-gom-bucket \ No newline at end of file From c2d30def3d05617a7f148b830ed479da54803a06 Mon Sep 17 00:00:00 2001 From: queenriwon Date: Fri, 28 Mar 2025 22:51:38 +0900 Subject: [PATCH 2/4] =?UTF-8?q?refactor(global):=20=EB=8D=94=EB=AF=B8?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=83=9D=EC=84=B1=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 수정한 것 - 더미데이터 랜덤수 생성을 리팩토링 --- src/test/java/com/example/eightyage/bulk/ProductBulkTest.java | 2 +- src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java | 2 +- src/test/java/com/example/eightyage/bulk/UserBulkTest.java | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java b/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java index 99df7d3..d7e35b9 100644 --- a/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java @@ -27,7 +27,7 @@ public class ProductBulkTest { int insertCount; if ("ci".equals(System.getProperty("spring.profiles.active"))) { - insertCount = 100; // CI에서는 데이터 적게 + insertCount = 0; // CI에서는 데이터 적게 } else { insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 } diff --git a/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java b/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java index 458d2c0..38ee354 100644 --- a/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java @@ -26,7 +26,7 @@ public class ReviewBulkTest { int insertCount; if ("ci".equals(System.getProperty("spring.profiles.active"))) { - insertCount = 100; // CI에서는 데이터 적게 + insertCount = 0; // CI에서는 데이터 적게 } else { insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 } diff --git a/src/test/java/com/example/eightyage/bulk/UserBulkTest.java b/src/test/java/com/example/eightyage/bulk/UserBulkTest.java index ae2799f..4a8c987 100644 --- a/src/test/java/com/example/eightyage/bulk/UserBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/UserBulkTest.java @@ -25,7 +25,7 @@ public class UserBulkTest { int insertCount; if ("ci".equals(System.getProperty("spring.profiles.active"))) { - insertCount = 100; // CI에서는 데이터 적게 + insertCount = 1; // CI에서는 데이터 적게 } else { insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 } From eff7f86c0e0a0a1e066c7481be858265b3933b77 Mon Sep 17 00:00:00 2001 From: queenriwon Date: Fri, 28 Mar 2025 23:11:50 +0900 Subject: [PATCH 3/4] =?UTF-8?q?refactor(global):=20=EB=8D=94=EB=AF=B8?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=83=9D=EC=84=B1=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 수정한 것 - 더미데이터 랜덤수 생성을 리팩토링 --- .../eightyage/bulk/ProductBulkTest.java | 140 +++++++++--------- .../eightyage/bulk/ReviewBulkTest.java | 130 ++++++++-------- .../example/eightyage/bulk/UserBulkTest.java | 130 ++++++++-------- 3 files changed, 200 insertions(+), 200 deletions(-) diff --git a/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java b/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java index d7e35b9..3d8c7db 100644 --- a/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java @@ -1,70 +1,70 @@ -package com.example.eightyage.bulk; - -import com.example.eightyage.domain.product.entity.Category; -import com.example.eightyage.domain.product.entity.Product; -import com.example.eightyage.domain.product.entity.SaleState; -import com.example.eightyage.domain.product.repository.ProductBulkRepository; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; -import java.util.UUID; - -@SpringBootTest -@ActiveProfiles("ci") -public class ProductBulkTest { - - @Autowired - private ProductBulkRepository productBulkRepository; - - @Test - void 제품_더미데이터_생성() { - - int insertCount; - - if ("ci".equals(System.getProperty("spring.profiles.active"))) { - insertCount = 0; // CI에서는 데이터 적게 - } else { - insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 - } - - Random random = new Random(); - - List batchList = new ArrayList<>(); - - for (int i = 0; i < insertCount; i++) { - Category randomCategory = Category.values()[random.nextInt(Category.values().length)]; - Product product = Product.builder() - .category(randomCategory) - .name(UUID.randomUUID().toString()) - .saleState(random.nextBoolean() ? SaleState.FOR_SALE : SaleState.SOLD_OUT) - .build(); - - batchList.add(product); - - if (batchList.size() == insertCount) { - productBulkRepository.bulkInsertProduct(batchList); - batchList.clear(); - - sleep(500); - } - } - - if (!batchList.isEmpty()) { - productBulkRepository.bulkInsertProduct(batchList); - batchList.clear(); - } - } - - private static void sleep(int millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } -} +//package com.example.eightyage.bulk; +// +//import com.example.eightyage.domain.product.entity.Category; +//import com.example.eightyage.domain.product.entity.Product; +//import com.example.eightyage.domain.product.entity.SaleState; +//import com.example.eightyage.domain.product.repository.ProductBulkRepository; +//import org.junit.jupiter.api.Test; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.ActiveProfiles; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Random; +//import java.util.UUID; +// +//@SpringBootTest +//@ActiveProfiles("ci") +//public class ProductBulkTest { +// +// @Autowired +// private ProductBulkRepository productBulkRepository; +// +// @Test +// void 제품_더미데이터_생성() { +// +// int insertCount; +// +// if ("ci".equals(System.getProperty("spring.profiles.active"))) { +// insertCount = 0; // CI에서는 데이터 적게 +// } else { +// insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 +// } +// +// Random random = new Random(); +// +// List batchList = new ArrayList<>(); +// +// for (int i = 0; i < insertCount; i++) { +// Category randomCategory = Category.values()[random.nextInt(Category.values().length)]; +// Product product = Product.builder() +// .category(randomCategory) +// .name(UUID.randomUUID().toString()) +// .saleState(random.nextBoolean() ? SaleState.FOR_SALE : SaleState.SOLD_OUT) +// .build(); +// +// batchList.add(product); +// +// if (batchList.size() == insertCount) { +// productBulkRepository.bulkInsertProduct(batchList); +// batchList.clear(); +// +// sleep(500); +// } +// } +// +// if (!batchList.isEmpty()) { +// productBulkRepository.bulkInsertProduct(batchList); +// batchList.clear(); +// } +// } +// +// private static void sleep(int millis) { +// try { +// Thread.sleep(millis); +// } catch (InterruptedException e) { +// throw new RuntimeException(e); +// } +// } +//} diff --git a/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java b/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java index 38ee354..2e7a9dd 100644 --- a/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java @@ -1,65 +1,65 @@ -package com.example.eightyage.bulk; - -import com.example.eightyage.domain.product.entity.Product; -import com.example.eightyage.domain.review.entity.Review; -import com.example.eightyage.domain.review.repository.ReviewBulkRepository; -import com.example.eightyage.domain.user.entity.User; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -import java.util.ArrayList; -import java.util.List; -import java.util.Random; - -@SpringBootTest -@ActiveProfiles("ci") -public class ReviewBulkTest { - - @Autowired - private ReviewBulkRepository reviewBulkRepository; - - @Test - void 리뷰_더미데이터_생성() { - - int insertCount; - - if ("ci".equals(System.getProperty("spring.profiles.active"))) { - insertCount = 0; // CI에서는 데이터 적게 - } else { - insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 - } - - Random random = new Random(); - List batchList = new ArrayList<>(); - - for (int i = 0; i < insertCount; i++) { - User user = User.builder().id(1L).build(); - Product product = new Product((long) (random.nextInt(100) + 1)); - - Review review = new Review(user, product, random.nextDouble() * 5, "content" + i); - batchList.add(review); - - if (batchList.size() == insertCount) { - reviewBulkRepository.bulkInsertReviews(batchList); - batchList.clear(); - -// sleep(500); - } - } - - if (!batchList.isEmpty()) { - reviewBulkRepository.bulkInsertReviews(batchList); - batchList.clear(); - } - } - - private static void sleep(int millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } -} +//package com.example.eightyage.bulk; +// +//import com.example.eightyage.domain.product.entity.Product; +//import com.example.eightyage.domain.review.entity.Review; +//import com.example.eightyage.domain.review.repository.ReviewBulkRepository; +//import com.example.eightyage.domain.user.entity.User; +//import org.junit.jupiter.api.Test; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.ActiveProfiles; +// +//import java.util.ArrayList; +//import java.util.List; +//import java.util.Random; +// +//@SpringBootTest +//@ActiveProfiles("ci") +//public class ReviewBulkTest { +// +// @Autowired +// private ReviewBulkRepository reviewBulkRepository; +// +// @Test +// void 리뷰_더미데이터_생성() { +// +// int insertCount; +// +// if ("ci".equals(System.getProperty("spring.profiles.active"))) { +// insertCount = 0; // CI에서는 데이터 적게 +// } else { +// insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 +// } +// +// Random random = new Random(); +// List batchList = new ArrayList<>(); +// +// for (int i = 0; i < insertCount; i++) { +// User user = User.builder().id(1L).build(); +// Product product = new Product((long) (random.nextInt(100) + 1)); +// +// Review review = new Review(user, product, random.nextDouble() * 5, "content" + i); +// batchList.add(review); +// +// if (batchList.size() == insertCount) { +// reviewBulkRepository.bulkInsertReviews(batchList); +// batchList.clear(); +// +//// sleep(500); +// } +// } +// +// if (!batchList.isEmpty()) { +// reviewBulkRepository.bulkInsertReviews(batchList); +// batchList.clear(); +// } +// } +// +// private static void sleep(int millis) { +// try { +// Thread.sleep(millis); +// } catch (InterruptedException e) { +// throw new RuntimeException(e); +// } +// } +//} diff --git a/src/test/java/com/example/eightyage/bulk/UserBulkTest.java b/src/test/java/com/example/eightyage/bulk/UserBulkTest.java index 4a8c987..98d40f8 100644 --- a/src/test/java/com/example/eightyage/bulk/UserBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/UserBulkTest.java @@ -1,65 +1,65 @@ -package com.example.eightyage.bulk; - -import com.example.eightyage.domain.user.entity.User; -import com.example.eightyage.domain.user.userrole.UserRole; -import com.example.eightyage.domain.user.repository.UserBulkRepository; -import com.example.eightyage.global.util.RandomCodeGenerator; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -import java.util.ArrayList; -import java.util.List; - -@SpringBootTest -@ActiveProfiles("ci") -public class UserBulkTest { - - @Autowired - private UserBulkRepository userBulkRepository; - - @Test - void 유저_데이터_생성() { - - int insertCount; - - if ("ci".equals(System.getProperty("spring.profiles.active"))) { - insertCount = 1; // CI에서는 데이터 적게 - } else { - insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 - } - - List batchList = new ArrayList<>(); - - for (int i = 0; i < insertCount; i++) { - User user = User.builder() - .email(RandomCodeGenerator.generateCouponCode(8) + "@email.com") - .nickname("nickname" + i) - .password("password") - .userRole(UserRole.ROLE_USER) - .build(); - batchList.add(user); - - if (batchList.size() == insertCount) { - userBulkRepository.bulkInsertUsers(batchList); - batchList.clear(); - -// sleep(500); - } - } - - if (!batchList.isEmpty()) { - userBulkRepository.bulkInsertUsers(batchList); - batchList.clear(); - } - } - - private static void sleep(int millis) { - try { - Thread.sleep(millis); - } catch (InterruptedException e) { - throw new RuntimeException(e); - } - } -} +//package com.example.eightyage.bulk; +// +//import com.example.eightyage.domain.user.entity.User; +//import com.example.eightyage.domain.user.userrole.UserRole; +//import com.example.eightyage.domain.user.repository.UserBulkRepository; +//import com.example.eightyage.global.util.RandomCodeGenerator; +//import org.junit.jupiter.api.Test; +//import org.springframework.beans.factory.annotation.Autowired; +//import org.springframework.boot.test.context.SpringBootTest; +//import org.springframework.test.context.ActiveProfiles; +// +//import java.util.ArrayList; +//import java.util.List; +// +//@SpringBootTest +//@ActiveProfiles("ci") +//public class UserBulkTest { +// +// @Autowired +// private UserBulkRepository userBulkRepository; +// +// @Test +// void 유저_데이터_생성() { +// +// int insertCount; +// +// if ("ci".equals(System.getProperty("spring.profiles.active"))) { +// insertCount = 1; // CI에서는 데이터 적게 +// } else { +// insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 +// } +// +// List batchList = new ArrayList<>(); +// +// for (int i = 0; i < insertCount; i++) { +// User user = User.builder() +// .email(RandomCodeGenerator.generateCouponCode(8) + "@email.com") +// .nickname("nickname" + i) +// .password("password") +// .userRole(UserRole.ROLE_USER) +// .build(); +// batchList.add(user); +// +// if (batchList.size() == insertCount) { +// userBulkRepository.bulkInsertUsers(batchList); +// batchList.clear(); +// +//// sleep(500); +// } +// } +// +// if (!batchList.isEmpty()) { +// userBulkRepository.bulkInsertUsers(batchList); +// batchList.clear(); +// } +// } +// +// private static void sleep(int millis) { +// try { +// Thread.sleep(millis); +// } catch (InterruptedException e) { +// throw new RuntimeException(e); +// } +// } +//} From 23f450048e2ce9615e1cb7c63af9e74061d7c41e Mon Sep 17 00:00:00 2001 From: queenriwon Date: Sat, 29 Mar 2025 04:39:02 +0900 Subject: [PATCH 4/4] =?UTF-8?q?refactor(global):=20=EB=8D=94=EB=AF=B8?= =?UTF-8?q?=EB=8D=B0=EC=9D=B4=ED=84=B0=20=EC=83=9D=EC=84=B1=20=EC=88=98?= =?UTF-8?q?=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ### 수정한 것 - 더미데이터 랜덤수 생성을 리팩토링 --- .../domain/product/repository/ProductBulkRepository.java | 7 ++----- .../domain/review/repository/ReviewBulkRepository.java | 8 +++----- .../java/com/example/eightyage/bulk/ProductBulkTest.java | 4 ++-- .../java/com/example/eightyage/bulk/ReviewBulkTest.java | 4 ++-- .../java/com/example/eightyage/bulk/UserBulkTest.java | 4 ++-- 5 files changed, 11 insertions(+), 16 deletions(-) diff --git a/src/main/java/com/example/eightyage/domain/product/repository/ProductBulkRepository.java b/src/main/java/com/example/eightyage/domain/product/repository/ProductBulkRepository.java index 272b3e8..64f1e61 100644 --- a/src/main/java/com/example/eightyage/domain/product/repository/ProductBulkRepository.java +++ b/src/main/java/com/example/eightyage/domain/product/repository/ProductBulkRepository.java @@ -20,13 +20,10 @@ public class ProductBulkRepository { public void bulkInsertProduct(List products) { String sql = "INSERT INTO product (category, name, sale_state) values (?, ?, ?)"; - Random random = new Random(); - jdbcTemplate.batchUpdate(sql, products, BATCH_SIZE, (ps, argument) -> { - Category randomCategory = Category.values()[random.nextInt(Category.values().length)]; - ps.setString(1, randomCategory.name()); + ps.setString(1, argument.getCategory().name()); ps.setString(2, argument.getName()); - ps.setString(3, random.nextBoolean() ? SaleState.FOR_SALE.name() : SaleState.SOLD_OUT.name()); + ps.setString(3, argument.getSaleState().name()); }); } } diff --git a/src/main/java/com/example/eightyage/domain/review/repository/ReviewBulkRepository.java b/src/main/java/com/example/eightyage/domain/review/repository/ReviewBulkRepository.java index 7b72dd5..c9bf85a 100644 --- a/src/main/java/com/example/eightyage/domain/review/repository/ReviewBulkRepository.java +++ b/src/main/java/com/example/eightyage/domain/review/repository/ReviewBulkRepository.java @@ -18,12 +18,10 @@ public class ReviewBulkRepository { public void bulkInsertReviews(List reviews) { String sql = "INSERT INTO review (user_id, product_id, score) values (?, ?, ?)"; - Random random = new Random(); - jdbcTemplate.batchUpdate(sql, reviews, BATCH_SIZE, (ps, argument) -> { - ps.setInt(1, 1); - ps.setInt(2, random.nextInt(1000) + 1); - ps.setDouble(3, random.nextDouble() * 5); + ps.setLong(1, argument.getUser().getId()); + ps.setLong(2, argument.getProduct().getId()); + ps.setDouble(3, argument.getScore()); }); } diff --git a/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java b/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java index 3d8c7db..810f73d 100644 --- a/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/ProductBulkTest.java @@ -27,7 +27,7 @@ // int insertCount; // // if ("ci".equals(System.getProperty("spring.profiles.active"))) { -// insertCount = 0; // CI에서는 데이터 적게 +// insertCount = 100; // CI에서는 데이터 적게 // } else { // insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 // } @@ -46,7 +46,7 @@ // // batchList.add(product); // -// if (batchList.size() == insertCount) { +// if (batchList.size() == insertCount / 100) { // productBulkRepository.bulkInsertProduct(batchList); // batchList.clear(); // diff --git a/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java b/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java index 2e7a9dd..9ecb4e1 100644 --- a/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/ReviewBulkTest.java @@ -26,7 +26,7 @@ // int insertCount; // // if ("ci".equals(System.getProperty("spring.profiles.active"))) { -// insertCount = 0; // CI에서는 데이터 적게 +// insertCount = 100; // CI에서는 데이터 적게 // } else { // insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 // } @@ -41,7 +41,7 @@ // Review review = new Review(user, product, random.nextDouble() * 5, "content" + i); // batchList.add(review); // -// if (batchList.size() == insertCount) { +// if (batchList.size() == insertCount / 100) { // reviewBulkRepository.bulkInsertReviews(batchList); // batchList.clear(); // diff --git a/src/test/java/com/example/eightyage/bulk/UserBulkTest.java b/src/test/java/com/example/eightyage/bulk/UserBulkTest.java index 98d40f8..51ec056 100644 --- a/src/test/java/com/example/eightyage/bulk/UserBulkTest.java +++ b/src/test/java/com/example/eightyage/bulk/UserBulkTest.java @@ -25,7 +25,7 @@ // int insertCount; // // if ("ci".equals(System.getProperty("spring.profiles.active"))) { -// insertCount = 1; // CI에서는 데이터 적게 +// insertCount = 100; // CI에서는 데이터 적게 // } else { // insertCount = 1000000; // 로컬, 개발 서버 등에서는 많게 // } @@ -41,7 +41,7 @@ // .build(); // batchList.add(user); // -// if (batchList.size() == insertCount) { +// if (batchList.size() == insertCount / 100) { // userBulkRepository.bulkInsertUsers(batchList); // batchList.clear(); //