Skip to content

Commit

Permalink
Merge pull request #284 from 6QuizOnTheBlock/be/feat/#283-revivalOfAOP
Browse files Browse the repository at this point in the history
refactoring: AOP μ†Œμƒ 및 μ–΄λ…Έν…Œμ΄μ…˜ μ»€μŠ€ν„°λ§ˆμ΄μ§• μž¬μž‘μ„±
  • Loading branch information
dalcheonroadhead authored May 12, 2024
2 parents 6102727 + a57568f commit f8e3dd0
Show file tree
Hide file tree
Showing 2 changed files with 120 additions and 113 deletions.
231 changes: 119 additions & 112 deletions backEnd/src/main/java/com/quiz/ourclass/global/config/AopConfig.java
Original file line number Diff line number Diff line change
@@ -1,112 +1,119 @@
//package com.quiz.ourclass.global.config;
//
//import com.quiz.ourclass.global.dto.ResultResponse;
//import jakarta.servlet.http.HttpServletRequest;
//import java.lang.reflect.Field;
//import java.lang.reflect.Modifier;
//import lombok.RequiredArgsConstructor;
//import lombok.extern.slf4j.Slf4j;
//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.springframework.http.ResponseEntity;
//import org.springframework.stereotype.Component;
//import org.springframework.web.context.request.RequestContextHolder;
//import org.springframework.web.context.request.ServletRequestAttributes;
//
//
///*
// * 컨트둀러 별 μ‹€ν–‰ μ‹œκ°„ 체크
// * */
//@Aspect
//@Component
//@RequiredArgsConstructor
//@Slf4j
//public class AopConfig {
//
// private double beforeTime = 0L;
// private double afterTime = 0L;
//
// @Pointcut("execution(* com..controller..*(..))")
// public void ControllerMethod() {
// }
//
// // 컨트둀러 λ‚΄μ˜ λͺ¨λ“  λ§€μ†Œλ“œμ— λŒ€ν•˜μ—¬ Logging을 μ‹€ν–‰ν•œλ‹€. λ‹€λ§Œ μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 λ§€μ†Œλ“œλŠ” μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.
// @Around("ControllerMethod() && !@annotation(com.quiz.ourclass.global.config.annotation.LogExclusion)")
// public Object logging(ProceedingJoinPoint pjp) throws Throwable {
// // μ‹œμž‘μ‹œκ°„ check
// beforeTime = System.currentTimeMillis();
// // request νŒŒλΌλ―Έν„° κ°’ κ°€μ Έμ˜€κΈ°
// Object[] args = pjp.getArgs();
// StringBuilder logMsg = new StringBuilder();
// // request κ°’ 확인
//
// log.info("-----------> REQUEST <Header>: {} \n <Body>: {}({}) ={}"
// , getHeaderDetail()
// , pjp.getSignature().getDeclaringTypeName()
// , pjp.getSignature().getName()
// , logMsg);
// // κ²°κ³Ό 확인
// ResponseEntity<ResultResponse<?>> result = (ResponseEntity<ResultResponse<?>>) pjp.proceed();
// // λμ‹œκ°„ check
// afterTime = System.currentTimeMillis();
// if (result != null) {
// log.info("-----------> RESPONSE : {}({}) = {} ({}ms)"
// , pjp.getSignature().getDeclaringTypeName(), pjp.getSignature().getName(),
// result.getBody().getData(),
// (afterTime - beforeTime) / 1000.0);
// }
// return result;
// }
//
// private String getObjectDetails(Object arg) {
// StringBuilder details = new StringBuilder();
// // νŒŒλΌλ―Έν„°μ˜ 클래슀 Reflection 을 λ“€κ³  μ™€μ„œ κ·Έ ν•„λ“œλ“€μ„ ν•˜λ‚˜ ν•˜λ‚˜ κΉŒλ³Έλ‹€.
// Field[] fields = arg.getClass().getDeclaredFields();
// for (Field field : fields) {
// // 식별 νƒ€μž…μ΄ 뭔지 ν™•μΈν•œλ‹€. private final μƒμˆ˜ μ„ μ–Έ μ‹œ ν™•μΈμ—μ„œ μ œμ™Έν•œλ‹€.
// // private final 멀버 λ³€μˆ˜λŠ” λ³΄μ•ˆμƒ 였λ₯˜κ°€ λ‚˜λ―€λ‘œ μƒλž΅ν•œλ‹€.
// int modifiers = field.getModifiers();
// if (Modifier.isPrivate(modifiers) && Modifier.isFinal(modifiers)) {
// continue;
// }
// // private 멀버 λ³€μˆ˜λ„ μ ‘κ·Ό ν•  수 μžˆλ„λ‘ ν—ˆμš©
// field.setAccessible(true);
// try {
// details.append((field.getName())).append("=");
// details.append((field.get(arg))).append(", ");
// } catch (IllegalAccessException e) {
// throw new RuntimeException("νŠΉμ • ν•„λ“œ 접근에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.", e);
// }
// }
//
// if (details.length() > 2) {
// details.setLength(details.length() - 2);
// }
//
// return details.toString();
// }
//
// // Header λ‚΄μš©μ„ ν™•μΈν•œλ‹€.
// private StringBuilder getHeaderDetail() {
//
// StringBuilder ans = new StringBuilder();
//
// ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
// if (attrs != null) {
// HttpServletRequest request = attrs.getRequest();
// ans.append(" μš”μ²­μ£Όμ†Œ: ").append(request.getRequestURL().toString())
// .append(" μš”μ²­Method: ").append(request.getMethod())
// .append(" IP μ£Όμ†Œ: ").append(request.getRemoteAddr());
//
//
// } else {
// System.out.println("No HTTP request details available");
// }
//
// return ans;
// }
//
//}
//
package com.quiz.ourclass.global.config;

import com.quiz.ourclass.global.dto.ResultResponse;
import jakarta.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.Modifier;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
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.springframework.http.ResponseEntity;
import org.springframework.stereotype.Component;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;


/*
* 컨트둀러 별 μ‹€ν–‰ μ‹œκ°„ 체크
* */
@Aspect
@Component
@RequiredArgsConstructor
@Slf4j
public class AopConfig {

private double beforeTime = 0L;
private double afterTime = 0L;

@Pointcut("execution(* com..controller..*(..))")
public void ControllerMethod() {
}

// 컨트둀러 λ‚΄μ˜ λͺ¨λ“  λ§€μ†Œλ“œμ— λŒ€ν•˜μ—¬ Logging을 μ‹€ν–‰ν•œλ‹€. λ‹€λ§Œ μ–΄λ…Έν…Œμ΄μ…˜μ΄ 뢙은 λ§€μ†Œλ“œλŠ” μ‹€ν–‰ν•˜μ§€ μ•ŠλŠ”λ‹€.
@Around("@annotation(com.quiz.ourclass.global.config.annotation.LogInclude)")
public Object logging(ProceedingJoinPoint pjp) throws Throwable {
// μ‹œμž‘μ‹œκ°„ check
beforeTime = System.currentTimeMillis();
// request νŒŒλΌλ―Έν„° κ°’ κ°€μ Έμ˜€κΈ°
Object[] args = pjp.getArgs();
StringBuilder logMsg = new StringBuilder();
// request κ°’ 확인
for (Object arg : args) {
logMsg.append(arg.getClass().getSimpleName()).append(" [");
logMsg.append(getObjectDetails(arg)).append("], ");
}
if (logMsg.length() > 2) {
logMsg.setLength(logMsg.length() - 2);
}

log.info("-----------> REQUEST <Header>: {} \n <Body>: {}({}) ={}"
, getHeaderDetail()
, pjp.getSignature().getDeclaringTypeName()
, pjp.getSignature().getName()
, logMsg);
// κ²°κ³Ό 확인
ResponseEntity<ResultResponse<?>> result = (ResponseEntity<ResultResponse<?>>) pjp.proceed();
// λμ‹œκ°„ check
afterTime = System.currentTimeMillis();
if (result != null) {
log.info("-----------> RESPONSE : {}({}) = {} ({}ms)"
, pjp.getSignature().getDeclaringTypeName(), pjp.getSignature().getName(),
result.getBody().getData(),
(afterTime - beforeTime) / 1000.0);
}
return result;
}

private String getObjectDetails(Object arg) {
StringBuilder details = new StringBuilder();
// νŒŒλΌλ―Έν„°μ˜ 클래슀 Reflection 을 λ“€κ³  μ™€μ„œ κ·Έ ν•„λ“œλ“€μ„ ν•˜λ‚˜ ν•˜λ‚˜ κΉŒλ³Έλ‹€.
Field[] fields = arg.getClass().getDeclaredFields();
for (Field field : fields) {
// 식별 νƒ€μž…μ΄ 뭔지 ν™•μΈν•œλ‹€. private final μƒμˆ˜ μ„ μ–Έ μ‹œ ν™•μΈμ—μ„œ μ œμ™Έν•œλ‹€.
// private final 멀버 λ³€μˆ˜λŠ” λ³΄μ•ˆμƒ 였λ₯˜κ°€ λ‚˜λ―€λ‘œ μƒλž΅ν•œλ‹€.
int modifiers = field.getModifiers();
if (Modifier.isPrivate(modifiers) && Modifier.isFinal(modifiers)) {
continue;
}
// private 멀버 λ³€μˆ˜λ„ μ ‘κ·Ό ν•  수 μžˆλ„λ‘ ν—ˆμš©
field.setAccessible(true);
try {
details.append((field.getName())).append("=");
details.append((field.get(arg))).append(", ");
} catch (IllegalAccessException e) {
throw new RuntimeException("νŠΉμ • ν•„λ“œ 접근에 μ‹€νŒ¨ν–ˆμŠ΅λ‹ˆλ‹€.", e);
}
}

if (details.length() > 2) {
details.setLength(details.length() - 2);
}

return details.toString();
}

// Header λ‚΄μš©μ„ ν™•μΈν•œλ‹€.
private StringBuilder getHeaderDetail() {

StringBuilder ans = new StringBuilder();

ServletRequestAttributes attrs = (ServletRequestAttributes) RequestContextHolder.getRequestAttributes();
if (attrs != null) {
HttpServletRequest request = attrs.getRequest();
ans.append(" μš”μ²­μ£Όμ†Œ: ").append(request.getRequestURL().toString())
.append(" μš”μ²­Method: ").append(request.getMethod())
.append(" IP μ£Όμ†Œ: ").append(request.getRemoteAddr());


} else {
System.out.println("No HTTP request details available");
}

return ans;
}

}

Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@

@Target({ElementType.METHOD}) // νƒ€κ²Ÿ λ‹¨μœ„ -> λ©”μ†Œλ“œ λ‹¨μœ„μ—λ§Œ μ–΄λ…Έν…Œμ΄μ…˜μ„ 뢙일 수 μžˆλ„λ‘
@Retention(RetentionPolicy.RUNTIME) // μ–΄λ…Έν…Œμ΄μ…˜μ΄ μ–Έμ œκΉŒμ§€ μœ νš¨ν• μ§€ μ„€μ • -> μ‹€ν–‰ κΈ°κ°„λ™μ•ˆ μœ μ§€ λ˜μ–΄μ•Ό 함.
public @interface LogExclusion {
public @interface LogInclude {
// Log 찍기 싫은 λ§€μ†Œλ“œμ—κ²Œ λΆ™μ΄λŠ” μ–΄λ…Έν…Œμ΄μ…˜
// ν•΄λ‹Ή μ–΄λ…Έν…Œμ΄μ…˜μ„ 뢙이면 λ‘œκ·Έκ°€ μ°νžˆμ§€ μ•ŠλŠ”λ‹€.
}

0 comments on commit f8e3dd0

Please sign in to comment.