From 95c5eff79a496d0974d7844505f526017c298d6c Mon Sep 17 00:00:00 2001 From: jhan0121 Date: Mon, 5 Jan 2026 22:38:43 +0900 Subject: [PATCH 1/2] =?UTF-8?q?fix:=20=EB=B0=B0=ED=8F=AC=20=EC=8A=A4?= =?UTF-8?q?=ED=81=AC=EB=A6=BD=ED=8A=B8=20=EC=98=A4=EB=A5=98=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 --- .github/workflows/deploy-prod.yml | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/.github/workflows/deploy-prod.yml b/.github/workflows/deploy-prod.yml index 3c4ae4f..30c2061 100644 --- a/.github/workflows/deploy-prod.yml +++ b/.github/workflows/deploy-prod.yml @@ -42,8 +42,11 @@ jobs: java-version: '21' distribution: 'corretto' + - name: Gradle Wrapper 실행 권한 부여 + run: chmod +x ./gradlew + - name: JAR 빌드 - run: ./gradlew bootJar --no-daemon + run: ./gradlew bootJar --no-daemon --stacktrace -Dspring.profiles.active=prod - name: Docker Hub 로그인 run: echo "${{ secrets.DOCKER_ACCESS_TOKEN }}" | docker login -u "${{ secrets.DOCKER_USERNAME }}" --password-stdin From 6aeecdd55c0f5767c809abf2e77d1ada87f2e6c8 Mon Sep 17 00:00:00 2001 From: jhan0121 Date: Mon, 5 Jan 2026 22:39:04 +0900 Subject: [PATCH 2/2] =?UTF-8?q?fix:=20trace=20=EC=97=B0=EA=B2=B0=20?= =?UTF-8?q?=EB=AC=B8=EC=A0=9C=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../common/log/ControllerLoggingAspect.java | 7 +--- .../common/log/LoggingPointcuts.java | 22 ++++++++++++ .../common/trace/TracingAspect.java | 36 +++++++++++++++++++ 3 files changed, 59 insertions(+), 6 deletions(-) create mode 100644 src/main/java/com/recyclestudy/common/log/LoggingPointcuts.java create mode 100644 src/main/java/com/recyclestudy/common/trace/TracingAspect.java diff --git a/src/main/java/com/recyclestudy/common/log/ControllerLoggingAspect.java b/src/main/java/com/recyclestudy/common/log/ControllerLoggingAspect.java index 62d7e91..5a6f1ad 100644 --- a/src/main/java/com/recyclestudy/common/log/ControllerLoggingAspect.java +++ b/src/main/java/com/recyclestudy/common/log/ControllerLoggingAspect.java @@ -7,7 +7,6 @@ import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; -import org.aspectj.lang.annotation.Pointcut; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.stereotype.Component; import org.springframework.web.context.request.RequestContextHolder; @@ -20,11 +19,7 @@ public class ControllerLoggingAspect { private static final int MAX_LOG_LENGTH = 500; - @Pointcut("execution(* com.recyclestudy..controller..*(..))") - public void controllerMethods() { - } - - @Around("controllerMethods()") + @Around("LoggingPointcuts.controllerLayer()") public Object logController(final ProceedingJoinPoint joinPoint) throws Throwable { final MethodSignature signature = (MethodSignature) joinPoint.getSignature(); final String className = signature.getDeclaringType().getSimpleName(); diff --git a/src/main/java/com/recyclestudy/common/log/LoggingPointcuts.java b/src/main/java/com/recyclestudy/common/log/LoggingPointcuts.java new file mode 100644 index 0000000..39d2b97 --- /dev/null +++ b/src/main/java/com/recyclestudy/common/log/LoggingPointcuts.java @@ -0,0 +1,22 @@ +package com.recyclestudy.common.log; + +import org.aspectj.lang.annotation.Pointcut; + +public class LoggingPointcuts { + + @Pointcut("execution(* com.recyclestudy..controller..*(..))") + public void controllerLayer() { + } + + @Pointcut("execution(* com.recyclestudy..service..*(..))") + public void serviceLayer() { + } + + @Pointcut("execution(* com.recyclestudy..repository..*(..))") + public void repositoryLayer() { + } + + @Pointcut("controllerLayer() || serviceLayer() || repositoryLayer()") + public void applicationLayers() { + } +} diff --git a/src/main/java/com/recyclestudy/common/trace/TracingAspect.java b/src/main/java/com/recyclestudy/common/trace/TracingAspect.java new file mode 100644 index 0000000..dc2d266 --- /dev/null +++ b/src/main/java/com/recyclestudy/common/trace/TracingAspect.java @@ -0,0 +1,36 @@ +package com.recyclestudy.common.trace; + +import io.opentelemetry.api.trace.Span; +import io.opentelemetry.api.trace.Tracer; +import io.opentelemetry.context.Scope; +import lombok.RequiredArgsConstructor; +import org.aspectj.lang.ProceedingJoinPoint; +import org.aspectj.lang.annotation.Around; +import org.aspectj.lang.annotation.Aspect; +import org.springframework.core.Ordered; +import org.springframework.core.annotation.Order; +import org.springframework.stereotype.Component; + +@Aspect +@Component +@RequiredArgsConstructor +@Order(Ordered.HIGHEST_PRECEDENCE) +public class TracingAspect { + + private final Tracer tracer; + + @Around("com.recyclestudy.common.log.LoggingPointcuts.applicationLayers()") + public Object trace(ProceedingJoinPoint joinPoint) throws Throwable { + String className = joinPoint.getSignature().getDeclaringType().getSimpleName(); + String methodName = joinPoint.getSignature().getName(); + + String spanName = className + "::" + methodName; + Span span = tracer.spanBuilder(spanName).startSpan(); + + try (Scope scope = span.makeCurrent()) { + return joinPoint.proceed(); + } finally { + span.end(); + } + } +}