From a21ba5240a1584a312b5de4ce92c3478ae33075a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EA=B9=80=EC=8A=B9=EC=A7=84?= Date: Mon, 4 Nov 2024 17:54:30 +0900 Subject: [PATCH] feat: remove rlock --- .../backend/aspect/DistributedLockAspect.java | 66 ------------------- .../backend/aspect/TransactionAspect.java | 18 ----- .../global/advice/GlobalErrorAdvice.java | 8 --- .../global/annotation/DistributedLock.java | 23 ------- .../DistributedLockUnavailableException.java | 9 --- .../template/service/ContributionService.java | 2 - .../backend/utils/CustomSpringELParser.java | 28 -------- 7 files changed, 154 deletions(-) delete mode 100644 backend/src/main/java/com/dragonguard/backend/aspect/DistributedLockAspect.java delete mode 100644 backend/src/main/java/com/dragonguard/backend/aspect/TransactionAspect.java delete mode 100644 backend/src/main/java/com/dragonguard/backend/global/annotation/DistributedLock.java delete mode 100644 backend/src/main/java/com/dragonguard/backend/global/exception/DistributedLockUnavailableException.java delete mode 100644 backend/src/main/java/com/dragonguard/backend/utils/CustomSpringELParser.java diff --git a/backend/src/main/java/com/dragonguard/backend/aspect/DistributedLockAspect.java b/backend/src/main/java/com/dragonguard/backend/aspect/DistributedLockAspect.java deleted file mode 100644 index 63cc482c..00000000 --- a/backend/src/main/java/com/dragonguard/backend/aspect/DistributedLockAspect.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.dragonguard.backend.aspect; - -import com.dragonguard.backend.global.annotation.DistributedLock; -import com.dragonguard.backend.global.exception.DistributedLockUnavailableException; -import com.dragonguard.backend.utils.CustomSpringELParser; - -import lombok.RequiredArgsConstructor; - -import org.aspectj.lang.ProceedingJoinPoint; -import org.aspectj.lang.annotation.Around; -import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.reflect.MethodSignature; -import org.redisson.api.RLock; -import org.redisson.api.RedissonClient; -import org.springframework.stereotype.Component; - -import java.lang.reflect.Method; - -/** - * @author 김승진 - * @description 레디스 분산락을 위한 aop - */ -@Aspect -@Component -@RequiredArgsConstructor -public class DistributedLockAspect { - private static final String REDISSON_LOCK_PREFIX = "LOCK:"; - - private final RedissonClient redissonClient; - private final TransactionAspect transactionAspect; - private final CustomSpringELParser customSpringELParser; - - @Around("@annotation(com.dragonguard.backend.global.annotation.DistributedLock)") - public Object lock(final ProceedingJoinPoint joinPoint) throws Throwable { - MethodSignature signature = (MethodSignature) joinPoint.getSignature(); - Method method = signature.getMethod(); - DistributedLock distributedLock = method.getAnnotation(DistributedLock.class); - - String key = - REDISSON_LOCK_PREFIX - + customSpringELParser.getDynamicValue( - signature.getParameterNames(), - joinPoint.getArgs(), - distributedLock.name()); - RLock rLock = redissonClient.getLock(key); - - try { - boolean available = - rLock.tryLock( - distributedLock.waitTime(), - distributedLock.leaseTime(), - distributedLock.timeUnit()); - if (!available) { - return false; - } - return transactionAspect.proceed(joinPoint); - } catch (InterruptedException e) { - throw new InterruptedException(); - } finally { - try { - rLock.unlock(); - } catch (DistributedLockUnavailableException ignored) { - } - } - } -} diff --git a/backend/src/main/java/com/dragonguard/backend/aspect/TransactionAspect.java b/backend/src/main/java/com/dragonguard/backend/aspect/TransactionAspect.java deleted file mode 100644 index 83034296..00000000 --- a/backend/src/main/java/com/dragonguard/backend/aspect/TransactionAspect.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.dragonguard.backend.aspect; - -import org.aspectj.lang.ProceedingJoinPoint; -import org.springframework.stereotype.Component; -import org.springframework.transaction.annotation.Propagation; -import org.springframework.transaction.annotation.Transactional; - -/** - * @author 김승진 - * @description 트랜잭션을 새로 만들어 aop 적용된 메서드를 실행하기 위한 클래스 - */ -@Component -public class TransactionAspect { - @Transactional(propagation = Propagation.REQUIRES_NEW) - public Object proceed(final ProceedingJoinPoint joinPoint) throws Throwable { - return joinPoint.proceed(); - } -} diff --git a/backend/src/main/java/com/dragonguard/backend/global/advice/GlobalErrorAdvice.java b/backend/src/main/java/com/dragonguard/backend/global/advice/GlobalErrorAdvice.java index 9f05a1b0..24628b52 100644 --- a/backend/src/main/java/com/dragonguard/backend/global/advice/GlobalErrorAdvice.java +++ b/backend/src/main/java/com/dragonguard/backend/global/advice/GlobalErrorAdvice.java @@ -1,7 +1,6 @@ package com.dragonguard.backend.global.advice; import com.dragonguard.backend.global.exception.CronjobException; -import com.dragonguard.backend.global.exception.DistributedLockUnavailableException; import com.dragonguard.backend.global.exception.EntityNotFoundException; import com.dragonguard.backend.global.exception.WebClientException; import com.fasterxml.jackson.databind.exc.MismatchedInputException; @@ -53,13 +52,6 @@ public ResponseEntity mismatchedInputException( .body(new ErrorResponse(e.getMessage())); } - @ExceptionHandler(DistributedLockUnavailableException.class) - public ResponseEntity distributedLockUnavailableException( - final DistributedLockUnavailableException e) { - return ResponseEntity.status(HttpStatus.BAD_REQUEST) - .body(new ErrorResponse(e.getMessage())); - } - @ExceptionHandler(InterruptedException.class) public ResponseEntity interruptedException(final InterruptedException e) { return ResponseEntity.status(HttpStatus.BAD_REQUEST) diff --git a/backend/src/main/java/com/dragonguard/backend/global/annotation/DistributedLock.java b/backend/src/main/java/com/dragonguard/backend/global/annotation/DistributedLock.java deleted file mode 100644 index 01cb14a0..00000000 --- a/backend/src/main/java/com/dragonguard/backend/global/annotation/DistributedLock.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.dragonguard.backend.global.annotation; - -import java.lang.annotation.ElementType; -import java.lang.annotation.Retention; -import java.lang.annotation.RetentionPolicy; -import java.lang.annotation.Target; -import java.util.concurrent.TimeUnit; - -/** - * @author 김승진 - * @description 분산락 적용 메서드에 붙일 어노테이션 - */ -@Target(ElementType.METHOD) -@Retention(RetentionPolicy.RUNTIME) -public @interface DistributedLock { - String name(); - - TimeUnit timeUnit() default TimeUnit.SECONDS; - - long waitTime() default 5L; - - long leaseTime() default 10L; -} diff --git a/backend/src/main/java/com/dragonguard/backend/global/exception/DistributedLockUnavailableException.java b/backend/src/main/java/com/dragonguard/backend/global/exception/DistributedLockUnavailableException.java deleted file mode 100644 index 26a3f7ad..00000000 --- a/backend/src/main/java/com/dragonguard/backend/global/exception/DistributedLockUnavailableException.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.dragonguard.backend.global.exception; - -public class DistributedLockUnavailableException extends IllegalStateException { - private static final String MESSAGE = "중복 요청으로 인해 요청을 처리할 수 없습니다."; - - public DistributedLockUnavailableException() { - super(MESSAGE); - } -} diff --git a/backend/src/main/java/com/dragonguard/backend/global/template/service/ContributionService.java b/backend/src/main/java/com/dragonguard/backend/global/template/service/ContributionService.java index 7c3e7d4c..d672aae9 100644 --- a/backend/src/main/java/com/dragonguard/backend/global/template/service/ContributionService.java +++ b/backend/src/main/java/com/dragonguard/backend/global/template/service/ContributionService.java @@ -1,7 +1,6 @@ package com.dragonguard.backend.global.template.service; import com.dragonguard.backend.domain.member.entity.Member; -import com.dragonguard.backend.global.annotation.DistributedLock; import com.dragonguard.backend.global.exception.EntityNotFoundException; import com.dragonguard.backend.global.template.entity.Contribution; import com.dragonguard.backend.global.template.mapper.ContributionMapper; @@ -20,7 +19,6 @@ public abstract class ContributionService private final ContributionRepository contributionRepository; private final ContributionMapper contributionMapper; - @DistributedLock(name = "#member.getGithubId().concat(#contributeType.name())") public void saveContribution( final Member member, final Integer contributionNum, diff --git a/backend/src/main/java/com/dragonguard/backend/utils/CustomSpringELParser.java b/backend/src/main/java/com/dragonguard/backend/utils/CustomSpringELParser.java deleted file mode 100644 index caed1efd..00000000 --- a/backend/src/main/java/com/dragonguard/backend/utils/CustomSpringELParser.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.dragonguard.backend.utils; - -import org.springframework.expression.ExpressionParser; -import org.springframework.expression.spel.standard.SpelExpressionParser; -import org.springframework.expression.spel.support.StandardEvaluationContext; -import org.springframework.stereotype.Component; - -/** - * @author 김승진 - * @description 어노테이션의 EL을 파싱해주는 유틸 클래스 - */ -@Component -public class CustomSpringELParser { - - private static final Integer START_INDEX = 0; - - public Object getDynamicValue( - final String[] parameterNames, final Object[] args, final String key) { - ExpressionParser parser = new SpelExpressionParser(); - StandardEvaluationContext context = new StandardEvaluationContext(); - - for (int i = START_INDEX; i < parameterNames.length; i++) { - context.setVariable(parameterNames[i], args[i]); - } - - return parser.parseExpression(key).getValue(context, Object.class); - } -}