Skip to content

Commit

Permalink
로컬 환경에서 구동
Browse files Browse the repository at this point in the history
  • Loading branch information
chs98412 committed Feb 11, 2024
1 parent ab40adf commit c4ca503
Show file tree
Hide file tree
Showing 24 changed files with 287 additions and 40 deletions.
Binary file modified .DS_Store
Binary file not shown.
3 changes: 3 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -35,3 +35,6 @@ out/

### VS Code ###
.vscode/


*.jar
2 changes: 1 addition & 1 deletion Dockerfile
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
FROM openjdk:11-jdk
ARG JAR_FILE=build/libs/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=test", "/app.jar"]
ENTRYPOINT ["java", "-jar", "/app.jar"]
1 change: 1 addition & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ dependencies {
implementation 'org.springframework.boot:spring-boot-starter-aop'
implementation 'io.github.resilience4j:resilience4j-spring-boot2:1.7.0'
implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
implementation 'org.redisson:redisson-spring-boot-starter:3.17.7'
}

tasks.named('test') {
Expand Down
Binary file removed build/libs/HappyScrolls-0.0.1-SNAPSHOT.jar
Binary file not shown.
Binary file added src/.DS_Store
Binary file not shown.
4 changes: 2 additions & 2 deletions src/main/java/com/HappyScrolls/batch/JobScheduler.java
Original file line number Diff line number Diff line change
Expand Up @@ -21,8 +21,8 @@ public class JobScheduler {
private final JobLauncher jobLauncher;
private final BatchConfig batchConfig;

@ExeTimer
@Scheduled(cron="0 10 * * * *")
// @ExeTimer
// @Scheduled(cron="0 10 * * * *")
public void runJob() throws NoSuchFieldException, NoSuchMethodException,IllegalAccessException{

Map<String, JobParameter> confMap = new HashMap<>();
Expand Down
11 changes: 11 additions & 0 deletions src/main/java/com/HappyScrolls/config/Redis/RedisCacheConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,12 @@
import org.springframework.cache.CacheManager;
import org.springframework.cache.annotation.CachingConfigurerSupport;
import org.springframework.cache.annotation.EnableCaching;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.cache.RedisCacheConfiguration;
import org.springframework.data.redis.cache.RedisCacheManager;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer;
import org.springframework.data.redis.serializer.RedisSerializationContext;
import org.springframework.data.redis.serializer.StringRedisSerializer;
Expand All @@ -33,6 +35,15 @@ public CacheManager cacheManager() {
.cacheDefaults(redisCacheConfiguration)
.build();
}
@Bean
public RedisTemplate<String, Object> redisTemplate() {
RedisTemplate<String, Object> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(cf);
redisTemplate.setKeySerializer(new StringRedisSerializer());
redisTemplate.setValueSerializer(new GenericJackson2JsonRedisSerializer());
return redisTemplate;
}



// @Override
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@
// this.replicaDataSourceNames = new ReplicaDataSourceNames(names);
// }
//
// @Override
//
// protected Object determineCurrentLookupKey() {
// final boolean isReadOnly = TransactionSynchronizationManager.isCurrentTransactionReadOnly();
// if (isReadOnly) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.HappyScrolls.config.elastic;

import java.util.List;

public interface ArticleDocCustomRepository {
List<ArticleDoc> find(String parameter);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
package com.HappyScrolls.config.elastic;

import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.functionscore.ScoreFunctionBuilders;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.data.elasticsearch.core.query.NativeSearchQuery;
import org.springframework.data.elasticsearch.core.query.NativeSearchQueryBuilder;
import org.elasticsearch.index.query.functionscore.FieldValueFactorFunctionBuilder;
import org.elasticsearch.index.query.functionscore.FunctionScoreQueryBuilder;
import org.springframework.stereotype.Component;
import org.springframework.stereotype.Repository;

import java.util.ArrayList;
import java.util.List;
import java.util.stream.Collectors;

@Repository
public class ArticleDocCustomRepositoryImpl implements ArticleDocCustomRepository {

@Autowired
private ElasticsearchOperations elasticsearchOperations;
@Override
public List<ArticleDoc> find(String parameter) {

// NativeSearchQueryBuilder queryBuilder = new NativeSearchQueryBuilder()
// .withQuery(
// QueryBuilders.functionScoreQuery(
// QueryBuilders.matchQuery("title", "부하테스트"),
// ScoreFunctionBuilders.fieldValueFactorFunction("view_count")
// .modifier(FieldValueFactorFunctionBuilder.DEFAULT_MODIFIER.LOG1P)
// .factor(1)
// ).boostMode(FunctionScoreQueryBuilder.DEFAULT_BOOST_MODE.MULTIPLY)
// );

BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
for (String term : inputList(parameter)) {
boolQueryBuilder.should(QueryBuilders.multiMatchQuery(term, "title", "body"));
}

FunctionScoreQueryBuilder functionScoreQueryBuilder = QueryBuilders.functionScoreQuery(
boolQueryBuilder,
ScoreFunctionBuilders.fieldValueFactorFunction("view_count")
.modifier(FieldValueFactorFunctionBuilder.DEFAULT_MODIFIER.LOG1P)
.factor(1)
).boostMode(FunctionScoreQueryBuilder.DEFAULT_BOOST_MODE.MULTIPLY);

NativeSearchQuery searchQuery = new NativeSearchQueryBuilder()
.withQuery(functionScoreQueryBuilder)
.build();
System.out.println(searchQuery.getQuery().toString());
return elasticsearchOperations.search(searchQuery, ArticleDoc.class).getSearchHits()
.stream()
.map(hit -> hit.getContent())
.collect(Collectors.toList());
}

public static List<String> inputList(String input) {
String[] words = input.split(" ");
List<String> combinations = new ArrayList<>();

for (int i = 0; i < words.length; i++) {
StringBuilder sb = new StringBuilder();
for (int j = i; j < words.length; j++) {
sb.append(words[j]);
combinations.add(sb.toString());
if (j != words.length) sb.append(" ");
}
}

return combinations;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.HappyScrolls.config.elastic;

import com.HappyScrolls.domain.article.entity.Article;
import com.HappyScrolls.domain.article.repository.ArticleCustomRepository;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
Expand All @@ -9,7 +10,7 @@
import java.util.List;
import java.util.Optional;

public interface ArticleDocRepository extends ElasticsearchRepository<ArticleDoc, Long>, CrudRepository<ArticleDoc, Long> {
public interface ArticleDocRepository extends ElasticsearchRepository<ArticleDoc, Long>, CrudRepository<ArticleDoc, Long>, ArticleDocCustomRepository {
List<ArticleDoc> findAllByTitle(String title);

List<ArticleDoc> findAllByTitleContaining(String title);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,9 @@
public class ElasticSearchConfig extends AbstractElasticsearchConfiguration {
@Override
public RestHighLevelClient elasticsearchClient() {
// http port 와 통신할 주소
ClientConfiguration configuration = ClientConfiguration.builder().connectedTo("localhost:9200").build();
ClientConfiguration configuration = ClientConfiguration.builder().connectedTo("localhost:9200")
.withBasicAuth("elastic", "changeme") // Add this line
.build();
return RestClients.create(configuration).rest();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -88,4 +88,9 @@ public List<Article> search(Long lastindex, Integer limit,String param) {

}

//로그인 한 유저가 작성한 게시글 페이징 조회
public List<Article> usersearch(Member member, Long lastindex, Integer limit) {
return articleRepository.usersearch(member,lastindex,limit);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -105,6 +105,9 @@ public ResponseEntity<List<ArticleDTO.ListResponse>> retrieveUserArticle(@Reques
return ResponseEntity.ok(articleService.userArticleRetrieve(email));
}




@ApiOperation(value = "게시글 작성")
@PostMapping("")
public ResponseEntity<Long> createArticle(@AuthenticationPrincipal Member member, @RequestBody ArticleDTO.Request request) {
Expand Down Expand Up @@ -132,4 +135,10 @@ public ResponseEntity<List<ArticleDTO.ListResponse>> search(@RequestParam Long l
return ResponseEntity.ok( articleService.search(lastindex,limit,param));
}

}
//로그인 한 유저가 작성한 게시글 페이징 조회
@GetMapping("/usersearch")
public ResponseEntity<List<ArticleDTO.ListResponse>> usersearch(@AuthenticationPrincipal Member member, @RequestParam Long lastindex, @RequestParam Integer limit){
return ResponseEntity.ok(articleService.usersearch(member,lastindex,limit));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,9 @@ public class ArticleDocController {
private ArticleService articleService;

@GetMapping("/elk")
public List<ArticleDoc> get() {
return articleDocRepository.findAllByTitle("제목20");
public ResponseEntity<List<ArticleDTO.ListResponse>> get(@RequestParam String parameter) {

return ResponseEntity.ok(ArticleDTO.ListResponse.toResponseDtoListFromArticleDocs(articleDocRepository.find(parameter)));
}

@Autowired
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.HappyScrolls.domain.article.repository;

import com.HappyScrolls.domain.article.entity.Article;
import com.HappyScrolls.domain.member.entity.Member;
import com.HappyScrolls.domain.tag.entity.Tag;

import java.time.LocalDate;
Expand All @@ -19,4 +20,6 @@ public interface ArticleCustomRepository {
List<Article> findByTagListPaging(Long lastindex, List<Tag> tags);

List<Article> search(Long lastindex, Integer limit, String param);

List<Article> usersearch(Member member, Long lastindex, Integer limit);
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.HappyScrolls.domain.article.repository;

import com.HappyScrolls.domain.article.entity.Article;
import com.HappyScrolls.domain.member.entity.Member;
import com.HappyScrolls.domain.tag.entity.ArticleTag;
import com.HappyScrolls.domain.tag.entity.Tag;
import com.querydsl.jpa.impl.JPAQueryFactory;
Expand Down Expand Up @@ -107,4 +108,16 @@ public List<Article> search(Long lastindex, Integer limit, String param) {
.limit(limit)
.fetch();
}

//로그인 한 유저가 작성한 게시글 페이징 조회
@Override
public List<Article> usersearch(Member memberA, Long lastindex, Integer limit) {
return jpaQueryFactory
.selectFrom(article)
.innerJoin(article.member, member)
.fetchJoin()
.where(article.member.eq(memberA),article.id.gt(lastindex))
.limit(limit)
.fetch();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,9 @@ public Long articleCreate(Member member, ArticleDTO.Request request) {
}

public ArticleDTO.DetailResponse articleRetrieve(Long id) {
return ArticleDTO.DetailResponse.toResponseDto(articleAdaptor.retrieveArticle(id));
Article article = articleAdaptor.retrieveArticle(id);
article.increaseViewCount();
return ArticleDTO.DetailResponse.toResponseDto(article);
}

public Long articleEdit(Member member, ArticleDTO.Edit request) {
Expand Down Expand Up @@ -137,4 +139,12 @@ public List<ArticleDTO.ListResponse> articleRetrievePaging(PageRequest pageReque

}

//로그인 한 유저가 작성한 게시글 페이징 조회
public List<ArticleDTO.ListResponse> usersearch(Member member, Long lastindex, Integer limit) {
return ArticleDTO.ListResponse.toResponseDtoList(articleAdaptor.usersearch(member,lastindex, limit));
}




}
Original file line number Diff line number Diff line change
Expand Up @@ -4,20 +4,27 @@
import com.HappyScrolls.domain.product.entity.Product;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Lock;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.Repository;
import org.springframework.data.repository.query.Param;

import javax.persistence.LockModeType;
import java.util.List;
import java.util.Optional;

public interface ProductRepository extends Repository<Product, Long> {

@Lock(LockModeType.PESSIMISTIC_WRITE)
//@Lock(LockModeType.PESSIMISTIC_WRITE)
Optional<Product> findById(Long id);

Product save(Product entity);

List<Product> findAll();

Product saveAndFlush(Product entity);

@Modifying(clearAutomatically = true, flushAutomatically = true)
@Query(value = "update Product p set p.quantity = p.quantity - 1 where p.id = :id")
void test(Long id);
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@
import com.HappyScrolls.domain.product.dto.ProductDTO;
import com.HappyScrolls.domain.product.entity.Product;
import com.HappyScrolls.domain.product.repository.ProductRepository;
import org.redisson.api.RLock;
import org.redisson.api.RedissonClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.transaction.Transactional;
import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class ProductService {
Expand All @@ -19,6 +22,9 @@ public class ProductService {
@Autowired
private ProductAdaptor productAdaptor;

@Autowired
private RedissonClient redissonClient;

public Long productCreate(ProductDTO.Request request) {
return productAdaptor.productCreate(request.toEntity());
}
Expand All @@ -33,11 +39,25 @@ public List<Long> productAllRetrieve() {


@Transactional
public synchronized void test() {
Product product= productRepository.findById(1l).get();
if (product.getQuantity() > 0) {
product.decreaseQuantity();
productRepository.saveAndFlush(product);
public void test(Long id) {
RLock lock = redissonClient.getLock(id.toString());

try {
lock.tryLock(10, 1, TimeUnit.SECONDS);

Product product= productRepository.findById(1l).get();
if (product.getQuantity() > 0) {
product.decreaseQuantity();
productRepository.saveAndFlush(product);
}
} catch (InterruptedException e) {
throw new RuntimeException(e);
} finally {
lock.unlock();
}
}
@Transactional
public void test2() {
productRepository.test(1l);
}
}
Loading

0 comments on commit c4ca503

Please sign in to comment.