์จ๊ฐ ์์์ ๋ฐ์ด๋๋ ์๋น์ค ์ฅ์ ์ ๋น ๋ฅด๊ฒ ๋๋นํ๊ธฐ ์ํด Log๋ฅผ ์ ๋จ๊ฒจ์ผ ํ๋ค. ์ด์ฌํ (์์ ์ ์ด๋ผ๊ณ ์๊ฐํ๋) ์ฝ๋๋ฅผ ์์ฑํ๊ณ ํ ์คํธํด๋ ์ฅ์ ๊ฐ ๋ฐ์ํ ๊ฐ๋ฅ์ฑ์ ํญ์ ์๋ค. ์ฅ์ ๊ฐ ๋ ๊ณณ์ ํ์ ํ๊ณ ๋น ๋ฅด๊ฒ ๋์ํด์ ํผํด๋ฅผ ์ต์ํํด์ผ ํ๋ค. ์ด๋ฅผ ์ํด ํ๋ก๊ทธ๋จ ์ํ๋ฅผ ๋ชจ๋ํฐ๋งํ ์ ์๋ ์ ๋ณด๋ฅผ ๊ธฐ๋กํ๋ ๊ฒ์ ๋ก๊น ์ด๋ผ๊ณ ํ๋ค. ๋๋ slf4j ๋ก๊น ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ํจ์๊ฐ ์คํ๋๊ณ ๋๋ ๋ ๋ก๊ทธ๋ฅผ ์ฐ์ด ๋ณด๊ณ ์ AOP ๊ฐ๋ ์ ๊ณต๋ถํ๋ค.
์กฐ์ธ ํฌ์ธํธ๋ ์ถ์์ ์ธ ๊ฐ๋ ์ด๋ค. AOP๋ฅผ ์ ์ฉํ ์ ์๋ ๋ชจ๋ ์ง์ ์ด๋ผ ์๊ฐํ๋ฉด ๋๋ค. ์คํ๋ง AOP๋ ํ๋ก์ ๋ฐฉ์์ ์ฌ์ฉํ๋ฏ๋ก ์กฐ์ธ ํฌ์ธํธ๋ ํญ์ ๋ฉ์๋ ์คํ ์ง์ ์ผ๋ก ์ ํ๋๋ค.
์กฐ์ธ ํฌ์ธํธ ์ค์์ ์ด๋๋ฐ์ด์ค๊ฐ ์ ์ฉ๋ ์์น๋ฅผ ์ ๋ณํ๋ ๊ธฐ๋ฅ
ํน์ ์กฐ์ธ ํฌ์ธํธ์์ Aspect์ ์ํด ์ทจํด์ง๋ ์กฐ์น, Around(์ฃผ๋ณ), Before(์ ), After(ํ)์ ๊ฐ์ ๋ค์ํ ์ข ๋ฅ์ ์ด๋๋ฐ์ด์ค๊ฐ ์์
package hello.mentoring.aop;
import org.aspectj.lang.annotation.Pointcut;
public class Pointcuts {
@Pointcut("execution(* hello.mentoring..*.*(..))")
public void log() {}
@Pointcut("execution(* hello.mentoring.controller.*.*(..))")
public void controller() {}
@Pointcut("execution(* hello.mentoring.service.*.*(..))")
public void service() {}
@Pointcut("execution(* hello.mentoring.repository.*.*(..))")
public void repository() {}
}
์ฒ์์๋ ์๋น์ค ํจํค์ง์๋ง ๋ก๊ทธ๋ฅผ ๊ฑธ๊ณ ์ถ์๋๋ฐ, ์ปจํธ๋กค๋ฌ, ์๋น์ค, ๋ ํฌ์งํ ๋ฆฌ ๋ชจ๋ ๋ก๊ทธ๊ฐ ํ์ํ ๊ฒ ๊ฐ์์ ๋ค ๋ง๋ค์๋ค.
package hello.mentoring.aop;
import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.*;
import org.aspectj.lang.reflect.MethodSignature;
import org.springframework.stereotype.Component;
import java.io.*;
import java.lang.reflect.Method;
import java.util.Date;
@Slf4j
@Aspect
@Component
public class LogAop {
@Before("hello.mentoring.aop.Pointcuts.log()")
public void before(JoinPoint joinPoint) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
// ์กฐ์ธ๋๋ ๋ฉ์๋์ ๋ํ ์ค๋ช
log.info("[before] {}", joinPoint.getSignature());
Object[] args = joinPoint.getArgs();
for (Object arg: args) {
log.info("parameter value = {}", arg);
}
}
@AfterReturning(value="hello.mentoring.aop.Pointcuts.log()", returning = "result")
public void doRetutn(JoinPoint joinPoint, Object result) {
MethodSignature signature = (MethodSignature) joinPoint.getSignature();
Method method = signature.getMethod();
log.info("[return] {}", joinPoint.getSignature());
Object[] args = joinPoint.getArgs();
for (Object arg: args) {
log.info("parameter value = {}", arg);
}
}
@AfterThrowing(value="hello.mentoring.aop.Pointcuts.log()", throwing = "ex")
public void doThrowing(JoinPoint joinPoint, Exception ex) {
log.info("[ex] {} message={}", joinPoint.getSignature(), ex.getMessage());
}
}
๋ก๊ทธํ์ผ์ ์์ฑํ ๊ฒฝ๋ก๋ ํ์ผ ์ด๋ฆ์ properties์ ์ง์ ํ ์ ์๋ค.
#logging.file.path=/Users/jiho/Documents/Spring/file/
logging.file.name=log