spring core advanced : log trace - templete callback pattern
This commit is contained in:
@@ -0,0 +1,31 @@
|
||||
package com.example.advanced.app.v5;
|
||||
|
||||
import com.example.advanced.trace.callback.TraceCallback;
|
||||
import com.example.advanced.trace.callback.TraceTemplate;
|
||||
import com.example.advanced.trace.logtrace.LogTrace;
|
||||
import org.springframework.web.bind.annotation.GetMapping;
|
||||
import org.springframework.web.bind.annotation.RestController;
|
||||
|
||||
@RestController
|
||||
public class OrderControllerV5 {
|
||||
|
||||
private final OrderServiceV5 orderService;
|
||||
private final TraceTemplate template;
|
||||
|
||||
public OrderControllerV5(OrderServiceV5 orderService, LogTrace logTrace) {
|
||||
this.orderService = orderService;
|
||||
this.template = new TraceTemplate(logTrace);
|
||||
}
|
||||
|
||||
@GetMapping("/v5/request")
|
||||
public String request(String itemId) {
|
||||
|
||||
return template.execute("OrderController.request()", new TraceCallback<String>() {
|
||||
@Override
|
||||
public String call() {
|
||||
orderService.orderItem(itemId);
|
||||
return "ok";
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,34 @@
|
||||
package com.example.advanced.app.v5;
|
||||
|
||||
import com.example.advanced.trace.callback.TraceTemplate;
|
||||
import com.example.advanced.trace.logtrace.LogTrace;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
@Repository
|
||||
public class OrderRepositoryV5 {
|
||||
|
||||
private final TraceTemplate template;
|
||||
|
||||
public OrderRepositoryV5(LogTrace logTrace) {
|
||||
this.template = new TraceTemplate(logTrace);
|
||||
}
|
||||
|
||||
public void save(String itemId) {
|
||||
|
||||
template.execute("OrderRepository.save()", () -> {
|
||||
if (itemId.equals("ex")) {
|
||||
throw new IllegalStateException("예외 발생!");
|
||||
}
|
||||
sleep(1000);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
|
||||
private void sleep(int millis) {
|
||||
try {
|
||||
Thread.sleep(millis);
|
||||
} catch (InterruptedException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,25 @@
|
||||
package com.example.advanced.app.v5;
|
||||
|
||||
import com.example.advanced.trace.callback.TraceTemplate;
|
||||
import com.example.advanced.trace.logtrace.LogTrace;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
@Service
|
||||
public class OrderServiceV5 {
|
||||
|
||||
private final OrderRepositoryV5 orderRepository;
|
||||
private final TraceTemplate template;
|
||||
|
||||
public OrderServiceV5(OrderRepositoryV5 orderRepository, LogTrace logTrace) {
|
||||
this.orderRepository = orderRepository;
|
||||
this.template = new TraceTemplate(logTrace);
|
||||
}
|
||||
|
||||
public void orderItem(String itemId) {
|
||||
|
||||
template.execute("OrderService.orderItem()", () -> {
|
||||
orderRepository.save(itemId);
|
||||
return null;
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package com.example.advanced.trace.callback;
|
||||
|
||||
public interface TraceCallback<T> {
|
||||
T call();
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
package com.example.advanced.trace.callback;
|
||||
|
||||
import com.example.advanced.trace.TraceStatus;
|
||||
import com.example.advanced.trace.logtrace.LogTrace;
|
||||
|
||||
public class TraceTemplate {
|
||||
|
||||
private final LogTrace trace;
|
||||
|
||||
public TraceTemplate(LogTrace trace) {
|
||||
this.trace = trace;
|
||||
}
|
||||
|
||||
public <T> T execute(String message, TraceCallback<T> callback) {
|
||||
TraceStatus status = null;
|
||||
try {
|
||||
status = trace.begin(message);
|
||||
|
||||
T result = callback.call();
|
||||
|
||||
trace.end(status);
|
||||
return result;
|
||||
} catch (Exception e) {
|
||||
trace.exception(status, e);
|
||||
throw e;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,5 @@
|
||||
package com.example.advanced.trace.strategy.code.template;
|
||||
|
||||
public interface Callback {
|
||||
void call();
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package com.example.advanced.trace.strategy.code.template;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.junit.jupiter.api.Test;
|
||||
|
||||
@Slf4j
|
||||
public class TemplateCallbackTest {
|
||||
|
||||
/**
|
||||
* 템플릿 콜백 패턴
|
||||
*/
|
||||
@Test
|
||||
void callbackV1() {
|
||||
TimeLogTemplate template = new TimeLogTemplate();
|
||||
template.execute(new Callback() {
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직1 실행");
|
||||
}
|
||||
});
|
||||
template.execute(new Callback() {
|
||||
@Override
|
||||
public void call() {
|
||||
log.info("비즈니스 로직2 실행");
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@Test
|
||||
void callbackV2() {
|
||||
TimeLogTemplate template = new TimeLogTemplate();
|
||||
template.execute(() -> log.info("비즈니스 로직1 실행"));
|
||||
template.execute(() -> log.info("비즈니스 로직2 실행"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
package com.example.advanced.trace.strategy.code.template;
|
||||
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
|
||||
@Slf4j
|
||||
public class TimeLogTemplate {
|
||||
|
||||
public void execute(Callback callback) {
|
||||
long startTime = System.currentTimeMillis();
|
||||
// 비즈니스 로직 실행
|
||||
callback.call();
|
||||
long endTime = System.currentTimeMillis();
|
||||
long resultTime = endTime - startTime;
|
||||
log.info("resultTime={}", resultTime);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user