Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
Tags
- JDBC
- Proxy
- 그리디
- 인프런
- spring
- AOP
- 김영한
- Spring Boot
- Greedy
- 스프링 핵심 기능
- kotlin
- Servlet
- 백준
- JPQL
- springdatajpa
- SpringBoot
- Thymeleaf
- transaction
- db
- Exception
- QueryDSL
- 알고리즘
- Android
- java
- 스프링 핵심 원리
- jpa
- pointcut
- 자바
- 스프링
- http
Archives
- Today
- Total
개발자되기 프로젝트
Template CallBack - 2 본문
1. Callback
public interface TraceCallback<T> {
T call();
}
2. TraceTemplate
- TraceTemplate 는 템플릿 역할을 한다.
- execute(..) 를 보면 message 데이터와 콜백인 TraceCallback callback 을 전달 받는다.
- <T> 제네릭을 사용했다. 반환 타입을 정의한다.
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;
}
}
}
3. Controller V5
@RestController //@Controller +@ResponseBody
//@RequiredArgsConstructor
public class OrderControllerV5 {
private final OrderServiceV5 orderService;
private final TraceTemplate traceTemplate;
public OrderControllerV5(OrderServiceV5 orderService, LogTrace trace) {
this.orderService = orderService;
this.traceTemplate = new TraceTemplate(trace);
}
@GetMapping("/v5/request")
public String request(String itemId){
return traceTemplate.execute("OrderController.request()", new TraceCallback<>() {
@Override
public String call() {
orderService.orderItem(itemId);
return "ok";
}
});
}
}
- this.template = new TraceTemplate(trace)
- trace 의존관계 주입을 받으면서 필요한 TraceTemplate 템플릿을 생성한다.
- 참고로 TraceTemplate 를 처음부터 스프링 빈으로 등록하고 주입받아도 된다. 이 부분은 선택이다.
- template.execute(.., new TraceCallback(){..})
- 템플릿을 실행하면서 콜백을 전달한다.
- 여기서는 콜백으로 익명 내부 클래스를 사용했다.
4. ServiceV5
@Service
public class OrderServiceV5 {
private final OrderRepositoryV5 orderRepository;
private final TraceTemplate template;
public OrderServiceV5(OrderRepositoryV5 orderRepository, LogTrace trace) {
this.orderRepository = orderRepository;
this.template = new TraceTemplate(trace);
}
public void orderItem(String itemId){
template.execute("OrderService.orderItem()", () -> {
orderRepository.save(itemId);
return null;
});
}
}
- template.execute(.., new TraceCallback(){..}) : 템플릿을 실행하면서 콜백을 전달한다.
- 여기서는 콜백으로 람다를 전달했다.
5. RepositoryV5
@Repository
public class OrderRepositoryV5 {
private final TraceTemplate template;
public OrderRepositoryV5(LogTrace trace) {
this.template = new TraceTemplate(trace);
}
public void save(String itemId){
template.execute("OrderRepository.save()", () ->{
if (itemId.equals("ex")){
throw new IllegalStateException("예외 발생");
}
sleep(1000);
return "ok";
});
}
private void sleep(int millis) {
try {
Thread.sleep(millis);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
6. GitHub : 211122 Template Callback2
'인프런 > [인프런] 스프링 핵심 원리 - 고급' 카테고리의 다른 글
Proxy Pattern - V1 (0) | 2021.11.23 |
---|---|
정리 및 한계 (0) | 2021.11.23 |
Template CallBack - 1 (0) | 2021.11.22 |
Template CallBack - 시작 (0) | 2021.11.22 |
Strategy Pattern - 3 (0) | 2021.11.22 |
Comments