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