diff --git a/src/main/java/com/HappyScrolls/config/DatabaseConfig.java b/src/main/java/com/HappyScrolls/config/DatabaseConfig.java index 6b3d2c9..e9d1394 100644 --- a/src/main/java/com/HappyScrolls/config/DatabaseConfig.java +++ b/src/main/java/com/HappyScrolls/config/DatabaseConfig.java @@ -1,72 +1,72 @@ -package com.HappyScrolls.config; - -import com.zaxxer.hikari.HikariDataSource; -import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.boot.autoconfigure.EnableAutoConfiguration; -import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; -import org.springframework.boot.context.properties.ConfigurationProperties; -import org.springframework.boot.context.properties.EnableConfigurationProperties; -import org.springframework.boot.jdbc.DataSourceBuilder; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Primary; -import org.springframework.data.jpa.repository.config.EnableJpaRepositories; -import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; -import org.springframework.transaction.annotation.EnableTransactionManagement; - -import javax.sql.DataSource; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static com.HappyScrolls.config.ReplicationRoutingDataSource.DATASOURCE_SOURCE_KEY; - - -@Configuration -@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) -@EnableTransactionManagement -@EnableConfigurationProperties(Replicas.class) -@EnableJpaRepositories(basePackages = {"com.HappyScrolls"}) -public class DatabaseConfig { - - private final Replicas replicas; - - public DatabaseConfig(Replicas replicas) { - this.replicas = replicas; - } - - @Bean - @ConfigurationProperties(prefix = "spring.datasource.hikari.source") - public DataSource sourceDataSource() { - return DataSourceBuilder.create().type(HikariDataSource.class).build(); - } - - @Bean - public Map replicaDataSources() { - return replicas.replicaDataSources(HikariDataSource.class); - } - - @Bean - public DataSource routingDataSource(@Qualifier("sourceDataSource") DataSource source, - @Qualifier("replicaDataSources") Map replicas) { - ReplicationRoutingDataSource routingDataSource = new ReplicationRoutingDataSource(); - - Map dataSources = new HashMap<>(); - dataSources.put(DATASOURCE_SOURCE_KEY, source); - dataSources.putAll(replicas); - - routingDataSource.setTargetDataSources(dataSources); - routingDataSource.setDefaultTargetDataSource(source); - List replicaDataSourceNames = new ArrayList<>(replicas.keySet()); - routingDataSource.setReplicaDataSourceNames(replicaDataSourceNames); - - return routingDataSource; - } - - @Primary - @Bean - public DataSource dataSource(@Qualifier("routingDataSource") DataSource routingDataSource) { - return new LazyConnectionDataSourceProxy(routingDataSource); - } -} \ No newline at end of file +//package com.HappyScrolls.config; +// +//import com.zaxxer.hikari.HikariDataSource; +//import org.springframework.beans.factory.annotation.Qualifier; +//import org.springframework.boot.autoconfigure.EnableAutoConfiguration; +//import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration; +//import org.springframework.boot.context.properties.ConfigurationProperties; +//import org.springframework.boot.context.properties.EnableConfigurationProperties; +//import org.springframework.boot.jdbc.DataSourceBuilder; +//import org.springframework.context.annotation.Bean; +//import org.springframework.context.annotation.Configuration; +//import org.springframework.context.annotation.Primary; +//import org.springframework.data.jpa.repository.config.EnableJpaRepositories; +//import org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy; +//import org.springframework.transaction.annotation.EnableTransactionManagement; +// +//import javax.sql.DataSource; +//import java.util.ArrayList; +//import java.util.HashMap; +//import java.util.List; +//import java.util.Map; +// +//import static com.HappyScrolls.config.ReplicationRoutingDataSource.DATASOURCE_SOURCE_KEY; +// +// +//@Configuration +//@EnableAutoConfiguration(exclude = {DataSourceAutoConfiguration.class}) +//@EnableTransactionManagement +//@EnableConfigurationProperties(Replicas.class) +//@EnableJpaRepositories(basePackages = {"com.HappyScrolls"}) +//public class DatabaseConfig { +// +// private final Replicas replicas; +// +// public DatabaseConfig(Replicas replicas) { +// this.replicas = replicas; +// } +// +// @Bean +// @ConfigurationProperties(prefix = "spring.datasource.hikari.source") +// public DataSource sourceDataSource() { +// return DataSourceBuilder.create().type(HikariDataSource.class).build(); +// } +// +// @Bean +// public Map replicaDataSources() { +// return replicas.replicaDataSources(HikariDataSource.class); +// } +// +// @Bean +// public DataSource routingDataSource(@Qualifier("sourceDataSource") DataSource source, +// @Qualifier("replicaDataSources") Map replicas) { +// ReplicationRoutingDataSource routingDataSource = new ReplicationRoutingDataSource(); +// +// Map dataSources = new HashMap<>(); +// dataSources.put(DATASOURCE_SOURCE_KEY, source); +// dataSources.putAll(replicas); +// +// routingDataSource.setTargetDataSources(dataSources); +// routingDataSource.setDefaultTargetDataSource(source); +// List replicaDataSourceNames = new ArrayList<>(replicas.keySet()); +// routingDataSource.setReplicaDataSourceNames(replicaDataSourceNames); +// +// return routingDataSource; +// } +// +// @Primary +// @Bean +// public DataSource dataSource(@Qualifier("routingDataSource") DataSource routingDataSource) { +// return new LazyConnectionDataSourceProxy(routingDataSource); +// } +//} \ No newline at end of file diff --git a/src/main/java/com/HappyScrolls/config/JwtRequestFilter.java b/src/main/java/com/HappyScrolls/config/JwtRequestFilter.java index 4d0f41b..fd677c9 100644 --- a/src/main/java/com/HappyScrolls/config/JwtRequestFilter.java +++ b/src/main/java/com/HappyScrolls/config/JwtRequestFilter.java @@ -49,7 +49,7 @@ protected void doFilterInternal(HttpServletRequest request, HttpServletResponse String email = jwtTokenUtil.getUid(token); - + System.out.println(email); Member member = memberService.memberFind(email); diff --git a/src/main/java/com/HappyScrolls/config/ReplicationRoutingDataSource.java b/src/main/java/com/HappyScrolls/config/ReplicationRoutingDataSource.java index aac30e0..1513a42 100644 --- a/src/main/java/com/HappyScrolls/config/ReplicationRoutingDataSource.java +++ b/src/main/java/com/HappyScrolls/config/ReplicationRoutingDataSource.java @@ -1,48 +1,48 @@ -package com.HappyScrolls.config; - -import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; -import org.springframework.transaction.support.TransactionSynchronizationManager; - -import java.util.List; - -public class ReplicationRoutingDataSource extends AbstractRoutingDataSource { - - public static final String DATASOURCE_SOURCE_KEY = "source"; - - private ReplicaDataSourceNames replicaDataSourceNames; - - public void setReplicaDataSourceNames(List names) { - this.replicaDataSourceNames = new ReplicaDataSourceNames(names); - } - - @Override - protected Object determineCurrentLookupKey() { - final boolean isReadOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly(); - if (isReadOnly) { - String nextReplicaDataSourceName = replicaDataSourceNames.getNextName(); - System.out.print("Using Replica DB Name : "); - System.out.println(nextReplicaDataSourceName); - - return nextReplicaDataSourceName; - } - System.out.println("Using Source DB"); - return DATASOURCE_SOURCE_KEY; - } - - public static class ReplicaDataSourceNames { - - private final List values; - private int counter = 0; - - public ReplicaDataSourceNames(List values) { - this.values = values; - } - - public String getNextName() { - if (counter == values.size()) { - counter = 0; - } - return values.get(counter++); - } - } -} +//package com.HappyScrolls.config; +// +//import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource; +//import org.springframework.transaction.support.TransactionSynchronizationManager; +// +//import java.util.List; +// +//public class ReplicationRoutingDataSource extends AbstractRoutingDataSource { +// +// public static final String DATASOURCE_SOURCE_KEY = "source"; +// +// private ReplicaDataSourceNames replicaDataSourceNames; +// +// public void setReplicaDataSourceNames(List names) { +// this.replicaDataSourceNames = new ReplicaDataSourceNames(names); +// } +// +// @Override +// protected Object determineCurrentLookupKey() { +// final boolean isReadOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly(); +// if (isReadOnly) { +// String nextReplicaDataSourceName = replicaDataSourceNames.getNextName(); +// System.out.print("Using Replica DB Name : "); +// System.out.println(nextReplicaDataSourceName); +// +// return nextReplicaDataSourceName; +// } +// System.out.println("Using Source DB"); +// return DATASOURCE_SOURCE_KEY; +// } +// +// public static class ReplicaDataSourceNames { +// +// private final List values; +// private int counter = 0; +// +// public ReplicaDataSourceNames(List values) { +// this.values = values; +// } +// +// public String getNextName() { +// if (counter == values.size()) { +// counter = 0; +// } +// return values.get(counter++); +// } +// } +//} diff --git a/src/main/java/com/HappyScrolls/entity/CommentEvent.java b/src/main/java/com/HappyScrolls/entity/CommentEvent.java index fb53891..e581fb2 100644 --- a/src/main/java/com/HappyScrolls/entity/CommentEvent.java +++ b/src/main/java/com/HappyScrolls/entity/CommentEvent.java @@ -9,13 +9,8 @@ @AllArgsConstructor public class CommentEvent { - private String category; - private String memberEmail; + private Comment parent; + private Comment child; - private String email; - - private Long refId; - - private String msg; } diff --git a/src/main/java/com/HappyScrolls/entity/Product.java b/src/main/java/com/HappyScrolls/entity/Product.java index 39b4b06..cb81f86 100644 --- a/src/main/java/com/HappyScrolls/entity/Product.java +++ b/src/main/java/com/HappyScrolls/entity/Product.java @@ -2,11 +2,10 @@ import lombok.*; +import org.springframework.data.annotation.Version; + +import javax.persistence.*; -import javax.persistence.Entity; -import javax.persistence.GeneratedValue; -import javax.persistence.GenerationType; -import javax.persistence.Id; @Entity @Builder @@ -25,4 +24,12 @@ public class Product { private Integer quantity; + +// @Version + private Long version; + public void decreaseQuantity() { + this.quantity -= 1; + } + + } diff --git a/src/main/java/com/HappyScrolls/repository/ProductRepository.java b/src/main/java/com/HappyScrolls/repository/ProductRepository.java index 7556067..8721976 100644 --- a/src/main/java/com/HappyScrolls/repository/ProductRepository.java +++ b/src/main/java/com/HappyScrolls/repository/ProductRepository.java @@ -2,6 +2,13 @@ import com.HappyScrolls.entity.Product; import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Lock; -public interface ProductRepository extends JpaRepository { +import javax.persistence.LockModeType; +import java.util.Optional; + +public interface ProductRepository extends JpaRepository { + + @Lock(LockModeType.PESSIMISTIC_WRITE) + Optional findById(Long id); } diff --git a/src/main/java/com/HappyScrolls/service/BuyService.java b/src/main/java/com/HappyScrolls/service/BuyService.java index 762760f..7152326 100644 --- a/src/main/java/com/HappyScrolls/service/BuyService.java +++ b/src/main/java/com/HappyScrolls/service/BuyService.java @@ -49,6 +49,8 @@ public List buyCreate(Member member, BuyDTO.RequestCart request) { } for (Cart cart : cartList) { + cart.getProduct().decreaseQuantity(); + Buy buy = new Buy(); buy.setCreateDate(LocalDateTime.now()); buy.setMember(member); @@ -57,6 +59,8 @@ public List buyCreate(Member member, BuyDTO.RequestCart request) { response.add(buy); } + + applicationEventPublisher.publishEvent(new BuyEvent(member,requirePoints,cartList));//어떻게테스트?? diff --git a/src/main/java/com/HappyScrolls/service/CommentService.java b/src/main/java/com/HappyScrolls/service/CommentService.java index 9f80e27..07d9faa 100644 --- a/src/main/java/com/HappyScrolls/service/CommentService.java +++ b/src/main/java/com/HappyScrolls/service/CommentService.java @@ -40,7 +40,7 @@ public Long commentChildCreate(Member member, CommentDTO.ChildRequest request) { commentRepository.save(makeComment); - applicationEventPublisher.publishEvent(new CommentEvent("test",parentComment.getMember().getEmail(), member.getEmail(), makeComment.getId(),"댓글생성이벤트" ));//어떻게테스트?? + applicationEventPublisher.publishEvent(new CommentEvent(parentComment,makeComment )); diff --git a/src/main/java/com/HappyScrolls/service/MemberService.java b/src/main/java/com/HappyScrolls/service/MemberService.java index 2a60409..e7b9b1d 100644 --- a/src/main/java/com/HappyScrolls/service/MemberService.java +++ b/src/main/java/com/HappyScrolls/service/MemberService.java @@ -32,7 +32,7 @@ public void test(BuyEvent event) { } @EventListener public void commentEvent(CommentEvent event) { - Member member = memberFind(event.getEmail()); + Member member = event.getChild().getMember(); member.increasePoint(77); memberRepository.save(member); } diff --git a/src/main/java/com/HappyScrolls/service/NotificationService.java b/src/main/java/com/HappyScrolls/service/NotificationService.java index e9de488..f0bfe12 100644 --- a/src/main/java/com/HappyScrolls/service/NotificationService.java +++ b/src/main/java/com/HappyScrolls/service/NotificationService.java @@ -25,13 +25,10 @@ public class NotificationService { @EventListener public void notificationCreate(CommentEvent event) { - Notification notification = Notification.builder().msg(event.getMsg()).refId(event.getRefId()).category(event.getCategory()).build(); - Member member = memberService.memberFind(event.getMemberEmail()); - Notification notification2 = Notification.builder().msg("포인트 추가되었음!").build(); - Member member2 = memberService.memberFind(event.getEmail()); + Notification notification = Notification.builder().msg("포인트가 지급되었습니다.").category("포인트").member(event.getParent().getMember()).build(); + + Notification notification2 = Notification.builder().msg("포인트 추가되었음!").member(event.getChild().getMember()).build(); - notification2.setMember(member2); - notification.setMember(member); notificationRepository.save(notification); notificationRepository.save(notification2); } diff --git a/src/main/java/com/HappyScrolls/service/ProductService.java b/src/main/java/com/HappyScrolls/service/ProductService.java index c3e4244..b269717 100644 --- a/src/main/java/com/HappyScrolls/service/ProductService.java +++ b/src/main/java/com/HappyScrolls/service/ProductService.java @@ -6,6 +6,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import javax.transaction.Transactional; import java.util.List; import java.util.NoSuchElementException; import java.util.stream.Collectors; @@ -32,4 +33,14 @@ public List productAllRetrieve() { return products.stream().map(product -> product.getId()).collect(Collectors.toList()); } + + + @Transactional + public synchronized void test() { + Product product= productRepository.findById(1l).get(); + if (product.getQuantity() > 0) { + product.decreaseQuantity(); + productRepository.saveAndFlush(product); + } + } } diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 0eb90d7..be7c5be 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -95,24 +95,8 @@ spring: username: root password: Chlgurtns98! -# datasource: -# hikari: -# source: -# username: root -# password: 1234 -# jdbc-url: jdbc:mysql://localhost:4000/happy -# replica: -# replica-List: -# - name: replica1 -# username: root -# password: 1234 -# jdbc-url: jdbc:mysql://localhost:4001/happy -# - name: replica2 -# username: root -# password: 1234 -# jdbc-url: jdbc:mysql://localhost:4002/happy ---- + @@ -164,17 +148,17 @@ spring: source: username: root password: 1234 - jdbc-url: jdbc:mysql://db-master:3306/happy + jdbc-url: jdbc:mysql://db-master:3306/test replica: replica-List: - name: replica1 username: root password: 1234 - jdbc-url: jdbc:mysql://db-slave:3306/happy + jdbc-url: jdbc:mysql://db-slave:3306/test - name: replica2 username: root password: 1234 - jdbc-url: jdbc:mysql://db-slave2:3306/happy + jdbc-url: jdbc:mysql://db-slave2:3306/test management: diff --git a/src/test/java/com/HappyScrolls/acceptance/ArticleTest.java b/src/test/java/com/HappyScrolls/acceptance/ArticleTest.java index a196a47..c05d130 100644 --- a/src/test/java/com/HappyScrolls/acceptance/ArticleTest.java +++ b/src/test/java/com/HappyScrolls/acceptance/ArticleTest.java @@ -34,6 +34,7 @@ import static org.springframework.security.test.web.reactive.server.SecurityMockServerConfigurers.csrf; import static org.springframework.security.test.web.servlet.setup.SecurityMockMvcConfigurers.springSecurity; import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get; +import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.post; import static org.springframework.test.web.servlet.result.MockMvcResultHandlers.print; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @@ -43,18 +44,20 @@ public class ArticleTest extends BaseIntegrationTest { private Long id; -@Autowired + private String tk="eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJ0ZXN0IiwiaWF0IjoxNjkzMTE0MDc3LCJleHAiOjE2OTMxNTAwNzcsInN1YiI6ImNoczk4NDEyQG5hdmVyLmNvbSIsIm5pY2tuYW1lIjoi7LWc7ZiB7IicIiwidWlkIjoiY2hzOTg0MTJAbmF2ZXIuY29tIiwicGxhdGZvcm0iOiJrYWthbyJ9.QdxfLJfNc4ueJ4oIkUB95Cuki8qTP4jV7AKlCqJRxRk"; + + @Autowired private Setup setup; @BeforeEach public void setup() { this.id=setup.saveArticle(); - + this.tk = setup.tk(); } + @Autowired + private ArticleRepository articleRepository; -private String tk; - // @BeforeEach // void setup() { // tk= jwtTokenUtil.generateToken("asd","1","qwe","awdwad"); @@ -96,4 +99,29 @@ public void setup() { resultActions .andExpect(status().isOk()); } + +// .contentType(MediaType.APPLICATION_JSON) +// .content(objectMapper.writeValueAsString(request))) + @Test + public void test() throws Exception { + + ArticleDTO.Request request = ArticleDTO.Request.builder().title("qwer").body("!@3").build(); + //when + ResultActions resultActions = mockMvc.perform(get("/notification") + .header("Authorization","Bearer "+tk) + .accept(MediaType.APPLICATION_JSON)) + .andDo(print()); + + + //then + resultActions + .andExpect(status().isOk()); + + + List
articles = articleRepository.findAll(); + for (Article article : articles) { + System.out.println(article); + System.out.println(article.getMember()); + } + } } diff --git a/src/test/java/com/HappyScrolls/acceptance/Setup.java b/src/test/java/com/HappyScrolls/acceptance/Setup.java index 3fbd024..3ebf60b 100644 --- a/src/test/java/com/HappyScrolls/acceptance/Setup.java +++ b/src/test/java/com/HappyScrolls/acceptance/Setup.java @@ -1,9 +1,11 @@ package com.HappyScrolls.acceptance; +import com.HappyScrolls.config.JwtTokenUtil; import com.HappyScrolls.dto.ArticleDTO; import com.HappyScrolls.entity.Article; import com.HappyScrolls.entity.Member; import com.HappyScrolls.repository.ArticleRepository; +import com.HappyScrolls.repository.MemberRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; @@ -11,11 +13,24 @@ public class Setup { @Autowired private ArticleRepository articleRepository; + Member member; + @Autowired + private MemberRepository memberRepository; + @Autowired + private JwtTokenUtil jwtTokenUtil; public Long saveArticle() { ArticleDTO.Request request = ArticleDTO.Request.builder().title("제목").body("내용").tags(null).build(); Article article = request.toEntity(); articleRepository.save(article); + + member = Member.builder().nickname("chs").point(100).email("@naver.com").build(); + memberRepository.save(member); + return article.getId(); } + + public String tk() { + return jwtTokenUtil.generateToken("aadw",member.getEmail(),member.getEmail(),"awd"); + } } \ No newline at end of file diff --git a/src/test/java/com/HappyScrolls/service/BuyServiceTest.java b/src/test/java/com/HappyScrolls/service/BuyServiceTest.java index 6433f58..8c6c47f 100644 --- a/src/test/java/com/HappyScrolls/service/BuyServiceTest.java +++ b/src/test/java/com/HappyScrolls/service/BuyServiceTest.java @@ -47,11 +47,13 @@ class BuyServiceTest { private ApplicationEventPublisher applicationEventPublisher; + + @Test void 구매_생성_성공() { String testEmail = "chs98412@naver,com"; Member member = Member.builder().id(1l).email(testEmail).nickname("hyuksoon").thumbnail("img").point(120).build(); - Product product1 = new Product(1l, "이름1", "내용1", 100,10); + Product product1 = Product.builder().price(100).price(100).build(); Cart cart1 = Cart.builder().id(1l).product(product1).member(member).build(); List carts = new ArrayList<>(); carts.add(1l); @@ -70,7 +72,7 @@ class BuyServiceTest { void 구매_생성_실패() { String testEmail = "chs98412@naver,com"; Member member = Member.builder().id(1l).email(testEmail).nickname("hyuksoon").thumbnail("img").point(100).build(); - Product product1 = new Product(1l, "이름1", "내용1", 120,10); + Product product1 = Product.builder().price(100).price(100).build(); Cart cart1 = Cart.builder().id(1l).product(product1).member(member).build(); List carts = new ArrayList<>(); carts.add(1l); diff --git a/src/test/java/com/HappyScrolls/service/CartServiceTest.java b/src/test/java/com/HappyScrolls/service/CartServiceTest.java index effa2f9..8fd5057 100644 --- a/src/test/java/com/HappyScrolls/service/CartServiceTest.java +++ b/src/test/java/com/HappyScrolls/service/CartServiceTest.java @@ -43,7 +43,7 @@ class CartServiceTest { void 장바구니_생성_성공() { Member member = Member.builder().id(1l).email("chs98412@naver,com").nickname("hyuksoon").thumbnail("img").build(); - Product product = new Product(1l, "이름", "내용", 100,10); + Product product = Product.builder().price(100).price(100).build(); CartDTO.Request request = CartDTO.Request.builder().productId(1l).build(); Cart cart = Cart.builder().product(product).member(member).build(); @@ -61,8 +61,8 @@ class CartServiceTest { String testEmail = "chs98412@naver,com"; Member member = Member.builder().id(1l).email(testEmail).nickname("hyuksoon").thumbnail("img").build(); - Product product1 = new Product(1l, "이름1", "내용1", 100,10); - Product product2 = new Product(2l, "이름2", "내용2", 100,10); + Product product1 = Product.builder().price(100).price(100).build(); + Product product2 = Product.builder().price(100).price(100).build(); Cart cart1 = Cart.builder().product(product1).member(member).build(); Cart cart2 = Cart.builder().product(product2).member(member).build(); @@ -94,7 +94,7 @@ class CartServiceTest { void 장바구니_단건조회_성공_테스트() { Member member = Member.builder().id(1l).email("email1").nickname("hyuksoon").thumbnail("img").build(); - Product product1 = new Product(1l, "이름1", "내용1", 100,10); + Product product1 = Product.builder().price(100).price(100).build(); Cart cart= Cart.builder().id(1l).product(product1).member(member).build(); diff --git a/src/test/java/com/HappyScrolls/service/DBTest.java b/src/test/java/com/HappyScrolls/service/DBTest.java new file mode 100644 index 0000000..1d1988f --- /dev/null +++ b/src/test/java/com/HappyScrolls/service/DBTest.java @@ -0,0 +1,84 @@ +package com.HappyScrolls.service; + +import com.HappyScrolls.dto.BuyDTO; +import com.HappyScrolls.entity.Buy; +import com.HappyScrolls.entity.Cart; +import com.HappyScrolls.entity.Member; +import com.HappyScrolls.entity.Product; +import com.HappyScrolls.exception.PointLackException; +import com.HappyScrolls.repository.BuyRepository; +import com.HappyScrolls.repository.ProductRepository; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import javax.persistence.OptimisticLockException; +import javax.transaction.Transactional; +import java.time.LocalDateTime; +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.CountDownLatch; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; + +import static org.assertj.core.api.Assertions.assertThat; +import static org.junit.jupiter.api.Assertions.assertThrows; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.when; + +@SpringBootTest +public class DBTest { + + @Autowired + private ProductRepository productRepository; + @Autowired + private ProductService productService; + + @BeforeEach + void setup() { + Product product1 = Product.builder().quantity(100).build(); + productRepository.save(product1); + } + + @Transactional + void serviceMethod() { + Product product= productRepository.findById(1l).get(); + if (product.getQuantity() > 0) { + product.decreaseQuantity(); + System.out.println(product.getVersion()); + productRepository.saveAndFlush(product); + } + } + @Test + void 정합성_테스트() throws InterruptedException{ + + int threadCount = 100; + ExecutorService executorService = Executors.newFixedThreadPool(32); + CountDownLatch latch = new CountDownLatch(threadCount); + + for (int i = 0; i < threadCount; i++) { + executorService.submit(() -> { + try { + productService.test(); + } catch (Exception e) { + System.out.println(e.getMessage()); + } finally { + latch.countDown(); + } + } + ); + } + latch.await(); + Product product= productRepository.findById(1l).get(); + System.out.println("Product Quantity: "+product.getQuantity()); + + assertThat(product.getQuantity()).isEqualTo(0); + } + + + +} diff --git a/src/test/java/com/HappyScrolls/service/ProductServiceTest.java b/src/test/java/com/HappyScrolls/service/ProductServiceTest.java index fa3055e..7eb9f62 100644 --- a/src/test/java/com/HappyScrolls/service/ProductServiceTest.java +++ b/src/test/java/com/HappyScrolls/service/ProductServiceTest.java @@ -53,7 +53,7 @@ class ProductServiceTest { @DisplayName("상품 단건 조회 기능이 제대로 동작하는지 확인") void 상품_단건조회_성공_테스트() { - Product product = new Product(1l, "이름", "내용", 100,10); + Product product = Product.builder().price(100).price(100).build(); when(productRepository.findById(any())).thenReturn(Optional.of(product)); @@ -79,9 +79,9 @@ class ProductServiceTest { @DisplayName("상품 전체 조회 기능이 제대로 동작하는지 확인") void 상품_전체조회_성공_테스트() { - Product product1 = new Product(1l, "이름1", "내용1", 100,10); - Product product2 = new Product(2l, "이름2", "내용2", 100,10); - Product product3 = new Product(3l, "이름3", "내용3", 100,10); + Product product1 = Product.builder().price(100).price(100).build(); + Product product2 = Product.builder().price(100).price(100).build(); + Product product3 = Product.builder().price(100).price(100).build(); List products = new ArrayList<>(); diff --git a/src/test/resources/application.yml b/src/test/resources/application.yml index 46fd2a5..2d17e71 100644 --- a/src/test/resources/application.yml +++ b/src/test/resources/application.yml @@ -1,7 +1,7 @@ spring: jpa: - show-sql: true + show-sql: false properties: hibernate: format_sql: true