Skip to content

Commit

Permalink
feat: Circuit Breaker 적용 - #211
Browse files Browse the repository at this point in the history
  • Loading branch information
Dh3356 committed Oct 4, 2024
1 parent 93d1477 commit 6596915
Show file tree
Hide file tree
Showing 5 changed files with 149 additions and 2 deletions.
Original file line number Diff line number Diff line change
@@ -1,13 +1,16 @@
package org.mju_likelion.festival.booth.service;

import static org.mju_likelion.festival.common.config.Resilience4jConfig.REDIS_CIRCUIT_BREAKER;
import static org.mju_likelion.festival.common.exception.type.ErrorType.BOOTH_DEPARTMENT_NOT_FOUND_ERROR;
import static org.mju_likelion.festival.common.exception.type.ErrorType.BOOTH_NOT_FOUND_ERROR;
import static org.mju_likelion.festival.common.exception.type.ErrorType.NOT_BOOTH_OWNER_ERROR;
import static org.mju_likelion.festival.common.exception.type.ErrorType.NOT_EVENT_BOOTH_ERROR;

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.mju_likelion.festival.admin.domain.Admin;
import org.mju_likelion.festival.admin.service.AdminQueryService;
import org.mju_likelion.festival.booth.domain.Booth;
Expand All @@ -24,13 +27,15 @@
import org.mju_likelion.festival.booth.dto.response.SimpleBoothResponse;
import org.mju_likelion.festival.booth.dto.response.SimpleBoothResponses;
import org.mju_likelion.festival.booth.util.qr.manager.BoothQrManager;
import org.mju_likelion.festival.common.circuit_breaker.FallBackUtil;
import org.mju_likelion.festival.common.exception.BadRequestException;
import org.mju_likelion.festival.common.exception.ForbiddenException;
import org.mju_likelion.festival.common.exception.NotFoundException;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

@Slf4j
@Service
@RequiredArgsConstructor
@Transactional(readOnly = true)
Expand All @@ -49,7 +54,17 @@ public List<BoothAffiliationResponse> getBoothAffiliations() {
}

@Cacheable(value = "simpleBooths", key = "#affiliationId")
@CircuitBreaker(name = REDIS_CIRCUIT_BREAKER, fallbackMethod = "getBoothsFallback")
public SimpleBoothResponses getBooths(final UUID affiliationId) {
return getBoothsLogic(affiliationId);
}

public SimpleBoothResponses getBoothsFallback(final UUID affiliationId, final Exception e) {
FallBackUtil.handleFallBack(e);
return getBoothsLogic(affiliationId);
}

private SimpleBoothResponses getBoothsLogic(final UUID affiliationId) {
validateBoothDepartment(affiliationId);

List<SimpleBooth> simpleBooths = boothQueryRepository.findAllSimpleBoothByAffiliationId(
Expand All @@ -63,12 +78,39 @@ public SimpleBoothResponses getBooths(final UUID affiliationId) {
}

@Cacheable(value = "boothDetail", key = "#id")
@CircuitBreaker(name = REDIS_CIRCUIT_BREAKER, fallbackMethod = "getBoothFallback")
public BoothDetailResponse getBooth(final UUID id) {
return getBoothLogic(id);
}

public BoothDetailResponse getBoothFallback(final UUID id, final Exception e) {
FallBackUtil.handleFallBack(e);
return getBoothLogic(id);
}

private BoothDetailResponse getBoothLogic(final UUID id) {
return BoothDetailResponse.from(getExistingBoothDetail(id));
}

@Cacheable(value = "boothManagingDetail", key = "#boothId + ' : ' + #boothAdminId")
public BoothManagingDetailResponse getBoothManagingDetail(final UUID boothId,
@CircuitBreaker(name = REDIS_CIRCUIT_BREAKER, fallbackMethod = "getBoothManagingDetailFallback")
public BoothManagingDetailResponse getBoothManagingDetail(
final UUID boothId,
final UUID boothAdminId) {

return getBoothManagingDetailLogic(boothId, boothAdminId);
}

public BoothManagingDetailResponse getBoothManagingDetailFallback(
final UUID boothId,
final UUID boothAdminId,
final Exception e) {

FallBackUtil.handleFallBack(e);
return getBoothManagingDetailLogic(boothId, boothAdminId);
}

private BoothManagingDetailResponse getBoothManagingDetailLogic(final UUID boothId,
final UUID boothAdminId) {
validateBoothExistence(boothId);
adminQueryService.validateAdminExistence(boothAdminId);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,8 @@
package org.mju_likelion.festival.booth.service;

import static org.mju_likelion.festival.common.config.Resilience4jConfig.REDIS_CIRCUIT_BREAKER;

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.mju_likelion.festival.admin.domain.Admin;
Expand All @@ -9,6 +12,7 @@
import org.mju_likelion.festival.booth.dto.request.UpdateBoothRequest;
import org.mju_likelion.festival.booth.util.qr.BoothQrStrategy;
import org.mju_likelion.festival.booth.util.qr.manager.BoothQrManager;
import org.mju_likelion.festival.common.circuit_breaker.FallBackUtil;
import org.mju_likelion.festival.user.domain.User;
import org.mju_likelion.festival.user.service.UserQueryService;
import org.springframework.cache.annotation.CacheEvict;
Expand Down Expand Up @@ -44,11 +48,30 @@ public void visitBooth(
}

@CacheEvict(value = "boothDetail", key = "#boothId")
@CircuitBreaker(name = REDIS_CIRCUIT_BREAKER, fallbackMethod = "updateBoothFallback")
public void updateBooth(
final UUID boothId,
final UpdateBoothRequest updateBoothRequest,
final UUID boothAdminId) {

updateBoothLogic(boothId, updateBoothRequest, boothAdminId);
}

public void updateBoothFallback(
final UUID boothId,
final UpdateBoothRequest updateBoothRequest,
final UUID boothAdminId,
final Exception e) {

FallBackUtil.handleFallBack(e);
updateBoothLogic(boothId, updateBoothRequest, boothAdminId);
}

public void updateBoothLogic(
final UUID boothId,
final UpdateBoothRequest updateBoothRequest,
final UUID boothAdminId) {

Admin admin = adminQueryService.getExistingAdmin(boothAdminId);
Booth booth = boothQueryService.getExistingBooth(boothId);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package org.mju_likelion.festival.lost_item.service;

import static org.mju_likelion.festival.common.config.Resilience4jConfig.REDIS_CIRCUIT_BREAKER;
import static org.mju_likelion.festival.common.exception.type.ErrorType.LOST_ITEM_NOT_FOUND_ERROR;
import static org.mju_likelion.festival.common.exception.type.ErrorType.PAGE_OUT_OF_BOUND_ERROR;

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import java.util.List;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.mju_likelion.festival.common.circuit_breaker.FallBackUtil;
import org.mju_likelion.festival.common.enums.SortOrder;
import org.mju_likelion.festival.common.exception.NotFoundException;
import org.mju_likelion.festival.lost_item.domain.LostItem;
Expand Down Expand Up @@ -59,7 +62,17 @@ public SimpleLostItemsResponse searchLostItems(
}

@Cacheable(value = "lostItem", key = "#lostItemId")
@CircuitBreaker(name = REDIS_CIRCUIT_BREAKER, fallbackMethod = "getLostItemFallback")
public LostItemDetailResponse getLostItem(final UUID lostItemId) {
return getLostItemLogic(lostItemId);
}

public LostItemDetailResponse getLostItemFallback(final UUID lostItemId, final Exception e) {
FallBackUtil.handleFallBack(e);
return getLostItemLogic(lostItemId);
}

private LostItemDetailResponse getLostItemLogic(final UUID lostItemId) {
validateLostItemExistence(lostItemId);
LostItemDetail lostItemDetail = lostItemQueryRepository.findLostItemDetailById(lostItemId);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,14 @@
package org.mju_likelion.festival.lost_item.service;

import static org.mju_likelion.festival.common.config.Resilience4jConfig.REDIS_CIRCUIT_BREAKER;
import static org.mju_likelion.festival.common.util.null_handler.NullHandler.doIfNotNull;

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import java.util.UUID;
import lombok.RequiredArgsConstructor;
import org.mju_likelion.festival.admin.domain.Admin;
import org.mju_likelion.festival.admin.service.AdminQueryService;
import org.mju_likelion.festival.common.circuit_breaker.FallBackUtil;
import org.mju_likelion.festival.image.domain.Image;
import org.mju_likelion.festival.lost_item.domain.LostItem;
import org.mju_likelion.festival.lost_item.domain.repository.LostItemJpaRepository;
Expand Down Expand Up @@ -42,11 +45,30 @@ public void createLostItem(
}

@CacheEvict(value = "lostItem", key = "#lostItemId")
@CircuitBreaker(name = REDIS_CIRCUIT_BREAKER, fallbackMethod = "updateLostItemFallback")
public void updateLostItem(
final UUID lostItemId,
final UpdateLostItemRequest updateLostItemRequest,
final UUID studentCouncilId) {

updateLostItemLogic(lostItemId, updateLostItemRequest, studentCouncilId);
}

public void updateLostItemFallback(
final UUID lostItemId,
final UpdateLostItemRequest updateLostItemRequest,
final UUID studentCouncilId,
final Exception e) {

FallBackUtil.handleFallBack(e);
updateLostItemLogic(lostItemId, updateLostItemRequest, studentCouncilId);
}

private void updateLostItemLogic(
final UUID lostItemId,
final UpdateLostItemRequest updateLostItemRequest,
final UUID studentCouncilId) {

LostItem lostItem = lostItemQueryService.getExistLostItem(lostItemId);
adminQueryService.validateAdminExistence(studentCouncilId);

Expand All @@ -55,12 +77,31 @@ public void updateLostItem(
lostItemJpaRepository.save(lostItem);
}

@CacheEvict(value = "lostItem", key = "#lostItemId")
@CacheEvict(value = "lostItem", key = "#lostItemId", beforeInvocation = true)
@CircuitBreaker(name = REDIS_CIRCUIT_BREAKER, fallbackMethod = "foundLostItemFallback")
public void foundLostItem(
final UUID lostItemId,
final LostItemFoundRequest lostItemFoundRequest,
final UUID studentCouncilId) {

foundLostItemLogic(lostItemId, lostItemFoundRequest, studentCouncilId);
}

public void foundLostItemFallback(
final UUID lostItemId,
final LostItemFoundRequest lostItemFoundRequest,
final UUID studentCouncilId,
final Exception e) {

FallBackUtil.handleFallBack(e);
foundLostItemLogic(lostItemId, lostItemFoundRequest, studentCouncilId);
}

public void foundLostItemLogic(
final UUID lostItemId,
final LostItemFoundRequest lostItemFoundRequest,
final UUID studentCouncilId) {

LostItem lostItem = lostItemQueryService.getExistLostItem(lostItemId);
adminQueryService.validateAdminExistence(studentCouncilId);

Expand All @@ -70,7 +111,21 @@ public void foundLostItem(
}

@CacheEvict(value = "lostItem", key = "#lostItemId")
@CircuitBreaker(name = REDIS_CIRCUIT_BREAKER, fallbackMethod = "deleteLostItemFallback")
public void deleteLostItem(final UUID lostItemId, final UUID studentCouncilId) {
deleteLostItemLogic(lostItemId, studentCouncilId);
}

public void deleteLostItemFallback(
final UUID lostItemId,
final UUID studentCouncilId,
final Exception e) {

FallBackUtil.handleFallBack(e);
deleteLostItemLogic(lostItemId, studentCouncilId);
}

private void deleteLostItemLogic(final UUID lostItemId, final UUID studentCouncilId) {
LostItem lostItem = lostItemQueryService.getExistLostItem(lostItemId);
adminQueryService.validateAdminExistence(studentCouncilId);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,15 @@
package org.mju_likelion.festival.term.service;

import static org.mju_likelion.festival.common.config.Resilience4jConfig.REDIS_CIRCUIT_BREAKER;

import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.UUID;
import java.util.stream.Collectors;
import lombok.RequiredArgsConstructor;
import org.mju_likelion.festival.common.circuit_breaker.FallBackUtil;
import org.mju_likelion.festival.common.exception.BadRequestException;
import org.mju_likelion.festival.common.exception.type.ErrorType;
import org.mju_likelion.festival.term.domain.Term;
Expand All @@ -25,7 +29,17 @@ public class TermQueryService {
private final TermJpaRepository termJpaRepository;

@Cacheable(value = "terms")
@CircuitBreaker(name = REDIS_CIRCUIT_BREAKER, fallbackMethod = "getTermsFallback")
public List<TermResponse> getTerms() {
return getTermsLogic();
}

public List<TermResponse> getTermsFallback(final Exception e) {
FallBackUtil.handleFallBack(e);
return getTermsLogic();
}

private List<TermResponse> getTermsLogic() {
return termQueryRepository.findTermsByOrderBySequenceAsc().stream()
.map(TermResponse::of)
.collect(Collectors.toList());
Expand Down

0 comments on commit 6596915

Please sign in to comment.