스프링/스프링 핵심 원리 - 고급편

6. V2 파라미터로 동기화

sdafdq 2024. 1. 14. 17:49

전문

@Slf4j
@Component
public class HelloTraceV2 {
    private static final String START_PREFIX = "-->";
    private static final String COMPLETE_PREFIX = "<--";
    private static final String EX_PREFIX = "<X-";
    public TraceStatus begin(String message){
        TraceId traceId = new TraceId();
        Long startTimeMs = System.currentTimeMillis();
        log.info("[{}] {}{}", traceId.getId(), addSpace(START_PREFIX, traceId.getLevel()), message);

        return new TraceStatus(traceId, startTimeMs, message);
    }

    public TraceStatus beginSync(TraceId beforeTraceId, String message){
        TraceId nextId = beforeTraceId.createNextId();
        Long startTimeMs = System.currentTimeMillis();
        log.info("[{}] {}{}", nextId.getId(), addSpace(START_PREFIX, nextId.getLevel()), message);

        return new TraceStatus(nextId, startTimeMs, message);
    }

    public void end(TraceStatus status){
        complete(status, null);
    }

    public void exception(TraceStatus status, Exception e){
        complete(status, e);
    }

    private void complete(TraceStatus status, Exception e){
        Long stopTimeMs = System.currentTimeMillis();
        long resultTimeMs = stopTimeMs - status.getStartTimeMs();
        TraceId traceId = status.getTraceId();

        if(e == null){
            log.info("[{}] {}{} time={}ms", traceId.getId(), addSpace(COMPLETE_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs);
        }else{
            log.info("[{}] {}{} time={}ms ex={}", traceId.getId(), addSpace(EX_PREFIX, traceId.getLevel()), status.getMessage(), resultTimeMs, e.toString());
        }
    }

    private static String addSpace(String prefix, int level){
        StringBuilder sb = new StringBuilder();
        for(int i = 0; i< level; i++){
            sb.append((i==level - 1) ? "|" + prefix : "|   ");
        }
        return sb.toString();
    }

}

 

추가된 건,

public TraceStatus beginSync(TraceId beforeTraceId, String message){
    TraceId nextId = beforeTraceId.createNextId();
    Long startTimeMs = System.currentTimeMillis();
    log.info("[{}] {}{}", nextId.getId(), addSpace(START_PREFIX, nextId.getLevel()), message);

    return new TraceStatus(nextId, startTimeMs, message);
}

이 부분.

 

createNextId로 레벨을 올린다.

 

public TraceId createNextId(){
    return new TraceId(id, level + 1);
}

 

 

 

테스트

@Test
void begin_end(){
    HelloTraceV2 trace = new HelloTraceV2();
    TraceStatus status1 = trace.begin("hello");
    TraceStatus status2 = trace.beginSync(status1.getTraceId(), "hello2");

    trace.end(status2);
    trace.end(status1);
}

 

 

 

일일히 인자로 넣어줘야 하는게 불편하긴 함.

 

대충 컨트롤러 빼고 다 status 인자로 준 다음에,

그 인자로 받은 메소드 측에서 beginSync 할 듯

 

 

 

 

'스프링 > 스프링 핵심 원리 - 고급편' 카테고리의 다른 글

8. V2 정리  (0) 2024.01.14
7. V2 적용  (0) 2024.01.14
5. 로그 추적기 적용  (0) 2024.01.14
4. 로그추적기 V1 프로토타입  (0) 2024.01.05
3. 요구사항 분석  (0) 2024.01.05